Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi MainMenu komplett durchlaufen (https://www.delphipraxis.net/103250-mainmenu-komplett-durchlaufen.html)

dot 13. Nov 2007 09:21


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:
//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;
danke für die hilfe gruss dot

Nuclear-Ping 13. Nov 2007 09:34

Re: MainMenu komplett durchlaufen
 
Du brauchst ne Funktion, die im Falle von Untermenüs sich selber mit dem jeweiligen Menüeintrag wieder aufruft (Rekursion).

Deep-Sea 13. Nov 2007 09:35

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;

marabu 13. Nov 2007 09:38

Re: MainMenu komplett durchlaufen
 
Hallo,

ich würde es so probieren:

Delphi-Quellcode:
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;
Grüße vom marabu

dot 13. Nov 2007 10:16

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;

dot 13. Nov 2007 10:18

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