其实最简单,最方便的方法是这个: function CountMenuItem(AForm: TForm): Integer; var i: Integer; begin Result := 0; for i := 0 to AForm.ComponentCount - 1 do if AForm.Components[i] is TMenuItem then Inc(Result); end;
这里有个递归算法参考一下 //============================================================================== //'菜单'解构成'树'(Recursion为递归)********************************************* //============================================================================== procedure MenuToTree(Menu: TMenu; var Tree: TTreeView; DestinationNode: TTreeNode; Expand: Boolean); procedure RecursionTree(MenuItem: TMenuItem; TreeNode: TTreeNode); var i: Integer; Node: TTreeNode; begin for i:=1 to GetMenuItemCount(MenuItem.Handle) do if MenuItem.Items[i-1].Caption<>'-' then begin Node := Tree.Items.AddChild(TreeNode,MenuItem.Items[i-1].Caption); Node.Data := Pointer(MenuItem.Items[i-1].Name); RecursionTree(MenuItem.Items[i-1],Node); end; end; var i: Integer; Node: TTreeNode; begin for i:=1 to GetMenuItemCount(Menu.Handle) do begin Node := Tree.Items.AddChild(DestinationNode,Menu.Items[i-1].Caption); Node.Data := Pointer(Menu.Items[i-1].Name); RecursionTree(Menu.Items[i-1],Node); if Expand then Tree.FullExpand else Tree.FullCollapse; end; end;
procedure TForm1.MenuItemClick(Sender: TObject); var vMenuItem: TMenuItem; S: string; begin vMenuItem := TMenuItem(Sender); S := ''; while Assigned(vMenuItem) do begin //S := StripHotkey(vMenuItem.Caption) + '\' + S; S := IntToStr(vMenuItem.MenuIndex) + '\' + S; vMenuItem := vMenuItem.Parent; end; Delete(S, 1, 1); Delete(S, Length(S), 1); Caption := S; end;
function CountMenuItem(AForm: TForm): Integer;
var
i: Integer;
begin
Result := 0;
for i := 0 to AForm.ComponentCount - 1 do
if AForm.Components[i] is TMenuItem then
Inc(Result);
end;
//==============================================================================
//'菜单'解构成'树'(Recursion为递归)*********************************************
//==============================================================================
procedure MenuToTree(Menu: TMenu; var Tree: TTreeView; DestinationNode: TTreeNode; Expand: Boolean);
procedure RecursionTree(MenuItem: TMenuItem; TreeNode: TTreeNode);
var i: Integer;
Node: TTreeNode;
begin
for i:=1 to GetMenuItemCount(MenuItem.Handle) do
if MenuItem.Items[i-1].Caption<>'-' then
begin
Node := Tree.Items.AddChild(TreeNode,MenuItem.Items[i-1].Caption);
Node.Data := Pointer(MenuItem.Items[i-1].Name);
RecursionTree(MenuItem.Items[i-1],Node);
end;
end;
var i: Integer;
Node: TTreeNode;
begin
for i:=1 to GetMenuItemCount(Menu.Handle) do
begin
Node := Tree.Items.AddChild(DestinationNode,Menu.Items[i-1].Caption);
Node.Data := Pointer(Menu.Items[i-1].Name);
RecursionTree(Menu.Items[i-1],Node);
if Expand then Tree.FullExpand else Tree.FullCollapse;
end;
end;
var
vMenuItem: TMenuItem;
S: string;
begin
vMenuItem := TMenuItem(Sender);
S := '';
while Assigned(vMenuItem) do begin
//S := StripHotkey(vMenuItem.Caption) + '\' + S;
S := IntToStr(vMenuItem.MenuIndex) + '\' + S;
vMenuItem := vMenuItem.Parent;
end;
Delete(S, 1, 1);
Delete(S, Length(S), 1);
Caption := S;
end;