VirtualTreeview拖放以排列列表中的节点

Jef*_*eff 5 delphi drag-and-drop virtualtreeview

我有一个节点列表.我想添加一个拖放到重新排列的功能,但我不知道该怎么做.

我尝试使用TVirtualStringTree的OnDragDrop事件,但我无法理解.我查看了文档,遗憾的是没有用于普通节点拖放的最小示例代码.

请注意,它只是一个单级列表.没有层次.:)

Lin*_*nas 11

如果你通过GetNodeData获取数据,那么拖放可以像这样实现:

uses
  ActiveX;
Run Code Online (Sandbox Code Playgroud)

将拖动事件分配给树:

OnDragAllowed:

procedure TForm1.vt1DragAllowed(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  var Allowed: Boolean);
begin
  Allowed := True;
end;
Run Code Online (Sandbox Code Playgroud)

OnDragOver:

procedure TForm1.vt1DragOver(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState;
  State: TDragState; Pt: TPoint; Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
begin
  Accept := (Source = Sender);
end;
Run Code Online (Sandbox Code Playgroud)

OnDragDrop:

procedure TForm1.vt1DragDrop(Sender: TBaseVirtualTree; Source: TObject; DataObject: IDataObject;
  Formats: TFormatArray; Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  pSource, pTarget: PVirtualNode;
  attMode: TVTNodeAttachMode;
begin
  pSource := TVirtualStringTree(Source).FocusedNode;
  pTarget := Sender.DropTargetNode;

  case Mode of
    dmNowhere: attMode := amNoWhere;
    dmAbove: attMode := amInsertBefore;
    dmOnNode, dmBelow: attMode := amInsertAfter;
  end;

  Sender.MoveTo(pSource, pTarget, attMode, False);

end;
Run Code Online (Sandbox Code Playgroud)

另外不要忘记设置toAutoDeleteMoveNodes为False TreeOptions.AutoOptions.