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

Вниз

if Form=nil   Найти похожие ветки 

 
logslava   (2006-06-21 17:16) [0]

можно ли проверять существование объекта таким образом?
Есть ли какие подводные камни в такой реализации проверки? или как лучше это сделать.

Ситуация:
по нажатию кнопки btn_Filter показывается форма frm_Filter,
далее если нажата кнопка Cancel (по нажатию происходит frm_Filter.ModalResult:=mrCancel), объект frm_Filter можно уничтожать, если нажата кнопка OK (по нажатию происходит frm_Filter.ModalResult:=mrOK), то форма должна просто скрываться

При выполнении программы:
жмем btn_Filter, затем на появившейся форме жмем Cancel (форма скрывается),
жмем btn_Filter снова - выскакивает ошибка "Acsess violation at address..."

Вот обработчик

procedure Tfrm_Main.btn_FilterClick(Sender: TObject);
begin
 if (frm_Filter=nil) then
      frm_Filter := Tfrm_Filter.Create(Self);
 if frm_Filter.ShowModal=mrCancel then
      frm_Filter.Free; // при повторном нажатии btn_Filter это не
                           //  выполняется (или не дает эффекта)
end;


в чем ошибка?


 
Ega23 ©   (2006-06-21 17:25) [1]


> по нажатию кнопки btn_Filter


Application.CreateForm(Tfrm_Filter, frm_Filter);
try
 frm_Filter.ShowModal;
finally
 frm_Filter.Free;
 frm_Filter:=nil;
end;


всё.


 
logslava   (2006-06-21 17:26) [2]

Хлопци, отбой!!

только что нарыл в Delphi Russian Knowledge Base www.drkb.ru что Free не устанавливает значения nil !!! Надо руками писать

Object.Free;
Object:=nil;

видимо Object хранит указатель на область памяти, где объект лежит (или лежал) а при освобождении этой области памяти очистка указателя не происходит (он попрежнему указывает туда же)

Верно мыслю?


 
logslava   (2006-06-21 17:26) [3]

Ega32 thanks a lot


 
logslava   (2006-06-21 17:30) [4]

а есть ли разница

Application.CreateForm(Tfrm_Filter, frm_Filter);

или

frm_Filter:=Tfrm_Filter.Create(Application)

??

мне кажется принципиальной разницы нет, но второй вариант более гибкий, потому как можно писать

frm_Filter:=Tfrm_Filter.Create(-любой другой объект-)

..может в некоторых случаях будет удобнее


 
Ega23 ©   (2006-06-21 17:42) [5]


> мне кажется принципиальной разницы нет, но второй вариант
> более гибкий, потому как можно писать


А ты почитай что такое constructor TCustomForm.Create(AOwner: TComponent); override; для чего он нужет и что-же за параметр такой AOwner.
Но в принципе, можно и так, как ты говоришь. Вот только Delphi код другой генерит...


 
Loginov Dmitry ©   (2006-06-21 18:26) [6]

logslava   (21.06.06 17:30) [4]
мне кажется принципиальной разницы нет, но второй вариант более гибкий, потому как можно писать

frm_Filter:=Tfrm_Filter.Create(-любой другой объект-)


А можно и без frm_Filter:

Tfrm_Filter.Create(Application).Show;


 
Leonid Troyanovsky ©   (2006-06-21 19:36) [7]


> logslava   (21.06.06 17:16)  

> можно ли проверять существование объекта таким образом?


Нельзя, конечно.
Все созданные формы находятся в Screen.Forms & etc.

--
Regards, LVT.


 
SergP.   (2006-06-21 20:20) [8]

> [2] logslava   (21.06.06 17:26)
> Хлопци, отбой!!
>
> только что нарыл в Delphi Russian Knowledge Base www.drkb.ru
> что Free не устанавливает значения nil !!! Надо руками писать


В таком случае можно вместо Free юзать FreeAndNil


 
logslava   (2006-06-22 11:29) [9]

thanks & regards to all!



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

Текущий архив: 2006.07.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
2-1151080131
resuS
2006-06-23 20:28
2006.07.09
Сортировка по алфавиту


3-1147330152
Ярослав
2006-05-11 10:49
2006.07.09
ProgressBar на время выполнения запроса


1-1148648699
001
2006-05-26 17:04
2006.07.09
Стрелка в Excel


15-1149748118
REA
2006-06-08 10:28
2006.07.09
религиозный фанатизм


4-1143884265
Malik
2006-04-01 13:37
2006.07.09
Прописание программы в автозагрузку после первого включения