Hallo Community.
Seit TAGEN sitze ich an dem Problem im Zusammenhang mit dem Schließen und Öffnen von MDIChildren eines Hauptformulars.
Ich habe drei Funktionen/Prozeduren (teilweise hier aus dem Forum) zu meinem Hauptformular hinzugefügt:
- function TForm_Main.IsFormOpen(Form:TForm) -> Überprüft, ob das Formular "Form" bereits existiert
- procedure TForm_Main.CloseAllForms; -> Schließt alle Formulare (aber keine MDIChilds) mit Ausnahme des Hauptformulars
- procedure TForm_Main.CloseAllMDIChilds; -> Schließt alle aktiven MDIChilds
Im folgenden sollen nun über das OnClick-Event des Buttons2 sämtliche Formulare und MDIChilds geschlossen werden. Im OnClick-Event werden deshalb die Proceduren CloseAllForms() und CloseAllMDIChilds() aufgerufen. Danach wird mit IsFormOpen() zu Testzwecken überprüft, ob dass MDIChild FormViewerConfig existiert.
Problem:
Nachdem CloseAllMDIChilds() ausgeführt wurde, werden die MDIChilds nicht SOFORT zerstört, sondern erst nach dem das Button2Click()-Event ausgeführt wurde. Das liegt wohl daran, dass CloseAllMDIChilds() nur das OnClose-Event der Formulare aufruft, aber diese nicht direkt zerstört. Erst nachdem Button2Click()-Event ausgeführt wurde sind diese tatsächlich zerstört und nicht mehr unter Screen.Forms aufgeführt. Wie kann ich die MDIFormulare SOFORT zerstören, aber trotzdem nicht auf das OnClose-Event verzichten?
Delphi-Quellcode:
//Funktion prüft, ob das Formular bereits existiert
function TForm_Main.IsFormOpen(Form:TForm): Boolean;
var
i: Integer;
begin
Result := False;
for i := Screen.FormCount - 1 DownTo 0 do
if (Screen.Forms[i] = Form) then
begin
Result := True;
Break;
end;
end;
//Alle Formulare schließen (Ausnahme MDIChild und Form_Main)
procedure TForm_Main.CloseAllForms;
var
i: Integer;
begin
for i := Screen.FormCount - 1 DownTo 0 do
Begin
If Not(Screen.Forms[i] = Form_Main) And (Screen.Forms[i].FormStyle <> fsMDIChild) then
Begin
Screen.Forms[i].Close;
End;
End;
end;
//Alle MDIChilds schließen
procedure TForm_Main.CloseAllMDIChilds;
var
i: Integer;
begin
For I := Self.MDIChildCount-1 downto 0 do
Begin
Self.MDIChildren[I].Close;
End;
end;
procedure TForm_Main.Button2Click(Sender: TObject);
begin
CloseAllForms; //Alle Forms schließen
CloseAllMDIChilds; //Alle MDIChilds schließen
If NOT IsFormOpen(FormViewerConfig) then
Begin
FormViewerConfig:=TFormViewerConfig.Create(Application, MyMotor);//Formular FormViewerConfig ist weiterhin aktiv, obwohl FormViewerConfig.Close() bereits ausgeführt wurde. Neue Instanz von FormViewerConfig wird nicht erzeugt.
End;
End;
Nachtrag:
Wenn ich die Prozedur CloseAllMDIChilds() mit der Zeile "Self.MDIChildren[I].Free;" ergänze wird das MDIChild zerstört. Aber dieses Vorgehen sorgt bestimmt für Probleme, weil Self.MDIChildren[I].Close; auch Free() aufruft, nur zu einem späteren Zeitpunkt?!?
Delphi-Quellcode:
//Alle MDIChilds schließen
procedure TForm_Main.CloseAllMDIChilds;
var
i: Integer;
begin
For I := Self.MDIChildCount-1 downto 0 do
Begin
Self.MDIChildren[I].Close;
Self.MDIChildren[I].Free;
End;
end;