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

TTreeView是VCL里面一个类。与TreeView相关的一个极其重要的类就是结点(TTreeNode)。
 
基础知识介绍:
1>. OnMouseDown :鼠标按下时发生(拖动开始,在其内要写入开启拖动的代码)。 
2>. OnDragOver :在拖动过程中发生(拖动过程,实现对结点拖动到目的结点的控制)。 
3>. OnDragDrop :拖动释放时发生(拖动结束,其是实现拖动释放的操作)。 
4>. ImageIndex: 指示在树视图的相关图像列表中哪一幅图像将出现在树结点的标题旁。
    SelectIndex: 指当结点被选中时所使用图像的索引。
    stateIndex:确定将哪一幅图像用于树结点。

1.首先是 OnMouseDown 事件。

procedure TfrmMain.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 事件。
procedure TfrmMain.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: 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 事件,此事件里就要写上与业务相关的代码了。
procedure TfrmMain.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 := 'update TBL_Student set Cid=' + IntToStr(node.StateIndex) + ' where id=' + IntToStr   
                            (TreeView1.Selected.StateIndex); 
      if Query1.ExecSQL() > 0 then 
            // 将结点移动到目标结点的下一级,也就是使目标节点成为被拖动结点的父结点 
            TreeView1.Selected.MoveTo(node, naAddChild);        
      end; 
end; 

 

4. 心得:

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

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

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

 

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

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

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

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

由于这样一些问题,所以,需要使用手工的办法。

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页