Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

Странное поведение 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
15-1191529956
sdubaruhnul
2007-10-05 00:32
2007.10.28
Так кто-нибудь объяснит, почему ветки про спутник закрывают?


2-1191784004
Альберт
2007-10-07 23:06
2007.10.28
потоки


2-1191759736
Антон Шестаков
2007-10-07 16:22
2007.10.28
связать DBComboBox с базой


2-1191493300
F@T@L_Err0r
2007-10-04 14:21
2007.10.28
изменение разрешения


2-1191258890
Riply
2007-10-01 21:14
2007.10.28
Получение информации о способе открытия файла по его Handle.