请问,如何在运行时利用鼠标拖动treeview的节点来更改节点位置?

解决方案 »

  1.   

    下面的程序片段演示了如何实现拖拽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;