![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;
всё.