![]() |
MDI-App, Hauptmenüeinträge enablen/disablen
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:
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.
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; 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 ? |
Re: MDI-App, Hauptmenüeinträge enablen/disablen
Hallo Warp,
hierfür eignet sich die Methode OnIdle, die zwar häufig aufgerufen wird und für CPU-Lastige Funktionalitäten nicht missbraucht werden sollte, aber in deinem Fall die optimale Lösung darstellen sollte:
Delphi-Quellcode:
PS: Code ist ungetestet.//------------------------------------------------------------------------------ // OnIdle: //------------------------------------------------------------------------------ procedure TMainForm.OnIdle(Sender: TObject; var Done: Boolean); var b: Boolean; begin //geht auch kürzer b := (Self.MDiChildCount > 0); actnFileSave.Enabled := b; actnFileSaveAs.Enabled := b; actnFilePrintPreview.Enabled := b; actnFilePrintSettings.Enabled := b; actnEditUndo.Enabled := b; actnEditRedo.Enabled := b; end; //------------------------------------------------------------------------------ // OnIdleInit: Einmal im OnCreate bzw. Konstruktur aufrufen //------------------------------------------------------------------------------ procedure TMainForm.SetApplicationIdleProc; var Done: Boolean; begin Application.OnIdle := OnIdle; Done := True; OnIdle(Self, Done); end; |
Re: MDI-App, Hauptmenüeinträge enablen/disablen
Wieso benutzt Du nicht das OnUpdate Event Deiner Actions?
|
Re: MDI-App, Hauptmenüeinträge enablen/disablen
Erstmal Danke für Eure Antworten.
@bigg: OnIdle habe ich bis jetzt möglichst vermieden, da ich die Grundlast meiner Programme nicht erhöhen wollte (zugegeben - in diesem Fall steckt nicht viel Last dahinter) @mirage228: Werde ich mir anschauen. Wenn es keine anderen Negativwirkungen hat, wäre es ein Lösungsweg (müsste allerdings für einige Actions angebunden werden, während OnIdle ein einziger zentraler Aufrufpunkt wäre). |
Re: MDI-App, Hauptmenüeinträge enablen/disablen
Zitat:
Delphi-Quellcode:
Viele Grüße
procedure TYourForm.OnGeneralActionUpdate(Sender: TObject);
begin TAction(Sender).Enabled := MDIChildCount > 0; end; |
Re: MDI-App, Hauptmenüeinträge enablen/disablen
@mirage228:
Klingt gut, probier ich aus... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz