(Delphi Ttreeview)如何将节点拖放到下面(或上面)所选节点

时间:2015-10-24 22:51:15

标签: delphi treeview

在TtreeView1.DragDrop中使用

之类的语句
 targetnode := TreeView1.GetNodeAt(x,y);
 ...
 TreeView1.Selected.MoveTo(targetnode , naInsert ) ;

使用鼠标移动节点并将其插入同一级别的现有节点之前,即上方。

我喜欢改变行为,这样如果我向下拖动节点会移动到目标下方,但如果我向上拖动它会移动到目标上方(否则我可以拖到新的底部位置但不是新的顶部或反之亦然)。 我正在尝试的那种结构是

targetnode := TreeView1.GetNodeAt(x,y);
...
if DraggedItem.Index > targetnode.Index then //we are dragging upwards, insert before
    TreeViewStructure.Selected.MoveTo(targetnode , naInsert ) 
else                                        //we are dragging downwards, insert after
    TreeViewStructure.Selected.MoveTo(targetnode , ???) ;

但我找不到在目标节点之后插入兄弟的TNodeAttachMode常量。 这里给出的TNodeAttachMode的常量http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ComCtrls_TNodeAttachMode.html是......

naAdd: The new or relocated node becomes the last sibling of the other node.
naAddFirst: The new or relocated node becomes the first sibling of the other node.  
naInsert:The new or relocated node becomes the sibling immediately before the other node.  
naAddChild:The new or relocated node becomes the last child of the other node.  
naAddChildFirst:The new or relocated node becomes the first child of the other node.  

但这些都没有提到新的最后一个兄弟。

我能做我想做的事吗?如果是这样的话?

2 个答案:

答案 0 :(得分:1)

没有选项可以在节点之后插入,只能在之前插入。因此,您必须在放置目标之后找到节点,并在其之前插入。

要在最后一个节点之后添加,请找到最后一个节点并将naAdd传递给MoveTo

答案 1 :(得分:0)

感谢大卫的建议。使用它们我终于编写了以下代码来实现我的需要。发布在这里,以防其他人使用它。 (这是OnDragDrop中相关的代码)

 if ( Assigned(targetnode))  //we are over a target node
    and (DraggedNode.Level = targetnode.Level  then  //we are dragging within the same sub level
         begin
         if targetnode.Index = targetnode.Parent.Count -1  then   //target is the last node so do an naAdd to drop node at the end
              TreeViewStructure.Selected.MoveTo(targetnode , naAdd )
         else
              TreeViewStructure.Selected.MoveTo(targetnode , naInsert )   //drop before target using naInsert
         end;