Текущий архив: 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.042 c