procedure TForm1.Button1Click(Sender: TObject); var i:integer; level:integer; treenode:ttreenode; menuitem:tmenuitem; procedure addmenu(var item:ttreenode;var menuitems:tmenuitem;level:integer); var i:integer; treenode:ttreenode; menuitem:tmenuitem; begin for i:=0 to item.Count-1 do if item.Item[i].Level=level then begin treenode:=item.Item[i]; menuitem:=tmenuitem.Create(self); menuitem.Caption:=treenode.Text; menuitems.Add(menuitem); if treenode.HasChildren then addmenu(treenode,menuitem,level+1); end; end; begin PopupMenu1.Items.Clear; level:=0; for i:=0 to treeview1.items.Count-1 do if treeview1.Items[i].Level=level then begin treenode:=treeview1.Items[i]; menuitem:=tmenuitem.Create(self); menuitem.Caption:=treenode.Text; PopupMenu1.items.Add(menuitem); if treenode.HasChildren then addmenu(treenode,menuitem,level+1); end; end; 我用的是这种方法实现treeview创建的菜单
var
i : Integer;
myMenu : TMenuItem;
begin
//这儿加上递归结束的条件
myMenu := TMenuItem.Create(self);
myMenu.Caption := '...';
PMenu.Insert(myMenu.Count,myMenu);
AddPopMenu(myMenu);
end;
为了方便你理解,这里我写了实例,你只用建个新project
并在form的onmouseup里写下以下代码,可以看看效果!
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
tpm:TPopupMenu;
mit,mit1,mit2:TMenuItem;
tp:TPoint;
begin
if Button=mbRight then begin
tpm:=TPopupMenu.Create(Self);
mit:=TMenuItem.Create(tpm);
mit.Caption:='Test 1';
tpm.Items.Insert(0,mit);
mit1:=TMenuItem.Create(tpm);
mit1.Caption:='Test 2';
mit.Insert(0,mit1); mit2:=TMenuItem.Create(tpm);
mit2.Caption:='Test 3';
mit1.Insert(0,mit2); tp.x:=X; tp.y:=Y;
tp:=ClientToScreen(tp);
tpm.Popup(tp.x,tp.y);
end;
end;
我现在的难题是,我已经把treeview动态创建成了菜单,但是listview并没有,你看看那个截图的连接旧明白了,我想要得是那种效果,我的treeview的每个节点名称就是相应的数据库表名,listview就是相应表的字段!
比如我有adotable ,treeview,listview,
treeview显示的是adotable所有表的内容
listview显示的是treeview相应节点名称=adotable.tablename,
现在想实现动态菜单,把treeview和list结合起来,
你看看那个图片啊,
比如我有adotable ,treeview,listview,
treeview显示的是adotable所有表的名字
listview显示的是treeview相应节点名对应表名的字段
现在想实现动态菜单,把treeview和list结合起来
oicq:3950496,如果不嫌弃我是个菜鸟,加我,这样快一点
对于TreeView我们从根开始建立TMenuItem
就以你说的图为例子
"网站地址"对应MenuItem1
然后"电脑类"对应MenuItem2(当然是MenuItem的子Item)
往下推,到"下载软件网站"时读库继续建立其子Item以上可以做到吧?
var
i:integer;
level:integer;
treenode:ttreenode;
menuitem:tmenuitem;
procedure addmenu(var item:ttreenode;var menuitems:tmenuitem;level:integer);
var
i:integer;
treenode:ttreenode;
menuitem:tmenuitem;
begin
for i:=0 to item.Count-1 do
if item.Item[i].Level=level then
begin
treenode:=item.Item[i];
menuitem:=tmenuitem.Create(self);
menuitem.Caption:=treenode.Text; menuitems.Add(menuitem);
if treenode.HasChildren then
addmenu(treenode,menuitem,level+1);
end;
end;
begin
PopupMenu1.Items.Clear;
level:=0;
for i:=0 to treeview1.items.Count-1 do
if treeview1.Items[i].Level=level then
begin
treenode:=treeview1.Items[i];
menuitem:=tmenuitem.Create(self);
menuitem.Caption:=treenode.Text; PopupMenu1.items.Add(menuitem);
if treenode.HasChildren then
addmenu(treenode,menuitem,level+1);
end;
end;
我用的是这种方法实现treeview创建的菜单