Delphi 在VirtualStringTree中设置节点的索引?
我正在尝试更改节点的索引,因为有些特定节点需要始终位于树的底部。我试图更改Node.Index,但没有改变任何内容。所以我的问题是:如何更改PVirtualNode的索引Delphi 在VirtualStringTree中设置节点的索引?,delphi,virtualtreeview,Delphi,Virtualtreeview,我正在尝试更改节点的索引,因为有些特定节点需要始终位于树的底部。我试图更改Node.Index,但没有改变任何内容。所以我的问题是:如何更改PVirtualNode的索引 谢谢Jeff您不能更改节点的索引。通常,在使用VirtualStringTree时,您将数据保存在自己的数据结构中,与树分离,并从事件中访问数据。 您也可以直接在节点中存储数据(使用记录),但我更喜欢另一种方法,因为它将逻辑排除在树视图之外 例如,您可以将数据存储在列表中,并在GetText处理程序中访问此列表(您可以使用No
谢谢Jeff您不能更改节点的索引。通常,在使用
VirtualStringTree
时,您将数据保存在自己的数据结构中,与树分离,并从事件中访问数据。
您也可以直接在节点中存储数据(使用记录),但我更喜欢另一种方法,因为它将逻辑排除在树视图之外
例如,您可以将数据存储在列表中,并在GetText
处理程序中访问此列表(您可以使用Node.Index
)。然后,如果您想对项目重新排序,只需对列表重新排序,其他所有操作都会自动进行(您可能需要在树上调用Invalidate
)
伪代码:
初始化:
Tree.RootNodeCount := MyList.Count;
在GetText
事件中:
NodeText := MyList [Node.Index];
重新排序:
Reorder (MyList);
Tree.Invalidate;
不能更改节点的索引。通常,在使用
VirtualStringTree
时,您将数据保存在自己的数据结构中,与树分离,并从事件中访问数据。
您也可以直接在节点中存储数据(使用记录),但我更喜欢另一种方法,因为它将逻辑排除在树视图之外
例如,您可以将数据存储在列表中,并在GetText
处理程序中访问此列表(您可以使用Node.Index
)。然后,如果您想对项目重新排序,只需对列表重新排序,其他所有操作都会自动进行(您可能需要在树上调用Invalidate
)
伪代码:
初始化:
Tree.RootNodeCount := MyList.Count;
在GetText
事件中:
NodeText := MyList [Node.Index];
重新排序:
Reorder (MyList);
Tree.Invalidate;
TVirtualNode是一个双链接列表,它不是基于索引的结构:您可以通过删除节点并将其添加到需要的位置来更改节点的索引
查看
DeleteNode
和AddChildTVirtualNode是一个双链接列表,它不是基于索引的结构:您可以通过删除节点并将其添加到需要的位置来更改节点的索引
查看DeleteNode
和AddChild
如果您仍在使用树视图控件作为容器,那么Smasher提供的理想解决方案对您来说是不可用的
考虑到树视图没有层次结构(即它是一个列表),一个相当明显的解决方案是将Sort
方法与您自己的比较函数(OnCompareNodes
)结合使用
另一个显而易见的策略是在最后一个底部添加您想要的节点。如果以后需要添加其他节点,请使用InsertNode
将它们插入到特殊的最后一个节点上方。这种简单的方法可能足以解决您描述的问题。鉴于您仍在使用树视图控件作为容器,Smasher提供的理想解决方案对您来说并不可用
考虑到树视图没有层次结构(即它是一个列表),一个相当明显的解决方案是将Sort
方法与您自己的比较函数(OnCompareNodes
)结合使用
另一个显而易见的策略是在最后一个底部添加您想要的节点。如果以后需要添加其他节点,请使用InsertNode
将它们插入到特殊的最后一个节点上方。这种简单的方法可能足以解决您所描述的问题。要更改节点A的索引,请找到具有您希望A具有的索引的节点B,然后调用树。MoveTo(A,B,aminesertbefore,False)
。B之后的所有内容都将向下移动1,为A腾出空间,它们的索引
字段将被重新计算。即使在树中还不存在(例如在调用MakeNewNode
之后),这也可以工作
如果您使用索引
将每个节点与其在列表或数组中对应的数据值相关联,那么您会发现这在很大程度上无法对显示的值进行重新排序。若要更改节点a的索引,请找到具有您希望a具有的索引的节点B,然后调用Tree.MoveTo(a、B、AminertBefore、False)
。B之后的所有内容都将向下移动1,为A腾出空间,它们的索引
字段将被重新计算。即使在树中还不存在(例如在调用MakeNewNode
之后),这也可以工作
如果使用索引
将列表或数组中的每个节点与其对应的数据值相关联,然后,您会发现这对重新排序显示的值基本上是无效的。您是否仍在虚拟控件中存储数据,或者您是否采纳了Rob Kennedy的建议并将树与其数据分开?@David-我不知道如何将层次结构存储在单独的数据结构中,所以不。这也是同一个项目。Jeff,你之前说过你没有等级制度。你只有一个列表,而不是一棵树。因此,请使用数组、TList、TObjectList或任何其他类似列表的数据结构。大卫和我向你展示了如何做到这一点,如果你还不知道怎么做,问问这个问题。有人能链接到前面的问题吗?@Rob,我的项目中有两棵树-一棵有层次结构,还有一个是DoeSsent。你还在虚拟控件中存储数据吗?还是听了Rob Kennedy的建议,将树与其数据分开了?@David-我不知道如何将层次结构存储在单独的数据结构中,所以不。这也是同一个项目。Jeff,你之前说过你没有层次结构。你只有一个列表,而不是一棵树。因此,请使用数组、TList、TObjectList或任何其他类似列表的数据结构。大卫和我向你展示了如何做到这一点,所以如果你仍然不知道如何做到这一点,可以问一下。有人可以链接到