![]() |
Formular geschlossen, aber assigned ist true
ich habe eine Anwendung mit relativ vielen Formularen.
Allerdings möchte ich nicht alle forms automatisch erstellen. Deshalb mache ich das z.b. mit
Delphi-Quellcode:
Beim schliessen:
form2 := TFForm2.create(self);
form2.show;
Delphi-Quellcode:
und im OnClose ereignis:
form2.close;
Delphi-Quellcode:
Wenn ich aber danach aufrufe
action := cafree;
Delphi-Quellcode:
kommt true
if assigned(form2) then
begin ...... end; Das heisst ja dann, dass das Formular immer noch existiert? Wie kann ich es komplett freigeben, so dass ich es danach wieder createn kann? Es geht darum, dass ich ein Formular in einem Timer öffnen möchte, aber nur wenn es nicht schon gerade auf dem Bildschirm (manuell geöffnet wurde) (ein Reminder); Irgendwie ist mir das nach Jahren immer noch nicht so richtig klar, wie das mit den Formularen funktioniert |
AW: Formular geschlossen, aber assigned ist true
Wenn ein Formular freigegeben wird, dann bedeutet das nicht automatisch, dass alle Zeiger auf die nicht mehr existierende Instanz der Form automatisch auch auf
Delphi-Quellcode:
gesetzt werden. Dafür müsstest du dann selbst sorgen. Das kannst du prinzipiell auch mit einem anderen einfachen Objekt testen. Erstellte eine Instanz und speichere sie in einer Variable. Gib die Instanz frei und prüfe auf
nil
Delphi-Quellcode:
. Du wirst feststellen, dass
Assigned()
Delphi-Quellcode:
immer noch
Assigned()
Delphi-Quellcode:
zurückgibt obwohl beim Zugriff auf die Instanz eine AccessViolation auftreten wird.
true
|
AW: Formular geschlossen, aber assigned ist true
Wenn du Forms manuell freigibst (und das nicht automatisch machen lässt, also ohne caFree) und nur eine Variable pro Form hast (z.B. die globalen Variablen à la Form2, die Delphi automatisch für dich deklariert), kannst du mit FreeAndNil sie auch wieder auf nil zurücksetzen. Das eignet sich am ehesten für modale Forms. Nicht modale Forms könnten ihre globale Variable, sofern dies die einzige ihres Typs ist, im Destroy- oder Close-Ereignis auf nil setzen.
Ein Formular kannst du jederzeit erstellen. Du kannst sogar dann dieselbe Variable erneut erstellen, während sie auf ein tatsächlich vorhandenes Objekt zeigt. Da hindert dich keiner dran, nur führt das bei Objekten, die nicht gerade ein intergriertes Speichermanagement à la caFree oder Release() haben, i.d.R. zu Speicherlecks. |
AW: Formular geschlossen, aber assigned ist true
Also so scheint es zu funktionieren... ?
Delphi-Quellcode:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin Form2 := nil; action := cafree; end; |
AW: Formular geschlossen, aber assigned ist true
Jupp, stell dir einen Zettel vor (deine Variable), dort steht die Adresse (Zeiger) deines Fensters drauf.
Reißt man das Haus/Fenster ab, dann bekommt der Zettel es nicht mit. (außer bei Interfaces mit Weak-Referenz) OnClose wird nur bei .Close aufgerufen, oder wenn der User das Fenser schließt (X oder über die Menüs). Alternativ oder zusätzlich würde ich auch OnDestroy oder Destroy (Bevor oder After dem Inherited) empfehlen, damit es auch beim .Free mit auf NIL gesetzt wird. |
AW: Formular geschlossen, aber assigned ist true
Zitat:
|
AW: Formular geschlossen, aber assigned ist true
Delphi-Quellcode:
if Form2 = Self then
Form2 := nil; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz