Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
ВнизЗакрытие формы в Дельфи. Странно... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c