Hallo zusammen,
ich stehe vor einem Problem für das ich so recht keine generelle Architektur/Lösung habe. Folgende Basis:
Für
MDI-Appplikationen möchte ich eine generelle Architektur aufbauen, mit der die Hauptmenüeinträge des
MDI-Hauptformulars, die auf eine Action in einem
MDI Child verweisen oder zielen, enabled oder disabled werden können je nach dem ob Childs geöffnet sind oder nicht. Eigentlich ein klassiches
MDI Problem. Nur so recht fällt mir hier nichts Geniales ein.
Der Grundgedanke ist, auf Basis von MDIChildCount festzustellen, ob ein Child/mehrere Childs offen sind oder nicht. Wenn ja, kann das Enablen der Menüeinträge erfolgen, wenn nicht, werden diese disabled.
Delphi-Quellcode:
Beispielhaft so (die hier genutzten Actions liegen hier auf dem
MDI Hauptformular und rufen die entsprechenden Actions/Methoden des Childs auf; das nur zu Erklärung zum Beispiel Code):
procedure TMainForm.AdjustActionsEnabledSettings;
begin
if MDIChildCount > 0
then
begin
actnFileSave.Enabled:= TRUE;
actnFileSaveAs.Enabled:= TRUE;
actnFilePrintPreview.Enabled:= TRUE;
actnFilePrintSettings.Enabled:= TRUE;
actnEditUndo.Enabled:= TRUE;
actnEditRedo.Enabled:= TRUE;
end else
begin
actnFileSave.Enabled:= FALSE;
actnFileSaveAs.Enabled:= FALSE;
actnFilePrintPreview.Enabled:= FALSE;
actnFilePrintSettings.Enabled:= FALSE;
actnEditUndo.Enabled:= FALSE;
actnEditRedo.Enabled:= FALSE;
end;
end;
Was mir jetzt noch fehlt ist das "richtige" Ereignis, in dem ich so eine Prozedur aufrufen könnte. Es müsste ein Ereignis/eine Situation sein, in der sicher ist, dass bei einem "Child Close" dieses auch zur Laufzeit wirklich geschlossen ist, bevor die Abfrage auf MDIChildCount erfolgt. Ebenso bei "Child Create" - hier müsste das Erstellen schon erfolgt sein, bevor die MDIChildCount - Abfrage ausgeführt wird.
Ob Messages hier der richtige Weg sind ??? Die müssten ja auch an entsprechender Stelle (bspw. aus den Childs) getriggert werden ...aber auch hier lässt sich das Risiko "Child zur Laufzeit wirklich schon geschlossen oder erstellt" nicht ausschliessen (oder seh ich das falsch?).
Hat jemand von Euch eine passende Idee ?