Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.03;
Скачать: CL | DM;

Вниз

Закрытие формы в Дельфи. Странно...   Найти похожие ветки 

 
Fbist ©   (2002-09-24 07:41) [0]

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


 
Anatoly Podgoretsky ©   (2002-09-24 07:56) [1]

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


 
mmk ©   (2002-09-24 08:02) [2]

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

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


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


 
Fbist ©   (2002-09-24 08:02) [3]

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


 
gek ©   (2002-09-24 08:08) [4]

Ну тогда уж

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



 
Fbist ©   (2002-09-24 08:09) [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 не вылетал...


 
Fbist ©   (2002-09-24 08:22) [6]

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


 
mmk ©   (2002-09-24 08:35) [7]

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:39) [8]

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


 
Esu ©   (2002-09-24 08:48) [9]


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.10.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
14-8123
Карлсон
2002-09-07 22:47
2002.10.03
Как защититься от нюкера?


1-7998
[BAD]Angel
2002-09-21 13:10
2002.10.03
Помогите с сетевым окружением!


7-8196
vasya_dvc
2002-06-07 00:48
2002.10.03
Как


1-7890
AlbertHakimov
2002-09-23 09:03
2002.10.03
Медленная отработка сообщений от мышки !


1-8003
CrazyAngel
2002-09-21 15:52
2002.10.03
Как из dll вызвать функцию моей программы ?