【发布时间】:2013-11-21 07:05:39
【问题描述】:
A 有一棵树: ROOT - VirtualStringTree(你没看到,TVirtualStringTree.RootNode)
- 我的根节点 1
-
我的根节点 2
- 第二个节点 1
- 第二个节点 2
- 第二个节点 3
- 我的根节点 3
我可以将“我的根节点 3”拖放到任何可见节点,但我无法将其返回到默认位置,即树的根级别。
我试试:
//Part of code from OnDragDrop Event of VirtualStringTree
if (Sender.DropTargetNode = Sender.RootNode) then
begin
for i := 0 to high(Nodes) do
begin
LinksTree.MoveTo(Nodes[i], Sender.DropTargetNode, Attachmode, False);
end;
end;
我将鼠标放在任何地方,但没有任何反应。在 DragOver 中,如果 DropTarget 是 VST.RootNode,我接受 drop to root。
任何人都知道,如果我将鼠标拖动到组件的空白空间,如何将节点拖放到 VST.RootNode?p>
【问题讨论】:
-
假设您将“根节点 3”放在“根节点 1”上并将
AttachMode设置为amInsertBefore,它将被移动到根节点。在PaintOptions中添加toShowDropmark以查看下降标记。我的逻辑如下:如果Mode(TDropMode) 是dmAbove我设置AttachMode := amInsertBefore;dmOnNode -> amAddChildLast;dmBelow -> amInsertAfter. -
@kobik,
dmNowhere拖放模式指示拖放到空白空间,许多示例显示将amNoWhere分配给附加模式。我认为情况就是这样,因为MoveTo的调用看起来是正确的。您可以将节点移动到RootNode(或nil,意思相同),所以我唯一怀疑的是附加模式错误。 -
@TLama,是的,我想提一下
amNoWhere,但你更快:) 无论如何我都没有实现amNoWhere,因为我认为在没有节点的情况下移动节点是错误的 UI 行为可见的目标节点。 -
@kobik,我使用
amNoWhere值只是为了初始化AttachMode局部变量。它涵盖了当我忘记case语句中的某个放置模式并且该变量具有 "random" 值时的情况,因为它是本地的。否则,我还通过仅在有目标时接受OnDragOver事件来防止没有目标节点的情况。 -
@TLama,我明白你的意思了。我以不同的方式处理
case:我只是Exit事件以防Mode==dmNowhere,因为在我实际调用MoveTo之前我有一些逻辑,不应该在dmNowhere的情况下使用。
标签: delphi delphi-xe delphi-xe4 virtualtreeview tvirtualstringtree