![]() |
MainMenu komplett durchlaufen
Hallo Leute, wie kann man ein MainMenu komplett ( in der schleife ) durchlaufen ?
ich habe es so probiert aber sobald elemente im Untermenu vorhanden sind klappt es nicht mehr???
Delphi-Quellcode:
danke für die hilfe gruss dot
//Für Obere Menüitems
for i := 0 to fMenu.Items.Count -1 do begin fMenu.Items[i].OnDrawItem := MenuDraw; end; //Für Unteritems for i := 0 to fMenu.Items.Count -1 do begin for j:= 0 to fMenu.Items[i].Count -1 do if fMenu.Items[i].Items[j].caption = '-' then begin fMenu.Items[i].Items[j].OnDrawItem := SeparatorDrawItem; fMenu.Items[i].Items[j].OnMeasureitem := MeasureSeparator; end else begin fMenu.Items[i].Items[j].onDrawItem := MenuItemDrawItem; fMenu.Items[i].Items[j].OnMeasureitem := MenuItemMeasureItem; end; end; |
Re: MainMenu komplett durchlaufen
Du brauchst ne Funktion, die im Falle von Untermenüs sich selber mit dem jeweiligen Menüeintrag wieder aufruft (Rekursion).
|
Re: MainMenu komplett durchlaufen
Die Funktion sollte doch rekursiv sein, denn du kannst ja mehrere Untermenüs haben.
Sprich als Pseudocode ca. so:
Delphi-Quellcode:
Funktion XYZ(AItem);
begin Gehe alle Items von AItem druch ... begin Setze Eigenschaften des aktuelle Items. Rufe XYZ auf und übergebe das aktuelle Item als Parameter. end; end; |
Re: MainMenu komplett durchlaufen
Hallo,
ich würde es so probieren:
Delphi-Quellcode:
Grüße vom marabu
type
TEnumMenuItemProc = procedure (item: TMenuItem) of object; procedure TDemoForm.EnumMenuItem(item: TMenuItem); begin with item do if IsLine then begin OnDrawItem := SeparatorDrawItem; OnMeasureitem := MeasureSeparator; end else begin onDrawItem := MenuItemDrawItem; OnMeasureitem := MenuItemMeasureItem; end; end; procedure EnumerateMenuItems(item: TMenuItem; proc: TEnumMenuItemProc); var i: Integer; subItem: TMenuItem; begin for i := 0 to Pred(item.Count) do begin subItem := item.Items[i]; proc(subItem); if subItem.Count > 0 then EnumerateMenuItems(subItem, proc); end; end; procedure TDemoForm.Button3Click(Sender: TObject); begin EnumerateMenuItems(MainMenu.Items, EnumMenuItem); end; |
Re: MainMenu komplett durchlaufen
wow super danke, es klappt perfekt, ja mein ansatz war falsch, jetzt schreib ich nach enum... noch meine funktion die den Oberitems andere Proceduren zuweist als den Unteritems ...
Delphi-Quellcode:
constructor TMainMenueDrawObj.Create(AOwner: TMainMenu);
var I, j : Integer; begin inherited Create(AOwner); fMenu := AOwner; fMenu.OwnerDraw := True; EnumerateMenuItems(fMenu.Items, EnumMenuItem); for i := 0 to fMenu.Items.Count -1 do begin fMenu.Items[i].OnDrawItem := MenuDraw; end; |
Re: MainMenu komplett durchlaufen
was ich natürlich auch nicht wusste ist die Abfrage auf : Isline, meine lösung mit Captione = '-' ist doch sehr unvorteilhaft gewesen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz