AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Warp · begonnen am 31. Dez 2008 · letzter Beitrag vom 31. Dez 2008
Antwort Antwort
Warp

Registriert seit: 27. Mai 2006
45 Beiträge
 
Delphi XE4 Professional
 
#1

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

  Alt 31. Dez 2008, 11:43
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#2

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

  Alt 31. Dez 2008, 12:04
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.
Ich bin ja quasi die perfekte Mischung aus jung, aber sehr erfahren.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 31. Dez 2008, 12:34
Wieso benutzt Du nicht das OnUpdate Event Deiner Actions?
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Warp

Registriert seit: 27. Mai 2006
45 Beiträge
 
Delphi XE4 Professional
 
#4

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

  Alt 31. Dez 2008, 12:57
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).
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

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

  Alt 31. Dez 2008, 13:12
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Warp

Registriert seit: 27. Mai 2006
45 Beiträge
 
Delphi XE4 Professional
 
#6

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

  Alt 31. Dez 2008, 13:41
@mirage228:

Klingt gut, probier ich aus...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 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