Zitat von
s.h.a.r.k:
Ich greife, nachdem ich eine Form geschlossen habe auf diesen Counter zu, wobei dieser eben noch die Form "enthält". Warum ist das allerdings so!? Ich denke, wenn ich ein OnClose einer Form aufrufe, danach dann den Counter abfrage, er doch eigentlich um 1 niedriger sein sollte als zuvor!?
Der Aufruf von [TForm].Close zerstört das Formular ja noch nicht, sondern
caFree veranlasst den Aufruf von
Release:
Delphi-Quellcode:
procedure TCustomForm.Release;
begin
PostMessage(
Handle, CM_RELEASE, 0, 0);
end;
Diese Message wird aber erst beim nächsten Application.ProcessMessages verarbeitet.
Also ist das Formular-Objekt noch nicht ganz vernichtet, aber im Prinzip schon zum Tode verurteilt.
Ich würde an deiner Stelle einen
Callback Mechanismus einbauen:
Delphi-Quellcode:
procedure TMDI_Form.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if FormStyle = fsMDIChild
then
begin
// sage dem Hauptformular Bescheid, dass ich (= das MDI-Child) geschlossen werden
(Owner
as TMainForm).MDIClosing(self);
Action := caFree;
end;
end;
procedure TMainForm.MDIClosing(f:TcustomForm);
begin
// das Hauptformular erhält jetzt einen letzten Todesgruss von seinem sterbenden MDI-child
// so hat man die volle Kontrolle über das Geschehen
with f
as TMDI_Form
do
begin
if MenuItemAutosave.Checked
and DataModified
then // DataModified ist ein Property des MDI-Child
SaveData;
// SaveData ist eine Methode des MDI-Child
end;
end;