1

我正在尝试更改节点的索引,因为有些特定节点始终需要位于树的底部。我试图更改 Node.Index,但这并没有改变任何东西。所以我的问题是:如何更改 PVirtualNode 的索引?

谢谢!- 杰夫

4

4 回答 4

4

要更改节点A的索引,请找到具有您希望A具有的索引的节点B ,然后调用. B和它之后的所有内容都将向下移动 1 为A腾出空间,并且它们的字段将被重新计算。即使A在树中尚不存在(例如在调用 之后),这也有效。Tree.MoveTo(A, B, amInsertBefore, False)IndexMakeNewNode

如果您使用Index将每个节点与其对应的列表或数组中的数据值相关联,那么您会发现这对于重新排序显示的值非常无效。

于 2011-02-07T19:23:28.123 回答
3

您无法更改节点的索引。通常,在使用时,VirtualStringTree您将数据保存在与树分开的自己的数据结构中,并从事件中访问数据。您也可以将数据直接存储在节点中(使用记录),但我更喜欢另一种方法,因为它将逻辑排除在树视图之外。

例如,您可以将数据存储在列表中并在GetText处理程序中访问此列表(您可以使用Node.Index)。然后,如果您想重新排序项目,只需重新排序您的列表,其他一切都会自动发生(您可能需要Invalidate在树上调用)。

伪代码:

初始化:

Tree.RootNodeCount := MyList.Count;

GetText事件中:

NodeText := MyList [Node.Index];

重新排序:

Reorder (MyList);
Tree.Invalidate;
于 2011-02-07T19:05:39.730 回答
2

TVirtualNode 是一个双向链表,它不是基于索引的结构:您可以通过删除节点并将其添加到您想要的位置来更改节点的索引。

查看DeleteNodeAddChild

于 2011-02-07T19:09:56.203 回答
2

鉴于您仍在使用树视图控件作为容器,您无法使用 Smasher 提供的理想解决方案。

鉴于您的树视图没有层次结构(即它是一个列表),一个相当明显的解决方案是将该Sort方法与您自己的比较函数 ( OnCompareNodes) 一起使用。

另一个令人眼花缭乱的明显策略是将您想要的节点添加到最后。如果您以后需要添加其他节点,则将它们插入到特殊的最后一个节点上方,并带有InsertNode. 正如您所描述的,这种简单的方法可能足以解决问题。

于 2011-02-07T19:12:09.527 回答