gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:05:49 25 4
gpt4 key购买 nike

我有一个节点列表。我想添加拖放重新排列功能,但我不知道如何执行此操作。

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

请注意,这只是一个单级列表。没有等级制度。 :)

最佳答案

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

uses
ActiveX;

将拖动事件分配给树:

OnDragAllowed:

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

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;

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;

另外,不要忘记在 TreeOptions.AutoOptions 中将 toAutoDeleteMoveNodes 设置为 False。

关于delphi - VirtualTreeview 拖放以排列列表中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8487335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com