Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Schließen von Fenstern (https://www.delphipraxis.net/98880-schliessen-von-fenstern.html)

legionen 3. Sep 2007 15:08


Schließen von Fenstern
 
Hallo,

in meinem Programm benutze ich recht viele Fenster vom Typ "fsMDIChild", wenn ich eine neue Datei erstellen will, möchte ich, dass alle Aktiven Fenster mit dem Befehl "destroy" zerstört werden und dann erst wieder bei Bedarf erzeugt werden. Wenn aber ein Fenster bereits zerstört wurde und ich den Befehl dann nochmal ausführe kommt es zu einem Fehler und das Programm hängt sich auf.

Bisher löse ich das mit Variablen, die ich immer auf True setze wenn ich ein Fenster erzeuge und False wenn ich es schließe, nur sieht mir das zu blöd aus und bei dem immer Länger werdenen Code schleichen sich immer mehr Fehler ein.. ich hatte es mit der Abfrage:

If Form2.active Then form2.destroy

probiert, da ich dachte, dass active bedeutet, dass Form2 created wurde, aber leider funktioniert es so nicht.

Einer eine Idee wie es geht ohne immer Variablen mitzuschleppen?

Danke schon mal jetzt!

Phistev 3. Sep 2007 15:16

Re: Schließen von Fenstern
 
Wie wär's mit
Delphi-Quellcode:
if Assigned(Form2) then begin
  Form2.Close;
  FreeAndNil(Form2);
end;

legionen 3. Sep 2007 15:19

Re: Schließen von Fenstern
 
Vielen Dank, man lernt immer wieder gerne....

solche blöden fragen will ich eigentlich gar nicht stellen, aber hier an der Uni haben sie nur Delphi2007 (selber habe mal früher mit Delphi 4.0 gearbeitet) und die haben die Hilfedateien stark verändert.... man findet nichts mehr (jedenfalls ich :-D )

Hat super geklapt!!!!

marabu 3. Sep 2007 15:25

Re: Schließen von Fenstern
 
Noch ein Tipp: Wenn du das MDI Fenstermodell in Verbindung mit einer ActionList verwendest, dann passt eine Action WindowCloseAll ganz gut ins Bild:

Delphi-Quellcode:
procedure TMainForm.WindowCloseAllActionExecute(Sender: TObject);
begin
  while Assigned(ActiveMDIChild) do
    ActiveMDIChild.Free;
end;
Freundliche Grüße

DeddyH 3. Sep 2007 15:33

Re: Schließen von Fenstern
 
Nur aus Interesse: müsste es nicht FreeAndNil heißen, oder wird das ActiveMDIChild automatisch unassigned?

shmia 3. Sep 2007 16:12

Re: Schließen von Fenstern
 
Bei MDI kann es ja viele Fenster (=Formulare) einer einzigen Klasse geben.
Damit man keine Fehler macht sollte man bei MDI-Formularen folgende Zeile auskommentieren:
Delphi-Quellcode:
var                  // auskommentieren !!!
   Form2 : TForm2;   // auskommentieren !!!
Bei einem MDI-Cild Formular bedeutet ja das Schliesen gleichzeitig den Tod des Formulars.
Darum sollte sich das Formular selber kümmern.
Daher muss man sich im Event OnClose einklinken:
Delphi-Quellcode:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   if FormStyle = fsMDIChild then
     Action := caFree;
end;
Die Anmerkung mit FreeAndNil sind bei MDI-Formularen nicht zutreffend. Man braucht kein FreeAndNil weil es gar keine Variable gibt/geben darf.

DeddyH 3. Sep 2007 16:32

Re: Schließen von Fenstern
 
Danke Dir für die Erklärung. Ich habe selbst noch nie was mit MDI gemacht, daher hat es mich mal interessiert.


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