【问题标题】:VitrtualStringTree. How to Drag'n'Drop to ROOT level?虚拟字符串树。如何拖放到ROOT级别?
【发布时间】: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


【解决方案1】:

您还没有显示您的代码,但基本上,您只需要为您的MoveTo 方法调用使用适当的(附加)Mode 参数,当您的@ 的(删除)Mode 参数时987654324@ 事件方法等于dmNowhere,表示用户刚刚将节点拖放到树的空白处。我假设您有如下代码来确定 OnDragDrop 事件方法中的附加模式:

var
  ...
  AttachMode: TVTNodeAttachMode;
begin
  ...
  // the Mode here is a drop mode parameter
  case Mode of
    dmNowhere: AttachMode := amNoWhere; // <- where this stands for no move
    ...
  end;
  ...
end;

如果是这样,您可以告诉树附加节点,例如如果丢弃模式为dmNowhere,则将附加模式更改为amAddChildLast,作为最后一个孩子:

var
  ...
  AttachMode: TVTNodeAttachMode;
begin
  ...
  // the Mode here is a drop mode parameter
  case Mode of
    dmNowhere: AttachMode := amAddChildLast; // <- attach node as a last child
    ...
  end;
  ...
end;

【讨论】:

  • 不应该将dmOnNode 也映射到amAddChildLast 吗?
  • @kobik,这在这里并不重要。要点是dmNowhere 表示下降到空白空间。我认为 OP 将 amNoWhere 分配给了附加模式,它没有移动。
  • 我猜你是对的,但我仍然更喜欢你以前的答案,你显示所有附加模式。 +1
猜你喜欢
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多