如何在VirtualStringTree中刷新垂直滚动条?

时间:2011-06-22 08:24:17

标签: delphi virtualtreeview

如果每个节点高度更改为不同的高度,如何刷新VirtualStringTree的滚动条。因为,滚动仍处于相同状态,导致滚动时无法查看其他节点。

toVariableNodeHeight选项不起作用?还有其他想法吗?

1 个答案:

答案 0 :(得分:3)

有些东西告诉我,当你说“每个NodeHeight都被更改了”时,你的意思是说你直接将新值分配给每个节点记录的NodeHeight字段。首先,不要这样做。如果必须为节点指定高度,请通过树的NodeHeight属性进行分配。也就是说,而不是:

{*} Node.NodeHeight := x;

这样做:

Tree.NodeHeight[Node] := x;

这将自动调整所有节点祖先的缓存高度,这是决定滚动条范围的原因。

更好的是,根本不要为节点分配高度。相反,处理树的OnMeasureItem事件,树会询问每个节点的高度。如果设置了toVariableNodeHeight选项,则会触发该事件。

如果您真的坚持跳过树的节点高度管理,那么您需要确保自己处理所有所需的任务。这包括不仅更新NodeHeight字段,还更新节点的TotalHeight字段,其父节点,祖父节点等,直到您设置隐藏根节点的总高度为止。有关详细信息,请参阅TBaseVirtualTree.AdjustTotalHeight。它具有私人可见性,因此您无法自己调用它。

OnMeasureItem只会为一个节点调用一次。如果您需要再次调用它,因为节点的内容已更改,您需要树重新测量高度,请调用ReinitNode。如果您使用的是TCustomVirtualStringTree,则还可以拨打InvalidateNode