4

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?

4

1 回答 1

6

您没有显示您的代码,但基本上,您只需要为您的方法调用使用适当的 (attach)Mode参数,当事件方法的 (drop)参数等于 时,这表明用户刚刚删除了节点(s) 到树的空白处。我假设您有如下代码来确定事件方法中的附加模式:MoveToModeOnDragDropdmNowhereOnDragDrop

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;

如果是这样,您可以告诉树将节点附加为例如最后一个子节点,方法是将附加模式更改为amAddChildLast删除模式是否为dmNowhere

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;
于 2013-11-09T09:50:48.513 回答