Конференция "KOL" » Уничтожение формы [Delphi, Windows]
 
  • QAZ (08.09.14 14:28) [0]
    при закрытии формы, не главной, созданной
    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 коментарии при создании обработчиков в дизайнтайме, это и быстрее и конкретней чем сочинять большой талмуд
    типа "событие возникает тогда-то и при таких то условиях"
 
Конференция "KOL" » Уничтожение формы [Delphi, Windows]
Есть новые Нет новых   [118452   +47][b:0][p:0.002]