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、浮动的工具条窗口可以被关闭,但是关闭之后没有办法调出。
由于这样一些问题,所以,需要使用手工的办法。
相关文章推荐
- Delphi树形控件(TreeView)节点间的拖动
- Delphi 运行时 可拖动控件
- 把自身引用的数据表(树形结构)绑定到TreeView上的控件
- ajaxTree 用Javascript 写的树形导航控件 jsTreeView
- 树形控件TreeView的序列化
- 在winform中从外部拖动节点到树形结构(treeview和listview相互拖动)(一)
- delphi TreeView控件
- JavaScript, AJAX树形控件大全(all kinds of TreeView Controls by JavaScript, AJAX)
- 部门树形结构,使用Treeview控件显示部门
- TreeView树控件—如何使用TreeView树控件结点前的复选框
- 在.Net Framework1.1的环境下,调用TreeView控件,生成树图,点选父节点,则所有的子结点也选中,取消选中的父节点下的子结点,则父节点也取消选中状态。
- Delphi XE2 之 FireMonkey 入门(44) - 控件基础: TTreeView、TTreeViewItem
- DELPHI VCL组件 TTreeList, Listview和Treeview相结合的多列树控件
- TreeView树形控件递归绑定数据库里的数据
- SharePoint2010沙盒解决方案基础开发——关于TreeView树形控件读取列表数据(树形导航)的webpart开发及问题
- Delphi 中 Treeview 控件的节点(Node)焦点问题
- TreeView---利用RecyclerView打造高性能树形控件
- TreeView 树形控件 - asp.net
- Delphi 从数据库中读取数据给TreeView赋值,然后从TreeView结点中读取数据
- TreeView控件结合js树形选择