Autor Beitrag
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 05.04.13 17:31 
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
ausblenden 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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Fr 05.04.13 17:46 
Ungetestet:
ausblenden 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.

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Fr 05.04.13 18:04 
Hallo,
Danke für die schnelle Antwort. Funktioniert mit einer kleinen Änderung perfekt.
ausblenden 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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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:
ausblenden 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]

Für diesen Beitrag haben gedankt: Mathematiker