==如何将一个MainMenu转化为TreeView==(100分)

  • 主题发起人 主题发起人 coolsun
  • 开始时间 开始时间
C

coolsun

Unregistered / Unconfirmed
GUEST, unregistred user!
即实现一个Menu2Tree函数,使一个TreeView按照一个MainMenu的内容一模一样的显示!
最好有一定的代码,谢谢!
 
可不可以这样:将所有的数据保存在taction中,然后分别、赋个treeview 和mainmenu嘛
 
可以啊,提供一些思路噢
后面的自己写。
var
list, node : TStringList;
i, j : Integer;
begin
list := TStringList.Create;
Node := TStringList.Create;
for i := 0 to mm.Items.Count - 1 do
begin
list.Text := mm.Items.Caption;
//处理了菜单
for j := 0 to mm.Items.Count - 1 do
begin
Node.Text := mm.Items.Items[j].Caption;
//处理了菜单下的项目,不包含子菜单,需另外做处理;
end;
end;
//后面直接从两个stringlist中取值,写到treeview中去。
 
var
list, node : TStringList;
i, j : Integer;
begin
list := TStringList.Create;
Node := TStringList.Create;
for i := 0 to mm.Items.Count - 1 do
begin
list.Text := mm.Items.Caption;
//处理了菜单,写到treeview中去
for j := 0 to mm.Items.Count - 1 do
begin
Node.Text := mm.Items.Items[j].Caption;
//处理了菜单下的项目,写到treeview中去(不包含子菜单,需另外做处理);
end;
end;
 
子菜单随便有多少层都可以。我还没想到如何为每个结点添加事件。
Procedure TfrmMenuTree.Button1Click(Sender:TObject);
//内嵌过程,也可以写到外面去
Procedure AddItem(ANode:TTreeNode; menuItem:TMenuItem);
Var
j, k:Integer;
NewNode:TTreeNode;
Begin
k := menuItem.Count;
For j := 0 To k - 1 Do
Begin
//在哪个结点下添加菜单
NewNode := tv.Items.AddChild(ANode, menuItem.Items[j].Caption);
//如果此菜单有子菜单.........
If menuItem.Items[j].Count > 0 Then
AddItem(NewNode, menuItem.Items[j]);
End;
End;
//----------------------------------------
Var
i:Integer;
Node:TTreeNode;
Begin
tv.Items.Clear; //tv是TreeView控件
tv.Items.BeginUpdate;
For i := 0 To MainMenu.Items.Count - 1 Do //MainMenu是form上的一个菜单
Begin
//在TreeView根下添加第一层
Node := tv.Items.Add(Nil, MainMenu.Items.Caption);
//然后处理N层菜单
If MainMenu.Items.Count > 0 Then
AddItem(Node, MainMenu.Items);
End;
tv.Items.EndUpdate;
End;
------------------------------------------------
那个内嵌过程写到外面好看一点
//内嵌过程,也可以写到外面去
Procedure TfrmMenuTree.AddItem(ANode:TTreeNode; menuItem:TMenuItem);
Var
j, k:Integer;
NewNode:TTreeNode;
Begin
k := menuItem.Count;
For j := 0 To k - 1 Do
Begin
//在哪个结点下添加菜单
NewNode := tv.Items.AddChild(ANode, menuItem.Items[j].Caption);
//如果此菜单有子菜单.........
If menuItem.Items[j].Count > 0 Then
AddItem(NewNode, menuItem.Items[j]);
End;
End;
 
var
list, node: TStringList;
MytreeNode : TTreeNode;
i, j: Integer;
begin
list := TStringList.Create;
Node := TStringList.Create;
list.Clear;
Node.Clear;
for i := 0 to mm.Items.Count - 1 do
begin
list.Text := mm.Items.Caption;
MytreeNode := t.Items.Add(nil, list.Text);
for j := 0 to mm.Items.Count - 1 do
begin
Node.Text := mm.Items.Items[j].Caption;
t.Items.AddChild(mytreeNode, Node.Text);
end;
end;
end;
函数自己写吧。
如上解决。如果你需要扩张,则在其中对子菜单进行nil的判断。
 
后退
顶部