-
QAZ (08.09.14 14:28) [0]при закрытии формы, не главной, созданной
procedure NewForm6( var Result: PForm6; AParent: PControl );
она не уничтожается полностью с вызовом OnDestroy, то есть само окно в системе вроде как отсутствует, а сам КОЛовский объект не уничтожен
т.е. получается чтоб его снова показать, просто show уже не катит, нужно опять создать новый объект, при этом старый со всеми наворотами так и остается в памяти висеть
OnDestroy возникает только при закрытии всей программы
почему так ?
и как нормально сделать уничтожение? -
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 в событии кнопки это не одно и тоже что нажать на крестик закрытия -
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) ?
да даже просто, если ацепт=тру то форму убивать полностью
есть же например автофри у потоков... -
Как раз потому что не VCL. Предусматривать сразу все варианты = городить больше кода, чем его требуется в каждом отдельном случае.
И с убийством формы в обработчике оконных сообщений были проблемы. Если это делать всегда, то надо как-то обеспечить, чтобы это было последнее действие с формой. Но не получилось. Все равно найдется какой-нибудь уже работающий код, который после переписывания на новый манер этого фрагмента начинает глючить. Пусть уже останется как есть. -
QAZ (12.09.14 13:04) [7]ясно-понятно, тогда эти тонкости надо как-то описывать, что по дефолту ондестрой сработает только при закрытии всей проги
т.к. книга редко обновляется да и читают ее не все, возникла гениальная идея, генерировать MSK коментарии при создании обработчиков в дизайнтайме, это и быстрее и конкретней чем сочинять большой талмуд
типа "событие возникает тогда-то и при таких то условиях"