Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi MDI-App, Hauptmenüeinträge enablen/disablen (https://www.delphipraxis.net/126700-mdi-app-hauptmenueeintraege-enablen-disablen.html)

Warp 31. Dez 2008 10:43


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:
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 ?

bigg 31. Dez 2008 11:04

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:

//------------------------------------------------------------------------------
// 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;
PS: Code ist ungetestet.

mirage228 31. Dez 2008 11:34

Re: MDI-App, Hauptmenüeinträge enablen/disablen
 
Wieso benutzt Du nicht das OnUpdate Event Deiner Actions?

Warp 31. Dez 2008 11:57

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).

mirage228 31. Dez 2008 12:12

Re: MDI-App, Hauptmenüeinträge enablen/disablen
 
Zitat:

Zitat von Warp
@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).

Du kannst ein zentrales OnUpdate definieren und es allen Actions im OnUpdate zuweisen:
Delphi-Quellcode:
procedure TYourForm.OnGeneralActionUpdate(Sender: TObject);
begin
  TAction(Sender).Enabled := MDIChildCount > 0;
end;
Viele Grüße

Warp 31. Dez 2008 12:41

Re: MDI-App, Hauptmenüeinträge enablen/disablen
 
@mirage228:

Klingt gut, probier ich aus...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz