以下是一段代码,可作参考:
//鼠标按下时执行的语句,在MouseDown事件中加入下列语句
begin
//判断左键按下并且鼠标点在一个结点上开始实现拖拽
if(Button=mbLeft)and(htOnItem in Treeview1.GetHitTestInfoAt(X,Y)) then Treeview1.BeginDrag(False);
end;
//鼠标拖动执行语句,在DragOver事件中加入下列语句
var
Node:TTreeNode;
begin
if Source=Treeview1 then begin
Node:= Treeview1.GetNodeAt(X,Y);{取当前结点}
if Node<>nil then Accept:=true;{当前结点不为空才能实现拖拽,accept:=true}
end;
end;
//鼠标释放时执行的语句,在DragDrop事件中加入下列语句
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;