Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Formular geschlossen, aber assigned ist true (https://www.delphipraxis.net/208885-formular-geschlossen-aber-assigned-ist-true.html)

josef-b 24. Sep 2021 22:12

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:
form2 := TFForm2.create(self);
form2.show;
Beim schliessen:

Delphi-Quellcode:
form2.close;
und im OnClose ereignis:

Delphi-Quellcode:
action := cafree;
Wenn ich aber danach aufrufe

Delphi-Quellcode:
if assigned(form2) then
  begin
  ......
  end;
kommt true

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

Aviator 24. Sep 2021 22:36

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:
nil
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
Delphi-Quellcode:
Assigned()
. Du wirst feststellen, dass
Delphi-Quellcode:
Assigned()
immer noch
Delphi-Quellcode:
true
zurückgibt obwohl beim Zugriff auf die Instanz eine AccessViolation auftreten wird.

Redeemer 24. Sep 2021 23:37

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.

josef-b 25. Sep 2021 07:25

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;

himitsu 25. Sep 2021 08:07

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.

dummzeuch 25. Sep 2021 19:07

AW: Formular geschlossen, aber assigned ist true
 
Zitat:

Zitat von josef-b (Beitrag 1495370)
Also so scheint es zu funktionieren... ?

Delphi-Quellcode:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2 := nil;
action := cafree;
end;

Solange Form2 die einzige Referenz auf das Formular ist, ja. Aber es kann ja beliebig viele geben und außerdem kann es ja auch mehrere Instanzen von TForm2 geben.

himitsu 25. Sep 2021 19:15

AW: Formular geschlossen, aber assigned ist true
 
Delphi-Quellcode:
if Form2 = Self then
  Form2 := nil;


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