Delphi TreeView树型框节点拖拽停靠、按条件开始拖拽
OnDragOver处理是否允许放下
procedure TMainForm.TreeViewDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); varTargetNode, SourceNode: TTreeNode; beginAccept := False;TargetNode := TTreeView(Sender).GetNodeAt(X, Y);if (Source = Sender) and (TargetNode <> nil) thenbeginAccept := True;SourceNode := TTreeView(Sender).Selected;if TargetNode = SourceNode.Parent thenAccept := False;if Accept thenbeginwhile (TargetNode.Parent <> nil) and (TargetNode <> SourceNode) doTargetNode := TargetNode.Parent;if TargetNode = SourceNode thenAccept := False;end;end; end;
OnDragDrop是放下后节点的处理方法
procedure TMainForm.TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer); varTargetNode, SourceNode: TTreeNode; beginTargetNode := TTreeView(Sender).GetNodeAt(X, Y);if TargetNode <> nil thenbeginSourceNode := TTreeView(Sender).Selected;TTreeView(Sender).Items.BeginUpdate;SourceNode.MoveTo(TargetNode, naAddChildFirst);TTreeView(Sender).Selected := SourceNode;TTreeView(Sender).Items.EndUpdate;end; end;
另外TreeView本身还需要设定支持拖放,俩个方法
1: 静态设定TreeView可以拖放
procedure TMainForm.FormCreate(Sender: TObject); beginTreeView.DragMode := dmAutomatic;// end;
2: 通过事件动态设定
procedure TMainForm.TreeViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); beginif (Button = mbLeft) and (htOnItem in TTreeView(Sender).GetHitTestInfoAt(X, Y)) then //判断是左键并且点击在Item上beginif (ssCtrl in Shift) then //如果按下了Ctrl键TTreeView(Sender).BeginDrag(False); //允许拖放end; end;
总结
以上是生活随笔为你收集整理的Delphi TreeView树型框节点拖拽停靠、按条件开始拖拽的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: php7语法 mysql_php7语法
- 下一篇: 一个垃圾分类项目带你玩转飞桨(2)