Перебор элементов главного меню (включая подэлементы) - PullRequest
7 голосов
/ 19 марта 2012

Я пытаюсь перебрать все пункты главного меню. Проблема начинается с пунктов подменю. Структура, подобная Menu.Items [i] .Items [j] .Items [k], не выглядит простой в использовании. Есть ли способ для этого?


Моя цель - перечислить все подписи к пунктам.

Ответы [ 2 ]

14 голосов
/ 19 марта 2012

Вы можете использовать рекурсивную функцию, например, так:

procedure TForm1.ProcessMenu(AMenu: TMenuItem);
var
  i: integer;
begin
  for i := 0 to AMenu.Count - 1 do
  begin
    Memo1.Lines.Add(AMenu[i].Caption);
    ProcessMenu(AMenu[i]);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ProcessMenu(MainMenu1.Items);
end;
5 голосов
/ 19 марта 2012

Используйте этот код:

USES Menus;

TYPE TItemArr = ARRAY OF TMenuItem;

FUNCTION AllItems(MainMenu : TMainMenu) : TItemArr;
  VAR
    I : Cardinal;

  PROCEDURE Parse(VAR Result : TItemArr ; Item : TMenuItem);
    VAR
      I : Cardinal;

    BEGIN
      SetLength(Result,SUCC(LENGTH(Result)));
      Result[HIGH(Result)]:=Item;
      FOR I:=1 TO Item.Count DO Parse(Result,Item.Items[PRED(I)])
    END;

  BEGIN
    SetLength(Result,0);
    FOR I:=1 TO MainMenu.Items.Count DO Parse(Result,MainMenu.Items[PRED(I)])
  END;

Используйте это как:

VAR MI : TMenuItem;
FOR MI IN AllItems(MainMenu) DO ProcessMenuItem(MI);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...