Einzelnen Beitrag anzeigen

Tenobaal

Registriert seit: 9. Mai 2013
21 Beiträge
 
Delphi XE5 Professional
 
#1

MDIChild schließen und sofort wieder öffnen

  Alt 17. Okt 2013, 15:03
Delphi-Version: 2007
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;

Geändert von Tenobaal (17. Okt 2013 um 15:20 Uhr)
  Mit Zitat antworten Zitat