Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Уничтожение формы [Delphi, Windows]


QAZ   (08.09.14 14:28

при закрытии формы, не главной, созданной
procedure NewForm6( var Result: PForm6; AParent: PControl );
она не уничтожается полностью с вызовом OnDestroy, то есть само окно в системе вроде как отсутствует, а сам КОЛовский объект не уничтожен
т.е. получается чтоб его снова показать, просто show уже не катит, нужно опять создать новый объект, при этом старый со всеми наворотами так и остается в памяти висеть
OnDestroy возникает только при закрытии всей программы
почему так ?
и как нормально сделать уничтожение?


RusSun ©   (08.09.14 17:27[1]

1 Пример демонстрирующий ошибку.
2 Апплет присутсвует?


Дмитрий К ©   (08.09.14 18:05[2]

Не уничтожается потому, что нигде не вызывается Form.Free. Почему так сделано не знаю, для экономии кода наверное. Можно в OnClose вызвать Form.Free как-нибудь так:
procedure TForm1.FormClose(Sender: PObj; var Accept: Boolean);
begin
 Accept := False;
 if Pcontrol(Sender).Parent <> nil then
   Pcontrol(Sender).Parent.RemoveFromAutoFree(Sender);
 PControl(Sender).Free;
end;

А если форму требуется использовать повторно, то в OnClose ее можно просто прятать таким же способом.
procedure TForm1.FormClose(Sender: PObj; var Accept: Boolean);
begin
 Accept := False;
 PControl(Sender).Hide;
end;


QAZ   (10.09.14 11:26[3]


> Дмитрий К ©   (08.09.14 18:05) [2]

в принципе удаление из автофри ничего не меняет
возникает вопрос еще как правильно программно закрыть форму...
например вызов form6.form.free из самой формы приводит к утечкам, а из другой формы нет
или например form6.form.close в событии кнопки это не одно и тоже что нажать на крестик закрытия


Vladimir Kladov ©   (10.09.14 18:44[4]

2QAZ Неправильно вообще говорить "вызов из формы". Код, он в итоге есть просто последовательность команд, и ни к какой форме не привязан. По крайней мере, в момент его выполнения бессмысленно говорить, что он выполняется "в форме" или от имени какой-то формы.

2ДмитрийК В разделе Demo на сайте есть Demo2Forms. После допиливания директивы ENDIF -> IFEND демо вполне себе открывается и даже работает (хотя и написано было для не помню какой версии KOL, когда еще формы закрывались с уничтожением сами). Чтобы теперь форма уничтожалась в OnClose, надо бы дописать:

procedure TForm2.KOLForm2Close(Sender: PObj; var Accept: Boolean);
begin
 if CheckBox1.Checked then
 begin
   Accept := FALSE;
   Form.Hide;
 end
 else begin
     Form.Free;
     Form2 := nil;
 end
;
end;


И в данном простом случае вопрос решён. Но могут быть нюансы. Надо понимать, что когда выполняется Form.Free, то после возврата в код мы уже не можем обращаться к полям формы, методам формы, и даже трогать переменную Form2 уже нельзя, кроме как затереть в nil. Если хочется безопасности, нарисуйте страшный комментарий в этой точке, типа
// дальше нельзя ничего делать, кроме как выйти.

На самом деле, здесь можно делать всё, что угодно - только нельзя работать с только что уничтоженным объектом.

Либо организовать обработчик сообщения вроде WM_USER+1099 в главной форме, где выполнить эти операции, а в самом методе сделать отложенную посылку сообщения через PostMsg.


QAZ   (11.09.14 12:42[5]

почему не можно было сделать как в вкле где в онслозе несколько вариантов TCloseAction = (caNone, caHide, caFree, caMinimize) ?
да даже просто, если ацепт=тру то форму убивать полностью
есть же например автофри у потоков...


Vladimir Kladov ©   (11.09.14 18:02[6]

Как раз потому что не VCL. Предусматривать сразу все варианты = городить больше кода, чем его требуется в каждом отдельном случае.

И с убийством формы в обработчике оконных сообщений были проблемы. Если это делать всегда, то надо как-то обеспечить, чтобы это было последнее действие с формой. Но не получилось. Все равно найдется какой-нибудь уже работающий код, который после переписывания на новый манер этого фрагмента начинает глючить. Пусть уже останется как есть.


QAZ   (12.09.14 13:04[7]

ясно-понятно, тогда эти тонкости надо как-то описывать, что по дефолту ондестрой сработает только при закрытии всей проги
т.к. книга редко обновляется да и читают ее не все, возникла гениальная идея, генерировать MSK коментарии при создании обработчиков в дизайнтайме, это и быстрее и конкретней чем сочинять большой талмуд
типа "событие возникает тогда-то и при таких то условиях"


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо