![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Противоречие ..... [D5, NT4]
oomneeq © (2002-05-14 14:52:00)Вот какие интересности;
AA:=(Application=nil);
//здесь отладчик показывает Application=nil; AA=false
Что за дела?
Дело происходит при завершении приложения, и насамом деле очень важно знать обнилился ли Application.
Где правда?
Alx2 (2002-05-14 17:48:00) [1]>Так что отладчик может показать неверное значение,
Тогда это не отладчик :)
Anatoly Podgoretsky (2002-05-14 16:53:00) [2]oomneeq © (14.05.02 16:35)
Так уже лучше, но дело в том, что компилятор может выкинуть переменную в целях оптимизации, я бы на его месте так поступил.
Так что отладчик может показать неверное значение, вместо этого отладку лучше провести по шагам с точками останова и если необходимо с выводом значений.
Игорь Шевченко (2002-05-14 16:47:00) [3]День добрый,
А поставить Breakpoint в DoneControls (где, собственно говоря, естественным путем Application в nil устанавливается) не помогает ?
С уважением,
oomneeq (2002-05-14 16:38:00) [4]Поправка
к к-л свойствуApliccation
2McSimm
>Но тут фигурирует вызов функции, а Application это просто переменная
Ото ж ...
oomneeq (2002-05-14 16:35:00) [5]2Anatoly Podgoretsky ©
Раскрываю многоточие для снятия сомнений
procedure DLLFinit;stdcall;
var AA,AT:boolean;
begin
if DLLisInitialised then begin
AA:=Assigned(Application);
if AA then try
AT:=Application.Terminated;
except
AA:=false;
end;
if AA then begin
FreeObjectsWithAppAsOwner ;
end;
Application:=DLLAppl;
DLLAppl:=nil;
end;
end;
Tрюк с try - вынужденный
Т.О. проверяется Apliccation на валидность
т.к хоть AA 1й раз и труе, обращение к к-л Apliccation генерит эксэпщн, что дает возможность косвенно определить, что Apliccation не (cовсем) живой. Вот это-то чудное полуживое состояние и удивляет.
McSimm (2002-05-14 16:18:00) [6]Похожая проблема у меня была вчера. При отладке программы в окне Evaluate / Modify я наблюдал следующие значения выражений:
L (показывает 1)
Length(Result) (показывает 1)
Length(Result) = L (показывает False) !!!
Но тут фигурирует вызов функции, а Application это просто переменная
Anatoly Podgoretsky (2002-05-14 16:10:00) [7]Пока переменная не используется
oomneeq (2002-05-14 15:58:00) [8]>Виктор Щербаков
>Это хорошо, а используется ли её значение, присваиваемое в строчке AA:=(Application=nil)?
AA:=(Application=nil);
if AA then ...
Я называю это "переменная используется"
если твое определение
"значение переменной используется"
означает то же, то ответ положительный
Виктор Щербаков (2002-05-14 15:40:00) [9]
> переменная AA используется
Это хорошо, а используется ли её значение, присваиваемое в строчкеAA:=(Application=nil)?
oomneeq (2002-05-14 15:35:00) [10]"здесь" - на следующей строчке, как и нарисовал.
переменная AA используется
>тогда другое дело.
Именно это самое "другое дело"
Виктор Щербаков (2002-05-14 15:08:00) [11]Кулюкин Олег © (14.05.02 15:03)
Хотя обычно пишет, что переменная недоступна из-за оптимизации.
Кулюкин Олег (2002-05-14 15:03:00) [12]Если переменная AA нигде не используется, то оптимизатор может с ней сотворить нечто нехорошее. В частности, отладчик может показать неверное значение.
Виктор Щербаков (2002-05-14 14:57:00) [13]
> //здесь отладчик показывает Application=nil; AA=false
Где здесь? Если на строчкеAA:=(Application=nil);, то это вполне вероятно, а если на следующей строчке, тогда другое дело.