下面是单向拖拽,如果要互相拖拽,原理是相同的。
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.TreeView2DragOver(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.TreeView2DragDrop(Sender, Source: TObject; X, Y: Integer);
var
TempNode : TTreeNode;
AttachMode : TNodeAttachMode;
begin
if Treeview1.Selected = nil then
Exit;
AttachMode := naAddChild; {设置结点移动模式,设移动结点为子结点}
{ 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,}
{ 则加入的新的子结点会失败,所以先在当前目标结点的下面 }
{ 加入一个临时子结点,移动完毕后,再将临时结点删除 }
Treeview2.Items.BeginUpdate;
try
TempNode := Treeview2.Items.AddChild( Treeview1.DropTarget, 'Temp ' );
try
{ 移动选中的结点到目标结点 }
Treeview1.Selected.MoveTo(Treeview2.DropTarget, AttachMode);
finally
TempNode.Free; { 不要忘了释放临时结点 }
end;
finally
Treeview2.Items.EndUpdate;
end;
两个treeview之间的拖拽
最新推荐文章于 2022-12-14 14:26:02 发布