Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];

Вниз

Странное поведение BDS 2006   Найти похожие ветки 

 
infom ©   (2007-09-28 15:15) [0]

Поймал странные глюк BDS 2006.
Приведенный ниже код просто отказывается адекватно работать. Почему-то при дебаггинге строка перед finally проскакивается программой.
Причем если убрать комментарии с try finally end, все работает прекрасно.
function MDACInstalled: Boolean;
var Version, PrimaryVer:string;
   DVer:integer;
begin
 with TRegistry.Create do
 begin
//    try
   RootKey := HKEY_LOCAL_MACHINE;
   Result := OpenKey("Software\Microsoft\DataAccess", false);
   if not Result then
   begin
     Free;
     Exit;
   end;
   Version := ReadString("Version");
   PrimaryVer := Version[1]+Version[3];
   DVer := StrToInt(PrimaryVer);
   Result := (DVer > 26);
//    finally
     Free;
     Result := False;
//    end;

 end;
end;


Если есть возможность попробуйте откомпилить и проверить данную процедурку...


 
DVM ©   (2007-09-28 15:21) [1]

D2007, BDS2006 у меня ок все


 
Инс ©   (2007-09-28 15:24) [2]

Оптимизатор справедливо полагает, что результату всегда присваивается false и пропускает ненужную по его точки зрения строку.


 
Инс ©   (2007-09-28 15:26) [3]

Вот так сделайте:

function MDACInstalled: Boolean;
var Version, PrimaryVer:string;
  DVer:integer;
begin
Result:=false;
with TRegistry.Create do
begin
try
  RootKey := HKEY_LOCAL_MACHINE;
  Result := OpenKey("Software\Microsoft\DataAccess", false);
  if not Result then
  begin
    Free;
    Exit;
  end;
  Version := ReadString("Version");
  PrimaryVer := Version[1]+Version[3];
  DVer := StrToInt(PrimaryVer);
  Result := (DVer > 26);
finally
    Free;
end;
end;
end;


 
infom ©   (2007-09-28 15:27) [4]

> [2] Инс ©   (28.09.07 15:24)

Интересно а на каком основании он полагает Оптимизатор справедливо полагает, что результату всегда присваивается false ?


 
Инс ©   (2007-09-28 15:27) [5]

Даже вру. Один Free у вас лишний.
if not Result then Exit - смело. Блок fynally выполнится в любом случае - это называется локальная раскрутка стека.


 
infom ©   (2007-09-28 15:28) [6]

> [3] Инс ©   (28.09.07 15:26)

Как сделать так чтобы работало вопрос не стоит, меня инетересовало что происходит и как таких вещей в дальнейшем избежать


 
Инс ©   (2007-09-28 15:30) [7]


> infom ©   (28.09.07 15:27) [4]

Потому что блок fynally выполняется в любом случае, независимо от того, было исключение или нет. Даже если вы закомментируете try..finally..end, результат функции очевиден - после первого присвоения false присваивается в любом случае. Только комментировать этот блок не надо, по вашему коду может оказаться, что результат и вовсе не определен.


 
Инс ©   (2007-09-28 15:32) [8]

Ваш случай аналогичен следующему.

procedure TForm1.Button1Click(Sender: TObject);
var
 a: Integer;
begin
 a:=3; // *
 a:=5;
 Caption:=IntToStr(a);
end;

Строчку со * компилятор при включенном оптимизаторе пропустит. По понятным причинам. Смысла в ней ноль.


 
Anatoly Podgoretsky ©   (2007-09-28 15:35) [9]

> Инс  (28.09.2007 15:26:03)  [3]

Должна быть ошибка, поскольку двойное удаление, первый free надо убрать


 
Инс ©   (2007-09-28 15:36) [10]


> Anatoly Podgoretsky ©   (28.09.07 15:35) [9]

Да, я в [5] поправился.


 
infom ©   (2007-09-28 15:39) [11]

> [8] Инс ©   (28.09.07 15:32)

Ясно, большое спасибо.


 
Anatoly Podgoretsky ©   (2007-09-28 15:45) [12]

> Инс  (28.09.2007 15:36:10)  [10]

Это я потом увидел, работаю через NNTP


 
Инс ©   (2007-09-28 15:49) [13]


> Это я потом увидел, работаю через NNTP

Да ничего, спасибо за поправку, хуже от нее не будет, повторение мать учения...



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.058 c
2-1191921383
BOBik
2007-10-09 13:16
2007.10.28
Visible


1-1187035237
timself
2007-08-14 00:00
2007.10.28
Приблема с RichEdit ...


2-1191850673
webpauk
2007-10-08 17:37
2007.10.28
Преобразование типов


15-1190892322
Ega23
2007-09-27 15:25
2007.10.28
Что в редакторе кода означает


3-1182325808
msc32
2007-06-20 11:50
2007.10.28
IN (....)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский