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.