这个是两层的遍历,多层的因该用递归算法,你自己写写看,不难得 var i, j: integer; node: TTreenode; begin for i := 0 to MainMenu1.Items.Count - 1 do begin node := TreeView1.Items.Add(nil, MainMenu1.Items[i].Caption); for j := 0 to mainmenu1.Items[i].Count - 1 do begin TreeView1.Items.Addchild(node, mainmenu1.Items[i].Items[j].Caption); end; end;end;
递归算法的,拿去!type TForm1 = class(TForm) MainMenu1: TMainMenu; ... Button1: TButton; TreeView1: TTreeView; procedure Button1Click(Sender: TObject); private { Private declarations } procedure AddAMenuItem(AMenuItem:TMenuItem;ANode:TTreeNode); public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}{ TForm1 }procedure TForm1.AddAMenuItem(AMenuItem: TMenuItem;aNode:TTreeNode); var i,j,k:Integer; s:String; curNode:TTreeNode; begin curNode := nil; s:=AMenuItem.Caption; //取菜单项的标题! k:=Pos('&',s); if k > 0 then Delete(s,k,1); //删除菜单项标题中的“&”符 if s <> '-' then //如果是菜单分隔符“-”就不处理! curNode := TreeView1.Items.AddChild(aNode,s); J:=AMenuItem.Count; if J > 0 then //有子菜单,就遍历 for i := 0 to j - 1 do begin AddAMenuItem(AMenuItem.Items[i],curNode); end; end;procedure TForm1.Button1Click(Sender: TObject); var a:Integer; aNode:TTreeNode; begin aNode := TreeView1.Items.GetFirstNode; //取Treeview的根 for a := 0 to MainMenu1.Items.Count - 1 do begin AddAMenuItem(MainMenu1.Items[a],aNode); end; end;end.
for i := 0 to frm_main.ComponentCount -1 do begin if (Frm_main.Components[i] is TMenuItem) then begin showmessage((Frm_main.Components[i] as TMenuItem).Caption); end; end;
for i := 0 to frm_main.ComponentCount -1 do begin if (Frm_main.Components[i] is TMenuItem) then begin showmessage((Frm_main.Components[i] as TMenuItem).Caption); end; end;这个循环找不到TMenuItem组件哦
procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=0 to self.ComponentCount-1 do if self.Components[i] is TMenuItem then listbox1.Items.Add((self.Components[i] as TMenuItem).Caption); end;
procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=0 to self.ComponentCount-1 do if self.Components[i] is TMenuItem then listbox1.Items.Add((self.Components[i] as TMenuItem).Caption); end;ListBox1为空!!!
//我用了tactionList和mainmenu相结合... procedure TfrmMain.SetAction(); var i: Integer; iTag:Integer; begin if G_bAdmin then for i:=0 to AlModule.ActionCount -1 do (AlModule.Actions[i] as TAction).Enabled :=G_bAdmin// and G_bTakeEffect else for i:=0 to AlModule.ActionCount -1 do begin iTag:= (AlModule.Actions[i] as TAction).Tag; //ȨÏÞ±íÖÐÊÇ·ñÓдËÄ£¿é (AlModule.Actions[i] as TAction).Enabled := DModule.spUserRight.Locate('fModuleID',iTag,[]); //and G_bTakeEffect; end;
procedure TForm1.BiuldMenu(const StrNodes: string; var MainMenu: TMainMenu); var i, j: Integer; Level: Integer; MenuStrs: string; ItemID: string; ItemName: string; StrLst: TStringList; Flag: Boolean; ParentID: Integer; PParentItem: ^TMenuITem; begin MenuStrs := StrNodes; StrLst := TStringList.Create; try StrLst.Text := StringReplace(MenuStrs, #8, #13#10, [rfReplaceAll]); FMenuItemCount := StrLst.Count; SetLength(FMenuItem, FMenuItemCount); // FMenuItem定义为Private for i := 0 to StrLst.Count - 1 do begin FMenuItem[i] := TMenuITem.Create(nil); FMenuItem[i].Name := 'SubItem' + IntToStr(i); end;
j := 0; PParentItem := nil; // 为了使Delphi不提示警告, 其实一定会被赋值的; while SplitStr(MenuStrs, ItemName, ItemID) do begin Flag := False; with MainMenu do begin Level := Length(ItemID) div 2; if Level = 1 then begin FMenuItem[j].Tag := StrToInt(ItemID); FMenuItem[j].Caption := ItemName; FMainMenu.Items.Add(FMenuItem[j]); FMenuItem[j].OnClick := TestClick; Inc(j); Continue; end else begin for i := 0 to Items.Count - 1 do if Items[i].Tag = StrToInt((Copy(ItemID,1,Level * 2 -2))) then begin FMenuItem[j].Tag := StrToInt(ItemID); FMenuItem[j].Caption := ItemName; Items[i].Add(FMenuItem[j]); FMenuItem[j].OnClick := TestClick; inc(j); Flag := True; end; if Flag then Continue; if FMenuItem[j - 1].Tag = StrToInt(Copy(ItemID,1,Level * 2 -2)) then begin FMenuItem[j].Tag := StrToInt(ItemID); FMenuItem[j].Caption := ItemName; ParentID := j - 1; FMenuItem[ParentID].Add(FmenuItem[j]); PParentItem := @FMenuItem[ParentID]; FMenuItem[j].OnClick := TestClick; inc(j); Continue; end; if Length(IntToStr(FMenuItem[j - 1].Tag)) = Length(ItemID) then begin FMenuItem[j].Tag := StrToInt(ItemID); FMenuItem[j].Caption := ItemName; PParentItem^.Add(FMenuItem[j]); FMenuItem[j].OnClick := TestClick; inc(j); end; end; end; end; finally StrLst.Free; end; end;// 自己搞定的,只是与库结构和中间层返回的字符串格式有关. // 不过还是很多谢大家的,不管是骂我的还是帮我的,一起谢谢了!!!!
var
i, j: integer;
node: TTreenode;
begin
for i := 0 to MainMenu1.Items.Count - 1 do
begin
node := TreeView1.Items.Add(nil, MainMenu1.Items[i].Caption);
for j := 0 to mainmenu1.Items[i].Count - 1 do
begin
TreeView1.Items.Addchild(node, mainmenu1.Items[i].Items[j].Caption);
end;
end;end;
TForm1 = class(TForm)
MainMenu1: TMainMenu;
...
Button1: TButton;
TreeView1: TTreeView;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure AddAMenuItem(AMenuItem:TMenuItem;ANode:TTreeNode);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}{ TForm1 }procedure TForm1.AddAMenuItem(AMenuItem: TMenuItem;aNode:TTreeNode);
var
i,j,k:Integer;
s:String;
curNode:TTreeNode;
begin
curNode := nil;
s:=AMenuItem.Caption; //取菜单项的标题!
k:=Pos('&',s);
if k > 0 then
Delete(s,k,1); //删除菜单项标题中的“&”符
if s <> '-' then //如果是菜单分隔符“-”就不处理!
curNode := TreeView1.Items.AddChild(aNode,s);
J:=AMenuItem.Count;
if J > 0 then //有子菜单,就遍历
for i := 0 to j - 1 do
begin
AddAMenuItem(AMenuItem.Items[i],curNode);
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
a:Integer;
aNode:TTreeNode;
begin
aNode := TreeView1.Items.GetFirstNode; //取Treeview的根
for a := 0 to MainMenu1.Items.Count - 1 do
begin
AddAMenuItem(MainMenu1.Items[a],aNode);
end;
end;end.
if (Frm_main.Components[i] is TMenuItem) then begin
showmessage((Frm_main.Components[i] as TMenuItem).Caption);
end;
end;
if (Frm_main.Components[i] is TMenuItem) then begin
showmessage((Frm_main.Components[i] as TMenuItem).Caption);
end;
end;这个循环找不到TMenuItem组件哦
var
i:integer;
begin
for i:=0 to self.ComponentCount-1 do
if self.Components[i] is TMenuItem then
listbox1.Items.Add((self.Components[i] as TMenuItem).Caption);
end;
var
i:integer;
begin
for i:=0 to self.ComponentCount-1 do
if self.Components[i] is TMenuItem then
listbox1.Items.Add((self.Components[i] as TMenuItem).Caption);
end;ListBox1为空!!!
procedure TfrmMain.SetAction();
var
i: Integer;
iTag:Integer;
begin
if G_bAdmin then
for i:=0 to AlModule.ActionCount -1 do
(AlModule.Actions[i] as TAction).Enabled :=G_bAdmin// and G_bTakeEffect
else
for i:=0 to AlModule.ActionCount -1 do
begin
iTag:= (AlModule.Actions[i] as TAction).Tag;
//ȨÏÞ±íÖÐÊÇ·ñÓдËÄ£¿é
(AlModule.Actions[i] as TAction).Enabled :=
DModule.spUserRight.Locate('fModuleID',iTag,[]);
//and G_bTakeEffect;
end;
var MainMenu: TMainMenu);
var
i, j: Integer;
Level: Integer;
MenuStrs: string;
ItemID: string;
ItemName: string;
StrLst: TStringList;
Flag: Boolean;
ParentID: Integer;
PParentItem: ^TMenuITem;
begin
MenuStrs := StrNodes;
StrLst := TStringList.Create;
try
StrLst.Text := StringReplace(MenuStrs, #8, #13#10, [rfReplaceAll]);
FMenuItemCount := StrLst.Count;
SetLength(FMenuItem, FMenuItemCount); // FMenuItem定义为Private
for i := 0 to StrLst.Count - 1 do
begin
FMenuItem[i] := TMenuITem.Create(nil);
FMenuItem[i].Name := 'SubItem' + IntToStr(i);
end;
j := 0;
PParentItem := nil; // 为了使Delphi不提示警告, 其实一定会被赋值的;
while SplitStr(MenuStrs, ItemName, ItemID) do
begin
Flag := False;
with MainMenu do
begin
Level := Length(ItemID) div 2;
if Level = 1 then
begin
FMenuItem[j].Tag := StrToInt(ItemID);
FMenuItem[j].Caption := ItemName;
FMainMenu.Items.Add(FMenuItem[j]);
FMenuItem[j].OnClick := TestClick;
Inc(j);
Continue;
end
else begin
for i := 0 to Items.Count - 1 do
if Items[i].Tag = StrToInt((Copy(ItemID,1,Level * 2 -2))) then
begin
FMenuItem[j].Tag := StrToInt(ItemID);
FMenuItem[j].Caption := ItemName;
Items[i].Add(FMenuItem[j]);
FMenuItem[j].OnClick := TestClick;
inc(j);
Flag := True;
end;
if Flag then Continue;
if FMenuItem[j - 1].Tag = StrToInt(Copy(ItemID,1,Level * 2 -2)) then
begin
FMenuItem[j].Tag := StrToInt(ItemID);
FMenuItem[j].Caption := ItemName;
ParentID := j - 1;
FMenuItem[ParentID].Add(FmenuItem[j]);
PParentItem := @FMenuItem[ParentID];
FMenuItem[j].OnClick := TestClick;
inc(j);
Continue;
end; if Length(IntToStr(FMenuItem[j - 1].Tag)) =
Length(ItemID) then
begin
FMenuItem[j].Tag := StrToInt(ItemID);
FMenuItem[j].Caption := ItemName;
PParentItem^.Add(FMenuItem[j]);
FMenuItem[j].OnClick := TestClick;
inc(j);
end;
end;
end;
end;
finally
StrLst.Free;
end;
end;// 自己搞定的,只是与库结构和中间层返回的字符串格式有关.
// 不过还是很多谢大家的,不管是骂我的还是帮我的,一起谢谢了!!!!