2012-03-19 9 views
7

すべてのメインメニューのアイテムを繰り返し処理しようとしています。問題はサブメニュー項目から始まります。 Menu.Items [i] .Items [j] .Items [k]のような構造は、操作が簡単ではありません。そのための方法はありますか?メインメニューのアイテム(サブアイテムを含む)を繰り返す


私の目標は、すべての項目のキャプションを一覧表示することです。

+0

?あなたは特定のアイテムを見つけることを試みていますか?再帰を使用しなければならないかもしれませんが、そうでないかもしれません。私たちの全体の仕事を教えてください – teran

+0

OK私の目標を追加しました –

+0

私はTMenuItemで再帰を使わなければならないと思います - ちょうど私の中間に来た –

答えて

14

あなたはこのコードそう

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; 
+7

+1私は1/3でコードを減らしました;)_ – NGLN

5

使用のような再帰関数を使用することができます。

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); 
+0

私は1980スタイルが好きです: ) – OnTheFly

+1

私のコードの99%はまだこのスタイルを(多かれ少なかれ)使用しています。 –

関連する問題