Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Mainmenu vollständig absuchen


Mathematiker - Fr 05.04.13 17:31
Titel: Mainmenu vollständig absuchen
Hallo,
ich habe ein sehr umfangreiches MainMenu (mehr als 400 Einträge). Den Menüeinträgen habe ich über die Eigenschaft "Tag" unterschiedliche Werte zugeordnet und möchte wahlweise alle Einträge mit dem gleichen Tag-Wert sichtbar/unsichtbar schalten.
Bisher habe ich das Menü über die einzelnen Haupteinträge (obere, sichtbare Menüzeile) mit

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var i,tagwert:integer;
begin
    for I := 0 to untermenu1.Count-1 do
      untermenu1.items[i].visible:=untermenu1.items[i].tag<>tagwert;
    for I := 0 to untermenu2.Count-1 do
      untermenu2.items[i].visible:=untermenu2.items[i].tag<>tagwert;
    for I := 0 to untermenu3.Count-1 do
      untermenu3.items[i].visible:=untermenu3.items[i].tag<>tagwert;
    ... //usw.
end;

aufgerufen und verändert.
Da aber in den Teilmenüs auch weitere Untermenüs existieren, wird das unübersichtlich und vor allem bei evtl. späteren Änderungen aufwendig.
Gibt es eine Möglichkeit das ganze MainMenu (rekursiv?) nach allen Einträgen abzufragen?
Vielen Dank für jeden Hinweis.

Beste Grüße
Mathematiker


WasWeißDennIch - Fr 05.04.13 17:46

Ungetestet:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure ShowItemsByTag(Item: TMenuItem; TagValue: integer);
var
  i: integer;
begin
  Assert(Assigned(Item), 'Kein MenuItem angegeben');
  for i := 0 to Item.Count - 1 do
    begin
      ShowItemsByTag(Item[i], TagValue);
      Item.Visible := Item.Tag <> TagValue;
    end;
end;

procedure TDeinForm.SomeGUIMethod(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to MainMenu.Count - 1 do
    ShowItemsByTag(MainMenu[i], 42);
end;

Wobei man sich auch fragen kann, ob Du mit Actions nicht besser bedient wärst, aber das kannst nur Du beantworten.


Mathematiker - Fr 05.04.13 18:04

Hallo,
Danke für die schnelle Antwort. Funktioniert mit einer kleinen Änderung perfekt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure ShowItemsByTag(Item: TMenuItem; TagValue: integer);
var
  i: integer;
begin
  Assert(Assigned(Item), 'Kein MenuItem angegeben');
  for i := 0 to Item.Count - 1 do
    begin
      ShowItemsByTag(Item[i], TagValue);
      Item[i].Visible := Item[i].Tag <> TagValue;  //Index i angeben
    end;
end;
procedure TDeinForm.SomeGUIMethod(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to MainMenu.items.Count - 1 do //items angeben
    ShowItemsByTag(MainMenu.items[i], 42);  //items angeben
end;


Beste Grüße
Mathematiker


WasWeißDennIch - Fr 05.04.13 18:16

Den Index hatte ich weggelassen, weil ich das übergebene Item (Parameter) ansprechen wollte. Aber wenn es so funktioniert, ist es auch gut.

[edit] Denkfehler meinerseits, so müsste es richtig sein:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure ShowItemsByTag(Item: TMenuItem; TagValue: integer);
var
  i: integer;
begin
  Assert(Assigned(Item), 'Kein MenuItem angegeben');
  for i := 0 to Item.Count - 1 do
    ShowItemsByTag(Item[i], TagValue);
  Item.Visible := Item.Tag <> TagValue;
end;
[/edit]