实现TreeView结点拖拽的实例 
下面的程序片段演示了如何实现拖拽treeview构件结点的例子 {鼠标按下时执行的语句} 
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; 

解决方案 »

  1.   

    listbox的拖动操作
    比如窗体上有两个Listbox,下面将Listbox2中的项目拖到ListBox1中
    将两个Listbox的DragMode属性设为dmAutomatic.拖放经过事件
    procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      if TListBox(Source)=ListBox2 then
        Accept:=true;
    end;//拖放落下事件
    procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
    begin
      ListBox1.Items.Add(Listbox2.Items[ListBox2.ItemIndex]);
    end;