请问,如何在运行时利用鼠标拖动treeview的节点来更改节点位置?
解决方案 »
- 高分求程序实现弹出USB设备,如U盘
- 郁闷死,好久不用DELPHI,问个最简单的问题。
- 请教高手,关于身份验证的问题
- 我用两个Adoquery连接主从表,为什么从表数据(Dm.ADOQuery_Demand_Today.edit;)无法修改!!!
- 初学者的一点小问题
- 为什么总是提示报[ODBC Microsoft Access Driver]密码无效啊?
- rxlib275控件中的DBGridEh2,怎样实现排序?
- 程序员好书征集!(有回报的哦)
- SpinEdit1、 SpinEdit2分别是分数查询的上限和下限,Achievement是成绩表,怎么出错?
- 急问关于olecontainer的使用问题
- 求解DBgrid的问题!!
- Delphy下怎样选择一个路径,是用OpenDialog对话框吗?
{鼠标按下时执行的语句}
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;