//SNode是要copy的节点,DNode是目标节点 //你可以用GetNodeAt()来取得DNode procedure CopyNode(DNode, SNode: TTreeNode); var ANode, NextNode : TTreeNode; Owner : TTreeView; SLevel, DLevel :Integer; begin Owner := DNode.TreeView as TTreeView; with Owner do begin if not DNode.HasAsParent(SNode) then begin try try Items.BeginUpdate; NextNode:=Items.AddChild(DNode,SNode.Text); NextNode.Assign(SNode); ANode:=SNode.GetNext; SLevel:=SNode.Level; DLevel:=DNode.Level + 1; while ANode.Level>SNode.Level do begin if(ANode.Level-SLevel)=(NextNode.Level-DLevel)then begin NextNode:=Items.AddChild(NextNode.Parent, ANode.Text); NextNode.Assign(ANode); end else if(ANode.Level-SLevel)> (NextNode.Level-DLevel then begin NextNode:=Items.AddChild(NextNode,ANode.Text); NextNode.Assign(ANode); end else if(ANode.Level-SLevel)< (NextNode.Level-DLevel)then begin while(NextNode.Level-DLevel)> (ANode.Level-SLevel)do NextNode := NextNode.Parent; NextNode:= Items.AddChild(NextNode.Parent,ANode.Text); NextNode.Assign(ANode); end; ANode := ANode.GetNext; if not Assigned(ANode) then Break; Application.ProcessMessages; end; finally Items.EndUpdate; end; except // force repaint on exception (Owner as TWinControl).Invalidate; raise; end; PLifeNode(DNode.Data).Sons.Add(SNode.Data); end else Application.MessageBox('不能copy到子节点', '错误', MB_OK + MB_DEFBUTTON1); end; end;
//你可以用GetNodeAt()来取得DNode
procedure CopyNode(DNode, SNode: TTreeNode);
var
ANode, NextNode : TTreeNode;
Owner : TTreeView;
SLevel, DLevel :Integer;
begin
Owner := DNode.TreeView as TTreeView;
with Owner do
begin
if not DNode.HasAsParent(SNode) then
begin
try
try
Items.BeginUpdate;
NextNode:=Items.AddChild(DNode,SNode.Text);
NextNode.Assign(SNode);
ANode:=SNode.GetNext;
SLevel:=SNode.Level;
DLevel:=DNode.Level + 1; while ANode.Level>SNode.Level do
begin
if(ANode.Level-SLevel)=(NextNode.Level-DLevel)then
begin
NextNode:=Items.AddChild(NextNode.Parent,
ANode.Text);
NextNode.Assign(ANode);
end
else if(ANode.Level-SLevel)>
(NextNode.Level-DLevel then
begin
NextNode:=Items.AddChild(NextNode,ANode.Text);
NextNode.Assign(ANode);
end
else if(ANode.Level-SLevel)<
(NextNode.Level-DLevel)then
begin
while(NextNode.Level-DLevel)>
(ANode.Level-SLevel)do
NextNode := NextNode.Parent;
NextNode:=
Items.AddChild(NextNode.Parent,ANode.Text);
NextNode.Assign(ANode);
end;
ANode := ANode.GetNext;
if not Assigned(ANode) then Break;
Application.ProcessMessages;
end; finally
Items.EndUpdate;
end;
except
// force repaint on exception
(Owner as TWinControl).Invalidate;
raise;
end;
PLifeNode(DNode.Data).Sons.Add(SNode.Data);
end
else
Application.MessageBox('不能copy到子节点', '错误',
MB_OK + MB_DEFBUTTON1);
end;
end;
然后在dragover和dragdrop事件里写处理程序