Форум: "Начинающим";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.016 c