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)