![]() |
MDI Fenster schließt nicht richtig
Hallo zusammen,
ich erstelle mehrere MDI Fenster innerhalb meiner Anwendung.
Code:
Soweit so gut, es gibt nun MDI Forms, die durch Klicken von Buttons, die Form1 aufrufen sollen, jedoch zuvor geschlossen werden.
Form1 := TForm1.Create(self)
Bevor die Form aufgerufen wird, prüfe ich auf...
Code:
und anschließend soll das Fenster so angezeigt werden...
If Form1 <> nil then begin
Form1.Close; Form1 := nil; end;
Code:
Funktioniert auch tadellos, jedoch heißt die Form "Form1_1"...
Form1 := TForm1.Create(self);
Form1.FormStyle := fsNormal; Form1.Visible := False; Form1.ShowModal; Ich vermute das das erste Fenster nicht richtig geschlossen wird. Hat jemand eine Idee wie ich das "_1" unterbinden kann? Gruß Eppos |
AW: MDI Fenster schließt nicht richtig
Ein
Delphi-Quellcode:
schließt in der Regel lediglich das Form. Soll es gleichzeitig freigegeben werden, dann kann man im
Close
Delphi-Quellcode:
-Event die
OnClose
Delphi-Quellcode:
auf
TCloseAction
Delphi-Quellcode:
setzen.
caFree
|
AW: MDI Fenster schließt nicht richtig
hm...
So steht es bereits drin
Code:
Noch ne Idee?
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin Action := caFree; Form1 := nil; end; |
AW: MDI Fenster schließt nicht richtig
Meinst du das?
Delphi-Quellcode:
Form1.Caption := 'Form1';
|
AW: MDI Fenster schließt nicht richtig
korrekt, also es steht dann
Code:
drin...
Form1.Caption := 'Form1_1';
|
AW: MDI Fenster schließt nicht richtig
Der Code, der das
Delphi-Quellcode:
aufruft und der das neue
Form1.Close
Delphi-Quellcode:
macht, werden die direkt hintereinander ausgeführt? In dem Fall wird durch das
TForm1.Create
Delphi-Quellcode:
selbst bei
Close
Delphi-Quellcode:
das Form nicht sofort freigegeben. Vielmehr wird über
caFree
Delphi-Quellcode:
eine Message in die Queue gestellt, die dann bei nächster Gelegenheit das Form freigibt.
Release
Wenn das obige also der Fall ist, dann existiert während des erneuten
Delphi-Quellcode:
die alte Instanz noch und das führt zur Vergabe des neuen Namens.
TForm1.Create
Abhilfe: das
Delphi-Quellcode:
im FormClose-Event entfernen, ebenso wie das
caFree
Delphi-Quellcode:
setzen. Dann noch das
nil
Delphi-Quellcode:
in ein
Form1.Close
Delphi-Quellcode:
abändern.
Form1.Free
|
AW: MDI Fenster schließt nicht richtig
Dann ergänze deinen Code doch:
Delphi-Quellcode:
Form1 := TForm1.Create(self);
Form1.FormStyle := fsNormal; Form1.Visible := False; Form1.Caption := 'Form1'; // Diese Zeile einbauen Form1.ShowModal; |
AW: MDI Fenster schließt nicht richtig
@Uwe Raabe
Ich habe jetzt nur statt
Code:
ein
Form1.Close
Code:
gesetzt.
Form1.Free
Dann funktioniert es. @Jasocul Das erscheint mir eher das Problem vielleicht zu beheben, aber die Ursache bleibt vorhanden. Trotzdem Danke, jedoch zu unsauber. |
AW: MDI Fenster schließt nicht richtig
Zitat:
|
AW: MDI Fenster schließt nicht richtig
Mir fällt keiner in den Rücken :wink:
Das ist nicht unsauber. Beim erfolgreichem Form1.Close mit Action = caFree, wird das Form1.Free nur nicht sofort ausgeführt (wie Uwe Raabe bereits angedeutet hat). Die Queue braucht da halt ein bisschen Zeit. Im Grunde läuft das intern doch ganz anders ab: Form1 ist nur irgendeine Instanz-Variable. Die alte Form, die mit Close geschlossen wurde existiert noch in der Liste der Child-Forms der MDI-Hauptform. Durch das Create zeigt die bisherige Instanz-Variable auf die neue Form. Die MDI-App prüft aber in der Liste, ob noch eine Form mit der automatischen Vergabe des Namens existiert. Da die Queue noch nicht abgearbeitet ist, gibt es da also noch eine (nämlich die alte Form). Auch wenn diese eigentlich geschlossen wurde/wird. Also wird eine neue Bezeichnung verwendet, damit das nicht durcheinander kommt. Die Caption einer Form zur Laufzeit zu verändern, ist sicher nicht unsauber. Übrigens könnte man das auch komplett ohne Instanz-Variable machen:
Delphi-Quellcode:
Aber ich bin kein großer Freund der with-Anweisung. Ich nehme auch immer lokale Instanz-Variablen. Man muss sich nur klar machen, dass die Instanz auch ohne die Variable existiert. Ein weiteres Create mit der selben Variablen, lässt diese nur auf die neue Instanz zeigen. Die vorherige Instanz ist trotzdem vorhanden.
with TForm1.Create(self) do
begin FormStyle := fsNormal; Visible := False; Caption := 'Form1'; ShowModal; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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