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

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

Закрытие формы в Дельфи. Странно... [D5, Win2k]


Fbist ©   (2002-09-24 07:41:00) 

Hi, Знатоки!
Не то чтобы вопрос серъёзный, но интересно, может кто знает, почему: есть две формы. При нажатии кнопки на одной, создаётся и вызывается модально вторая. Потом она закрывается. Из её элементов управления считываются данные в первую форму. Но! В обработчике второй формы OnCloseQuery параметру Action присваивается caFree, что значит, что форма будет закрыта и удалена из памяти. Однако после закрытия я запросто читаю из её полей... Вот и боюсь, что когда нибудь, где-нить всё-таки завалится... Причём проверял - при выходе из обработчика нажатия кнопки на первой форме - вторая форма таки реально убивается!


Esu   (2002-09-24 08:48:00) [1]


> Просто не понятно, чего деструктор автоматом вызывается,
> но тока поздно...

А ты поставь Breakpoint на деструктор той формы и на начало чтения данных из нее в главной форме и посмотри что раньше вызывается. Да и вообще зачем тебе ставить там caFree, если ты из нее что-то читать потом собираешься ?


Fbist   (2002-09-24 08:39:00) [2]

Да это всё понятно. Ладна, спасиба.
Просто не понятно, чего деструктор автоматом вызывается, но тока поздно...


mmk   (2002-09-24 08:35:00) [3]

2 Fbist

Если сам что-то создал, позоботься это убрать (это я об использовании Create)... А твой код надо бы изменить:

TForm1.Button1Click....
var
Form2:TForm2;
R: Integer;
begin
Form2:=TForm2.Create(Self);
try
R := Form2.ShowModal;
if R = mrOK then
begin
...
Edit1.Text:=Form2.Edit1.Text;
....
end;
finally
From2.Free;
Form2 := nil; //теперь формы больше нет...
end;
end;


А у второй формы убрать Action:=caFreeиз обработчика.


Fbist   (2002-09-24 08:22:00) [4]

2gek:
:) Можно и Free не делать... Вылетит! 100%!


Fbist   (2002-09-24 08:09:00) [5]

на первой форме кнопка. Её обрабочик:
TForm1.Button1Click....
var
Form2:TForm2;
begin
Form2:=TForm2.Create(Self);

Form2.ShowModal;

// Здесь ОнКлосе у второй формы уже отработал

if Form2.ModalResult=mrOK then
begin
...
Edit1.Text:=Form2.Edit1.Text;
....
end;
// Здесь отрабатывает ОнДестрой второй формы
end;

А у второй формы есть
TForm2.OnCloseQuery...
begin
Action=caFree;
end;

А почему в доке написано что форма убивается?
А по поводу висячей ссылки - что-то не припомню случая, чтобы Access violation не вылетал...


gek   (2002-09-24 08:08:00) [6]

Ну тогда уж

var
F: TForm2;
s:string;
begin
F:=TForm2.Create(nil);
try
F.ShowModal;
finally
F.Free;
F:=nil;// ну вот после этого точно уж вылетит
s:=F.Edit1.Text;
end;
...
end;


mmk   (2002-09-24 08:02:00) [7]

Если у тебя что-то типа:

var
F: TForm2;
begin
F:=TForm2.Create(nil);
try
F.ShowModal;
finally
F.Free;
end;
...
end;


То после FreeF еще будет ссылаться на адрес в памяти, но это будет уже не ее а память, а особожденная. Ты "читаешь из ее полей" еще не измененные данные, толь потому, что твоя программа еще не использовала эту память под новые данные.


Fbist   (2002-09-24 08:02:00) [8]

А почему завалится? Сколько ни пробовал - не валится. Корректно ждёт конца обработчика нажатия кнопки и только потом вызывается деструктор второй формы. Просто интересно - это компилер такой умный что-ли? Такую фишку можно даже где-нибудь приспособить...


Anatoly Podgoretsky   (2002-09-24 07:56:00) [9]

Завалится и еще как, если тебе надо обращаться к переменным формы, то уничтожай ее в точке вызова.


Наверх

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