すべてのメインメニューのアイテムを繰り返し処理しようとしています。問題はサブメニュー項目から始まります。 Menu.Items [i] .Items [j] .Items [k]のような構造は、操作が簡単ではありません。そのための方法はありますか?メインメニューのアイテム(サブアイテムを含む)を繰り返す
私の目標は、すべての項目のキャプションを一覧表示することです。
すべてのメインメニューのアイテムを繰り返し処理しようとしています。問題はサブメニュー項目から始まります。 Menu.Items [i] .Items [j] .Items [k]のような構造は、操作が簡単ではありません。そのための方法はありますか?メインメニューのアイテム(サブアイテムを含む)を繰り返す
私の目標は、すべての項目のキャプションを一覧表示することです。
あなたはこのコードそう
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;
+1私は1/3でコードを減らしました;)_ – NGLN
使用のような再帰関数を使用することができます。
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);
私は1980スタイルが好きです: ) – OnTheFly
私のコードの99%はまだこのスタイルを(多かれ少なかれ)使用しています。 –
?あなたは特定のアイテムを見つけることを試みていますか?再帰を使用しなければならないかもしれませんが、そうでないかもしれません。私たちの全体の仕事を教えてください – teran
OK私の目標を追加しました –
私はTMenuItemで再帰を使わなければならないと思います - ちょうど私の中間に来た –