Главная страница
    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.47 MB
Время: 0.059 c
6-1172819387
zap8
2007-03-02 10:09
2007.10.28
Дата создания принятого файла по сети


11-1174741130
ElectriC
2007-03-24 15:58
2007.10.28
Ошибка KOL


11-1175206803
nester
2007-03-30 02:20
2007.10.28
БагРепорт: RegKeyGetValueNames съедает последнюю букву


1-1186990648
MultIfleX
2007-08-13 11:37
2007.10.28
Неактивируемое окно


1-1187167680
Zeleniy
2007-08-15 12:48
2007.10.28
Свойства прозрачной TPanel





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский