Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
1-7963
Бильврёст
2002-09-24 10:11
2002.10.03
Проблемы с рекурсией и возвратом управления в нужную точку.


14-8150
matvey
2002-09-09 14:08
2002.10.03
Прокси


3-7847
kazaam
2002-09-13 08:17
2002.10.03
Как добавлять к таблице картинки?


3-7807
ОлегТ
2002-09-11 21:42
2002.10.03
как програмно задать псевдоним и путь в BDE


3-7828
Andrew_
2002-09-11 19:27
2002.10.03
Координаты ячейки в DBGrid, над которой находится мышь





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский