新手请问个树操作的有关问题

新手请教个树操作的问题
想做一个树节点的拖拽程序,在拖拽之后目标树生成新节点,而原树节点不消失,就是象windows那样文件拖拽复制
在网上找了个代码,是原树节点消失的,应该怎么改

鼠标按下时执行的语句}  
procedure   TForm1.Treeview1MouseDown(Sender:   TObject;  
Button:   TMouseButton;   Shift:   TShiftState;   X,   Y:   Integer);  
begin  

{判断左键按下并且鼠标点在一个结点上开始实现拖拽}  
if   (   Button   =   mbLeft   )   and  
(   htOnItem   in   Treeview1.GetHitTestInfoAt(   X,   Y   )   )   then  
begin  
Treeview1.BeginDrag(   False   );  
end;  
end;  

{鼠标拖动执行语句}  
procedure   TForm1.Treeview1DragOver(   Sender,   Source:   TObject;  
X,   Y:   Integer;   State:   TDragState;   var   Accept:   Boolean);  
var  
Node   :   TTreeNode;  
begin  
if   Source   =   Treeview1   then  
begin  
Node   :=   Treeview1.GetNodeAt(   X,   Y   );   {取当前结点}  
if   Node   <>   nil   then   {当前结点不为空才能实现拖拽,accept:=true}  

Accept   :=   true;  
end;  
end;  

{鼠标释放时执行的语句}  
procedure   TForm1.Treeview1DragDrop(   Sender,   Source:   TObject;  
X,   Y   :   Integer   );  
var  
TempNode   :   TTreeNode;  
AttachMode   :   TNodeAttachMode;  
begin  
if   Treeview1.Selected   =   nil   then  
Exit;  

AttachMode   :=   naAddChild;   {设置结点移动模式,设移动结点为子结点}  


{   注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,}  
{   则加入的新的子结点会失败,所以先在当前目标结点的下面   }  
{   加入一个临时子结点,移动完毕后,再将临时结点删除   }  

Treeview1.Items.BeginUpdate;  
try  
TempNode   :=   Treeview1.Items.AddChild(   Treeview1.DropTarget,  
'Temp '   );  
try  
{   移动选中的结点到目标结点   }  
Treeview1.Selected.MoveTo(   Treeview1.DropTarget,   AttachMode   );  
finally  
TempNode.Free;   {   不要忘了释放临时结点   }  
end;  
finally  
Treeview1.Items.EndUpdate;  
end;  
end;


------解决方案--------------------
procedure TForm1.Treeview1DragDrop( Sender, Source: TObject;
X, Y : Integer );
var
ParentNode:TTreeNode;
begin
ParentNode:=TreeView1.GetNodeAt(X, Y);
with TreeView1.Items.AddChild(ParentNode, ' ') do
begin
Assign(TreeView1.Selected);
end;
end;
------解决方案--------------------
如果只复制那个节点,不包括子节点的,楼上的代码比例简洁~
如果要包括子节点的,楼上的就不行了