Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wo gebe ich ein Formular wieder frei? (https://www.delphipraxis.net/152560-wo-gebe-ich-ein-formular-wieder-frei.html)

idefix2 27. Jun 2010 11:21

Wo gebe ich ein Formular wieder frei?
 
Hallo,

ich bastle gerade an einer Unit, die mir ein "abstraktes" Formular implementiert, das ich dann zur Laufzeit mit unterschiedlichen Parametern erstellen kann.
Dazu gibt es eine Methode createform (....), der die Laufzeitparameter für das Formular übergeben werden.

Jetzt brüte ich über einem bzw. eigentlich zwei Problemen:

Das Formular wird nichtmodal aufgerufen, d.h. u.U. wird das aufrufende Formular geschlossen und dessen Instanz entfernt, während das neue Formular noch aktiv ist. Ich kann also die Form-Variable nicht in der aufrufenden Instanz deklarieren. Die Frage glaube ich beantwortet zu haben, bin mir aber nicht ganz sicher. Wahrscheinlich ist der richtige Platz dafür eine globale Liste oder ein globales array of TmyForm?

Aber vor allem, wo ist die "richtige" Stelle, um das Formular freizugeben, wenn es geschlossen worden ist? Das OnClose Ereignis ist wahrscheinlich noch zu früh, da fürchte ich, daß ich dem Formular quasi den Boden unter den Füssen wegziehe. Gibt es ein Ereignis, das aufgerufen wird nachdem das Formular geschlossen wurde und die Instanz ohne Probleme aus dem Speicher entfernt werden kann, oder wie könnte ich das sonst lösen? Ich habe schon daran gedacht, timergesteuert die Liste der Formulare durchzugehen und solche, die nicht mehr gebraucht werden, mit einer gewissen Verzögerung freizugeben. Die Lösung gefällt mir aber eigentlich gar nicht.

DeddyH 27. Jun 2010 11:23

AW: Wo gebe ich ein Formular wieder frei?
 
Vielleicht denke ich zu simpel, aber wenn Du einfach im OnClose caFree als CloseAction angibst?

mkinzler 27. Jun 2010 11:25

AW: Wo gebe ich ein Formular wieder frei?
 
Zitat:

Ich kann also die Form-Variable nicht in der aufrufenden Instanz deklarieren.
Dieses darf nicht der Owner sein. Wenn du ausserhalb des Rufers nicht auf die Referenzvariable zugreifen willst, könnte diese theoretisch auch dort deklariert sein.
Setzte die ClosAction auf caFree

idefix2 27. Jun 2010 11:34

AW: Wo gebe ich ein Formular wieder frei?
 
Zitat:

Vielleicht denke ich zu simpel
Ich fürchte, ich bin es, der da zu kompliziert denkt:)

Danke

@ mkinzler:
Ja, Du hast Recht, so würde es gehen - bei der freigabe einer Komponente werden ja nur die Unterkomponenten freigegeben, deren Owner sie ist, und die lokal angelegte Variable Form ist ja nur ein Zeiger auf den eigentlichen Record mit den Komponentendaten. Aber ich brauche ziemlich sicher eine Zugriffsmöglichkeit auf alle vorhandenen Formularinstanzen (schon allein, um das klassische "Fenster"-Menü zu implementieren), also wird eine globale Liste in dem Fall wohl der beste Platz sein.

DeddyH 27. Jun 2010 11:41

AW: Wo gebe ich ein Formular wieder frei?
 
Screen.Forms bzw. FormCount hilft Dir nicht weiter?

idefix2 27. Jun 2010 12:27

AW: Wo gebe ich ein Formular wieder frei?
 
Screen.Forms?

Klingt gut. Nach etwas Suchen auch in der Delphi Hilfe gefunden (zwar nicht über F1, das wäre wohl zu viel verlangt, aber über die DP-Delphi-Reference bin ich hingekommen).

Ich schätze, ich werde noch eine ganze Weile brauchen, bis ich die Klassenbibliothek der Delphi VCL auch nur halbwegs überblicke. Von daher könnt ihr euch noch auf einige dumme Fragen von mir gefasst machen - weil in der Hilfe suchen kann man nur, wenn man ungefähr weiss, was man suchen soll, und auch dann sind viele Features oft so gut versteckt, dass man sie nicht leicht findet.

Nachdem ich beim Durchlaufen dieses Feldes ja bei jedem Element leicht feststellen kann, ob es ein normales Form ist oder von myForm abstammt, kann ich mir eine separate Liste meiner eigenen (im Sinn von "von TmyForm abstammend") Formulare wirklich sparen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 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