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

时间:2010-05-15 08:12:50

标签: delphi virtualtreeview

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

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

提前谢谢。

4 个答案:

答案 0 :(得分:6)

ScrollIntoView对我很有用。您也可以尝试tree1.FocusedNode := tree1.GetLast;

您是否在OnMeasureItem事件中设置自定义节点高度? 如果它不起作用,请尝试将树的DefaultNodeHeight设置为更大的值,并在OnMeasureItem事件中将其更改为更低。我注意到树更好地重新计算滚动条的长度。

答案 1 :(得分:4)

试试这个:

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

答案 2 :(得分:1)

这也应该有效:

tree1.TopNode := tree1.GetLast

答案 3 :(得分:1)

我在使用TVirtualDrawTree时遇到了同样的问题。您必须确保在树实际滚动之前计算节点高度。

这就是我的所作所为:

1.-将此代码添加到OnInitNode事件中,以便树知道必须计算新节点的高度:

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

2.-在OnMeasureItem中,如果您无法计算高度(例如,节点尚未初始化),请确保告诉树在需要时重复调用: 在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;

我希望它可以帮到你。