AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Formular geschlossen, aber assigned ist true

Formular geschlossen, aber assigned ist true

Ein Thema von josef-b · begonnen am 24. Sep 2021 · letzter Beitrag vom 25. Sep 2021
Antwort Antwort
josef-b

Registriert seit: 6. Jun 2004
Ort: bei Jena in Thüringen
49 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Formular geschlossen, aber assigned ist true

  Alt 24. Sep 2021, 23:12
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:

form2.close; und im OnClose ereignis:

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
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.588 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Formular geschlossen, aber assigned ist true

  Alt 24. Sep 2021, 23:36
Wenn ein Formular freigegeben wird, dann bedeutet das nicht automatisch, dass alle Zeiger auf die nicht mehr existierende Instanz der Form automatisch auch auf 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 Assigned() . Du wirst feststellen, dass Assigned() immer noch true zurückgibt obwohl beim Zugriff auf die Instanz eine AccessViolation auftreten wird.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
779 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Formular geschlossen, aber assigned ist true

  Alt 25. Sep 2021, 00:37
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
josef-b

Registriert seit: 6. Jun 2004
Ort: bei Jena in Thüringen
49 Beiträge
 
Delphi 10 Seattle Professional
 
#4

AW: Formular geschlossen, aber assigned ist true

  Alt 25. Sep 2021, 08:25
Also so scheint es zu funktionieren... ?

Delphi-Quellcode:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2 := nil;
action := cafree;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.568 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Formular geschlossen, aber assigned ist true

  Alt 25. Sep 2021, 09:07
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
926 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Formular geschlossen, aber assigned ist true

  Alt 25. Sep 2021, 20:07
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.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.568 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Formular geschlossen, aber assigned ist true

  Alt 25. Sep 2021, 20:15
Delphi-Quellcode:
if Form2 = Self then
  Form2 := nil;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 17:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf