Главная страница
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.032 c
2-1151031762
nickhilo
2006-06-23 07:02
2006.07.09
Компонент RichEdit с полноценной поддержкой формата RTF.


8-1138452664
Universe
2006-01-28 15:51
2006.07.09
Большие изображения


2-1150797351
Unknowing
2006-06-20 13:55
2006.07.09
Файлы данных


2-1150960522
Квэнди
2006-06-22 11:15
2006.07.09
Проблема с свойствами объекта


6-1141464906
MegaWolf510
2006-03-04 12:35
2006.07.09
Проблема с отправкой смс сообщений через com. Помогите, плиз...