Delphi Treeview 移动到别一个 Treeview
各位高手:小弟如今要实现将TreeView1中的节点或子节点移动到TreeView2中。如求:移动后TreeView2的结构跟移动前的结构一致,删除TreeView1中已...
各位高手:小弟如今要实现将TreeView1中的节点或子节点移动到TreeView2中。
如求:移动后TreeView2的结构跟移动前的结构一致,删除TreeView1中已移动的内容。
例如:移动TreeView1中一个子节点到TreeView2中,那么需要在TreeView2中创建这个子节点的父节点,这个父节点下再创建被移动的这个子节点,并删除TreeView1中的这个子节点。当然也要实现节点整体移动删除功能。
procedure TForm1.Button1Click(Sender: TObject);
begin
copynode(nil,TreeView1.selected,TreeView1.selected.text);
end;
procedure Tform1.copynode(anode,bnode:TTreeNode;s:string);
var node1,node2:ttreenode;
begin
if anode=nil then
node1:=TreeView2.Items.Addfirst(anode,s)
else
node1:=TreeView2.Items.AddChild(anode,s);
if bnode.HasChildren then
begin
node2:=bnode.getFirstChild;
copynode(node1,node2,node2.text);
while bnode.GetNextchild(node2) <> nil do
begin
node2:=bnode.GetNextChild(node2);
if node2 <> nil then
copynode(node1,node2,node2.text);
end;
end;
end;
我写这个TW2得不到TW1相同的结构,请高手修改。搞定再追加20分 展开
如求:移动后TreeView2的结构跟移动前的结构一致,删除TreeView1中已移动的内容。
例如:移动TreeView1中一个子节点到TreeView2中,那么需要在TreeView2中创建这个子节点的父节点,这个父节点下再创建被移动的这个子节点,并删除TreeView1中的这个子节点。当然也要实现节点整体移动删除功能。
procedure TForm1.Button1Click(Sender: TObject);
begin
copynode(nil,TreeView1.selected,TreeView1.selected.text);
end;
procedure Tform1.copynode(anode,bnode:TTreeNode;s:string);
var node1,node2:ttreenode;
begin
if anode=nil then
node1:=TreeView2.Items.Addfirst(anode,s)
else
node1:=TreeView2.Items.AddChild(anode,s);
if bnode.HasChildren then
begin
node2:=bnode.getFirstChild;
copynode(node1,node2,node2.text);
while bnode.GetNextchild(node2) <> nil do
begin
node2:=bnode.GetNextChild(node2);
if node2 <> nil then
copynode(node1,node2,node2.text);
end;
end;
end;
我写这个TW2得不到TW1相同的结构,请高手修改。搞定再追加20分 展开
展开全部
你既然已经能够创建节点,就可完全可以自己完成这代码,这实际上就是在TW2中创建一个与TW1中相同的节点,并在创建完毕后将TW1选中的节点删除.表面看来是将TW1中的节点拖放到了TW2中,实际是就是一个增加和删除节点的操作.
追问
我是用查询数据库的方式得到树结构的。对这个控件不熟。不知道如何操作它的节点和子节点。
追答
一般来说,通过数据表查询得到的树形结构图,做两个树形图之间的节点移动,意义不是很大,因为你如果想得到一个系列的数据的话,你可以通过另外一条SQL得到一个你想要的树形图.与数据库连接的树形图,最适当的用途是数据编辑导航.比如物业公司收费,业主来缴费,你可以通过树形图来快速检索业主信息,进入该业主的缴费办理界面,实施收费操作.除了导航外,还有一个功能就是数据浏览.如果要作其它使用,如编辑或更新数据,树形就不是那么好用了.因为用起来很麻烦,你像WIN系统的注册表,就是一个庞大的树形图,他也可以新增或修改或删除数据,但是如果不是专业人员,根本就搞不了.编程序,用软件来解决问题,最主要的一点是:把复杂的问题搞简单(,那种办法简单就用那一种,不要在一棵树上吊死,)而不是把简单的问题搞复杂,如果把简单的搞复杂,那你的软件就没有人用了.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
The following code uses GetNodeAt to add a dragged node as a child of the node under then mouse when it is dropped.
~~~~~~~~~~~~~~~~~~~~~~~~~
procedure TForm1.TreeView1DragDrop
(Sender, Source: TObject; X, Y: Integer) ;
var
AnItem: TTreeNode;
AttachMode: TNodeAttachMode;
HT: THitTests;
begin
if TreeView1.Selected = nilthen Exit;
HT := TreeView1.GetHitTestInfoAt(X, Y) ;
AnItem := TreeView1.GetNodeAt(X, Y) ;
if (HT -
[htOnItem, htOnIcon, htNowhere, htOnIndent]
<> HT) then
begin
if (htOnItem in HT) or
(htOnIcon in HT) then
AttachMode := naAddChild
else if htNowhere in HT then
AttachMode := naAdd
else if htOnIndent in HT then
AttachMode := naInsert;
TreeView1.Selected.
MoveTo(AnItem, AttachMode) ;
end;
end;
~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~
procedure TForm1.TreeView1DragDrop
(Sender, Source: TObject; X, Y: Integer) ;
var
AnItem: TTreeNode;
AttachMode: TNodeAttachMode;
HT: THitTests;
begin
if TreeView1.Selected = nilthen Exit;
HT := TreeView1.GetHitTestInfoAt(X, Y) ;
AnItem := TreeView1.GetNodeAt(X, Y) ;
if (HT -
[htOnItem, htOnIcon, htNowhere, htOnIndent]
<> HT) then
begin
if (htOnItem in HT) or
(htOnIcon in HT) then
AttachMode := naAddChild
else if htNowhere in HT then
AttachMode := naAdd
else if htOnIndent in HT then
AttachMode := naInsert;
TreeView1.Selected.
MoveTo(AnItem, AttachMode) ;
end;
end;
~~~~~~~~~~~~~~~~~~~~~~~~~
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询