![]() |
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; |
AW: MDI Fenster schließt nicht richtig
Zitat:
Und wenn man sich die Instanz nicht irgendwo speichert, dann hat man u.U. ein schönes Speicherleck. :) Habe allerdings keine Ahnung, wie das MDI technisch vom System verwaltet wird. Aber bei anderen Objekte wäre das der Fall. |
AW: MDI Fenster schließt nicht richtig
MDI kümmert sich nur um die visuelle Darstellung (Parent usw.)
die Freigabe wird wie bei jeder anderen TForm behandelt, bzw. wie bei TComponent allgemein. Zitat:
Delphi-Quellcode:
OK, das geht aber dann doch eher Free statt Close oder halt mit 2 Forms leben.
MyForm.Close;
Application.ProcessMessages MyForm := TMyForm.Create(Self); ...
Delphi-Quellcode:
Free hat aber ein "Problem", denn z.B. ein eventuell vorhandenes Event an OnCloseQuery wird nicht ausgeführt. (Free ist sofortiges Schließen ohne Rückfrage, samt Freigabe)
MyForm.Free;
Application.ProcessMessages MyForm := TMyForm.Create(Self); ... Aber warum eine Instanz des selben Form freigeben und eine neue Instanz erstellen, anstatt die bestehende Instanz wiederzuverwenden? |
AW: MDI Fenster schließt nicht richtig
Zitat:
|
AW: MDI Fenster schließt nicht richtig
Mit unsauber meine ich...
Wenn Programmierer X den Namen der Form ändern muss, weis er nicht, dass es hier im Code oder an andererer Stelle eine Sonderlocke gibt. In meinen Augen sehr gefährlich. |
AW: MDI Fenster schließt nicht richtig
@Himitsu:
Das Free wird in diesem Fall im OnClose aufgerufen. Das CloseQuery muss dann schon abgearbeitet sein. Passt also in diesem Fall noch. @Eppos: Welche Sonderlocke ist denn gefährlicher: - Ein Free in einem Close-Event, welches eigentlich sowieso automatisch durchgeführt wird? - Oder das Setzen einer Caption, was ein rein optischer Effekt ist? |
AW: MDI Fenster schließt nicht richtig
@Jasocul
Als Sonderlocke meine ich das setzen der Caption, weil wir darüber weitere Funktionalitäten abbilden wie z.B. -Formsettings -Usersettings -Sprachdaten etc... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 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