Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi MainForm ruft beim Schliessen kein OnFormDestroy auf (https://www.delphipraxis.net/201054-delphi-mainform-ruft-beim-schliessen-kein-onformdestroy-auf.html)

MyRealName 19. Jun 2019 09:04

Delphi MainForm ruft beim Schliessen kein OnFormDestroy auf
 
Hallo,

ich habe eine MainForm (MDIForm) welche im OnClose Action := caFree setzt. Jetzt habe ich allerdings festgestellt, dass von den Komponenten auf der Form kein Destroy aufgerufen wird. Beim weiteren Untersuchen stellte ich fest, dass auch das OnFormDestroy der Hauptform nicht ausgeführt wird.

Im TCustumForm.Close wird ein Terminate ausgeführt, wenn die Action auf <> caNone ist und es die Application.MainForm ist.


Hat einer eine Idee, warum das so ist ? Ich würde es gern haben, dass die Destroy events der Komponenten korrekt ausgeführt werden!

Vielen Dank schonmal

Blup 19. Jun 2019 09:20

AW: Delphi MainForm ruft beim Schliessen kein OnFormDestroy auf
 
Application.MainForm wird durch das Application-Objekt freigegeben, nachdem die MainForm geschlossen wurde.
Deshalb gibt es eigentlich keinen Grund dieses Formular durch Action := caFree schon nach dem OnClose freizugeben.

Terminate in TCustumForm.Close ist wahrscheinlich eine Art Notbremse, um in diesem Fall Folgefehler abzufangen.

MyRealName 19. Jun 2019 09:35

AW: Delphi MainForm ruft beim Schliessen kein OnFormDestroy auf
 
Also was ich sehe ist dass in Application.Components normalerweise die MainForm drin steht, bei meiner Anwendung leider nicht. Und deswegen wird auch das free nicht aufgerufen.

Jetzt müßte ich nur noch den grund wissen.

Edit : Ein Application.InsertComponent(Self) auf der MainForm hat das Problem gelöst. Aber seltsam, daß das nicht autoamtisch passiert.

peterbelow 19. Jun 2019 10:06

AW: Delphi MainForm ruft beim Schliessen kein OnFormDestroy auf
 
Zitat:

Zitat von MyRealName (Beitrag 1435003)
Also was ich sehe ist dass in Application.Components normalerweise die MainForm drin steht, bei meiner Anwendung leider nicht. Und deswegen wird auch das free nicht aufgerufen.

Jetzt müßte ich nur noch den grund wissen.

Edit : Ein Application.InsertComponent(Self) auf der MainForm hat das Problem gelöst. Aber seltsam, daß das nicht autoamtisch passiert.

Das passiert schon automatisch, wenn das Mainform in der autocreate liste ist und der Programmierer nicht im dpr-File herumgepfuscht und das Application.CreateForm-Statement für das Mainform demoliert hat. Man beachte auch: wenn mehrere Forms in der Autocreate-Liste stehen wird das erste, das mit Application.CreateForm erzeugt wird das Application.Mainform, dessen Schließen die Anwendung beendet. Wenn Du da also mehr als ein Form in der autocreate-Liste hast, prüf mal die Reihenfolge, in der sie erzeugt werden. Eventuell ist dein "mainform" gar nicht das Application.Mainform...

MyRealName 19. Jun 2019 11:06

AW: Delphi MainForm ruft beim Schliessen kein OnFormDestroy auf
 
Es wird nur ein Form automatisch erzeugt, das dpr sieht so aus :

Code:
  Application.Initialize;
  Application.CreateForm(TfMainForm, fMainForm);
  Application.Run;
Und wie gesagt, nachdem ich es manuell in die Application.Components eingefügt habe, ging alles wie es sollte..
Seltsam.

peterbelow 19. Jun 2019 11:22

AW: Delphi MainForm ruft beim Schliessen kein OnFormDestroy auf
 
Zitat:

Zitat von MyRealName (Beitrag 1435015)
Es wird nur ein Form automatisch erzeugt, das dpr sieht so aus :

Code:
  Application.Initialize;
  Application.CreateForm(TfMainForm, fMainForm);
  Application.Run;
Und wie gesagt, nachdem ich es manuell in die Application.Components eingefügt habe, ging alles wie es sollte..
Seltsam.

Das sollte definitiv nicht nötig sein, da muß irgend was faul sein. Läßt sich aber leider so remote nicht weiter analysieren.

Schokohase 19. Jun 2019 12:05

AW: Delphi MainForm ruft beim Schliessen kein OnFormDestroy auf
 
Kann es sein, dass du irgendwo den Konstruktor von TfMainForm überschrieben hast und dort fehlt jetzt z.b. der
Delphi-Quellcode:
inherited
Aufruf?

Blup 19. Jun 2019 12:22

AW: Delphi MainForm ruft beim Schliessen kein OnFormDestroy auf
 
Eventuell auch mal so versuchen:
Delphi-Quellcode:
  Application.Initialize;
  Application.MainFormOnTaskBar := True;
  Application.CreateForm(TFMainForm, FMainForm);
  Application.Run;

MyRealName 19. Jun 2019 14:07

AW: Delphi MainForm ruft beim Schliessen kein OnFormDestroy auf
 
Zitat:

Zitat von Schokohase (Beitrag 1435019)
Kann es sein, dass du irgendwo den Konstruktor von TfMainForm überschrieben hast und dort fehlt jetzt z.b. der
Delphi-Quellcode:
inherited
Aufruf?

inherited wird da aufgerufen.

Danke an alle, ich lasse das jetyt erstmal so mit dem manuell einsetzen und schau dann mal wenn Zeit ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz