如何可靠地将Virtual TreeView滚动到底部?

7

一个具有自定义节点高度的 TVirtualStringTree 对象,如何可靠地将 Virtual TreeView 滚动到底部(即滚动条到达底部)?

我尝试调用 tree1.FullExpand 然后 tree1.ScrollIntoView.(tree1.GetLast),但它不起作用。

提前感谢你。

4个回答

7

ScrollIntoView 对我来说效果很好。你也可以尝试使用 tree1.FocusedNode := tree1.GetLast;

你是否在 OnMeasureItem 事件中设置了自定义节点高度? 如果没有生效,尝试将树的 DefaultNodeHeight 设置为更大的值,并在 OnMeasureItem 事件中将其改为较低的值。我注意到这样树会更好地重新计算滚动条的长度。


谢谢Linas。是的,我正在根据节点内容在OnMeasureItem事件中为每个节点设置自定义高度。设置'tree1.FocusedNode'不起作用。我会尝试你说的关于为所有节点设置最大高度然后调整值的方法。 - Edwin Yip
嗨,Linas,你提出的第二种方法行得通!看来Virtual Treeview在滚动操作期间计算时使用了DefaultNodeHeight。 - Edwin Yip
没错,Edwin。另一种选择是控件初始化树中的每个节点,即使它们还没有必要显示出来。这可能会耗费时间。 - Rob Kennedy

4

试试这个:

SendMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);
PostMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);

3
我在使用 TVirtualDrawTree 时遇到了同样的问题。你需要确保节点高度在树滚动之前已经计算好。
以下是我的解决方法:
1. 在 OnInitNode 事件中添加以下代码,让树知道需要计算新节点的高度:
```Delphi NodeHeight.TrackChanges := True; ```

2.- In the OnMeasureItem event, compute the height of the node using the information you have:

2. 在 OnMeasureItem 事件中,使用你拥有的信息计算节点的高度:

Node.States := node.States + [vsMultiline] - [vsHeightMeasured];

2.- 在OnMeasureItem事件处理程序中,如果无法计算高度(例如节点尚未初始化),请确保告诉树在需要时重复调用:

If (Node = Nil) Or (Node = tree.RootNode) Then Begin
  Exclude(Node.States, vsHeightMeasured);
  Exit;
End;

NodeData := tree.GetNodeData(Node);
If (NodeData = Nil) Or (NodeData^.XMLNode = Nil) Then Begin
  Exclude(Node.States, vsHeightMeasured);
  Exit;
End;
Try
  // Code to measure node height here.
Except
  Exclude(Node.States, vsHeightMeasured);
End;

我希望能对您有所帮助。

1

这个也应该可以工作:

tree1.TopNode := tree1.GetLast

谢谢Straveu。但是它还是不起作用...PS. 如果我手动(而不是通过编程)滚动到最后一个节点,我可以打印出完整的树形视图。 - Edwin Yip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接