您的位置:首页 > 编程语言 > Delphi

Delphi 树形控件(TreeView)结点间的拖动

2011-08-25 11:46 288 查看
TTreeView是VCL里面一个类。与TreeView相关的一个极其重要的类就是结点(TTreeNode)。


基础知识介绍:

1>.OnMouseDown:鼠标按下时发生(拖动开始,在其内要写入开启拖动的代码)。

2>.OnDragOver:在拖动过程中发生(拖动过程,实现对结点拖动到目的结点的控制)。

3>.OnDragDrop:拖动释放时发生(拖动结束,其是实现拖动释放的操作)。

4>.ImageIndex:指示在树视图的相关图像列表中哪一幅图像将出现在树结点的标题旁。

SelectIndex:指当结点被选中时所使用图像的索引。

stateIndex:确定将哪一幅图像用于树结点。

1.首先是OnMouseDown事件。

procedureTfrmMain.TreeView1MouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);

var

node:TTreeNode;

begin

node:=TreeView1.GetNodeAt(X,Y);//获取鼠标按下位置的结点

//node.Level是结点的层级,等于0时,表示是根节点(没有上级结点了)

if(node<>nil)and(node.Level>0)and(Button=mbLeft)then

TreeView1.BeginDrag(True);//启动拖动

end;

需要注意的是,TreeView控件的DragMode要设置为dmManual,才会需要执行BeginDrag手工启动拖动。DragMode默认为dmManual。


2、接下来就是OnDargOver事件。

procedureTfrmMain.TreeView1DragOver(Sender,Source:TObject;X,Y:Integer;State:TDragState;varAccept:Boolean);

var

node:TTreeNode;

begin

node:=TreeView1.GetNodeAt(X,Y);

//本语句控制只能将结点拖动到与父结点平级的其他节点上Accept表示是否可释放

if(node<>nil)and(node.Level=0)and(TreeView1.Selected.Parent<>node)then

Accept:=True//Accept表示是否可释放

else

Accept:=False;

end;


3.最后是实现OnDragDrop事件,此事件里就要写上与业务相关的代码了。

procedureTfrmMain.TreeView1DragDrop(Sender,Source:TObject;X,Y:Integer);

var

node:TTreeNode;

begin

node:=TreeView1.GetNodeAt(X,Y);

if(node<>nil)and(node.Level=0)then

begin

//用到了StateIndex储存每条记录的主键值,StateIndex默认为状态图标

Query1.SQL.Text:='updateTBL_StudentsetCid='+IntToStr(node.StateIndex)+'whereid='+IntToStr

(TreeView1.Selected.StateIndex);

ifQuery1.ExecSQL()>0then

//将结点移动到目标结点的下一级,也就是使目标节点成为被拖动结点的父结点

TreeView1.Selected.MoveTo(node,naAddChild);

end;

end;


4.心得:

上面这种方法是手动启动拖动功能,但是在实现的应用过程中,展开结点或关闭结点时,容易出现误差,

实用性很差。所以最好是使用默认的自动启动功能,既把TreeView控件的DragMode要设置为dmAutomatic,然

后如上所示设置:OnDragOver,OnDragDrop两个事件即可。

但在制作浮动的工具条时,把DragMode设置为:dmAutomatic;就来带来很多的问题:

1、哪怕是单击一下工具条不做任何拖动,都会使它变成浮动的工具条。

2、拖离窗体后变成浮动的工具条无法停靠回原来的位置。

3、浮动的工具条窗口可以被关闭,但是关闭之后没有办法调出。

由于这样一些问题,所以,需要使用手工的办法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: