Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.01 c
1-1148564081
Volf_555
2006-05-25 17:34
2006.07.09
Восстановление TRAY-значка


9-1124984956
Dgt
2005-08-25 19:49
2006.07.09
Формулы Opengl


2-1150969624
nickhilo
2006-06-22 13:47
2006.07.09
Использование помощника Microsoft Office в программах на Delphi.


2-1151049152
Alex_1qaz_2006
2006-06-23 11:52
2006.07.09
Запуск внешнего приложения


1-1148850283
тт
2006-05-29 01:04
2006.07.09
Как вставить в таблицу Word минусы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский