Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Beim Beenden alle MDIChilds schließen

  Alt 26. Sep 2003, 17:39
Moin DSeven,

Zitat von DSeven:
Das Haupformular muss diese nicht beenden. Wieso denn auch wenn diese sich beim beeden des Hauptformulars sowieso selber schließen.
Ganz einfach, weil das Schliessen des Hauptformulares bei Blechwolfs Programm davon abhängig ist, dass alle MDIChildren geschlossen wurden. Damit bleiben alle Fenster offen:
Die MDIChildren werden automatisch geschlossen, wenn sich das Hauptformular schliesst, dieses darf sich aber erst schliessen, wenn alle MDIChildren geschlossen sind.
Da nun aber beim Druck auf X zum Beenden des Programmes erst einmal alle vorhandenen OnCloseQuery Prozeduren abgearbeitet werden, und anschliessend erst die OnClose Prozeduren, würde das Hauptformular sich nicht schliessen, da dessen OnCloseQuery Prozedur aufgerufen wird, bevor die OnClose Prozeduren der MDIChildren aufgerufen wurden, wodurch der Zähler MDIChildCount nicht gleich 0 ist.

In einem Punkt hast Du allerdings Recht: Man muss im OnClose der MDIChildren self.Free verwenden statt Action := caFree, da letzteres, aus irgendeinem Grunde, nicht die gewünschte Wirkung hat. Man behält als MDIChildCount immer 1 übrig.

Wenn man nun also die Abfrage und das Schliessen der MDIChildren in das OnCloseQuery des Hauptformulares legt

Delphi-Quellcode:
procedure TfrmMAIN.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
   i : integer;
begin
   for i := MDIChildCount-1 downto 0 do begin
     if MessageDlg(MDIChildren[i].Caption+' - Data will be lost.'+#10+'Continue ?',
                            mtConfirmation,
                    [mbYes,mbNo],0) = mrYes then begin
       MDIChildren[i].Close;
     end;
   end;
  if self.MDIChildCount = 0 then
     CanClose := true
  else
     CanClose := false;
end;
und in das OnClose eines jeden MDI-Formulares

Delphi-Quellcode:
procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  self.free;
end;
sollte es wie gewünscht funktionieren.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat