2012-03-19 17 views
7

Estoy tratando de iterar sobre todos los elementos del menú principal. El problema comienza en elementos de submenús. La estructura como Menú.Artículos [i] .Items [j] .Items [k] no parece fácil de operar. ¿Hay algún método para eso?Iteración de elementos del menú principal (incluidos los subelementos)


Mi objetivo es listar todos los artículos subtítulos.

+0

cuál es el objetivo de la iteración? ¿Estás tratando de encontrar el artículo especificado? puede ser que tenga que usar recursividad, puede ser que no. díganos toda la tarea – teran

+0

bien agregué mi objetivo también –

+0

Creo que tendré que usar recursión en TMenuItem - acaba de llegar a mi medio –

Respuesta

14

Se puede utilizar una función recursiva al igual que

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 _Y reduje el código en un tercio;) _ – NGLN

5

Usar este código:

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; 

utilizarlo como:

VAR MI : TMenuItem; 
FOR MI IN AllItems(MainMenu) DO ProcessMenuItem(MI); 
+0

Me gusta el estilo de 1980: -) – OnTheFly

+1

El 99% de mi código todavía usa este estilo (más o menos). –

Cuestiones relacionadas