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;