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