Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在VirtualStringTree中设置节点的索引?_Delphi_Virtualtreeview - Fatal编程技术网

Delphi 在VirtualStringTree中设置节点的索引?

Delphi 在VirtualStringTree中设置节点的索引?,delphi,virtualtreeview,Delphi,Virtualtreeview,我正在尝试更改节点的索引,因为有些特定节点需要始终位于树的底部。我试图更改Node.Index,但没有改变任何内容。所以我的问题是:如何更改PVirtualNode的索引 谢谢Jeff您不能更改节点的索引。通常,在使用VirtualStringTree时,您将数据保存在自己的数据结构中,与树分离,并从事件中访问数据。 您也可以直接在节点中存储数据(使用记录),但我更喜欢另一种方法,因为它将逻辑排除在树视图之外 例如,您可以将数据存储在列表中,并在GetText处理程序中访问此列表(您可以使用No

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


谢谢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
AddChild

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


查看
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或任何其他类似列表的数据结构。大卫和我向你展示了如何做到这一点,所以如果你仍然不知道如何做到这一点,可以问一下。有人可以链接到