Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

if Form=nil [D7, XP]


logslava ©   (2006-06-21 17:16:00) 

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

Ситуация:
по нажатию кнопки 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;


в чем ошибка?


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

thanks & regards to all!


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

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


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


Leonid Troyanovsky   (2006-06-21 19:36:00) [3]


> logslava   (21.06.06 17:16)  

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


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

--
Regards, LVT.


Loginov Dmitry   (2006-06-21 18:26:00) [4]

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

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


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

Tfrm_Filter.Create(Application).Show;


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


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


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


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

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

Application.CreateForm(Tfrm_Filter, frm_Filter);

или

frm_Filter:=Tfrm_Filter.Create(Application)

??

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

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

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


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

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

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

Object.Free;
Object:=nil;

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

Верно мыслю?


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

Ega32 thanks a lot


Ega23   (2006-06-21 17:25:00) [9]


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


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


всё.


Наверх

Титульная страница Поиск, карта сайта Написать письмо