【发布时间】:2010-05-15 08:12:49
【问题描述】:
具有自定义节点高度的 TVirtualStringTree 对象,如何可靠地将 Virtual TreeView 滚动到底部(即滚动条到达底部)?
我尝试拨打tree1.FullExpand,然后拨打tree1.ScrollIntoView.(tree1.GetLast),但它不起作用。
提前谢谢你。
【问题讨论】:
具有自定义节点高度的 TVirtualStringTree 对象,如何可靠地将 Virtual TreeView 滚动到底部(即滚动条到达底部)?
我尝试拨打tree1.FullExpand,然后拨打tree1.ScrollIntoView.(tree1.GetLast),但它不起作用。
提前谢谢你。
【问题讨论】:
ScrollIntoView 很适合我。你也可以试试tree1.FocusedNode := tree1.GetLast;
您是否在 OnMeasureItem 事件中设置自定义节点高度? 如果它不起作用,请尝试将树的 DefaultNodeHeight 设置为更大的值,并在 OnMeasureItem 事件中将其更改为更低。我注意到树以这种方式更好地重新计算滚动条的长度。
【讨论】:
试试这个:
SendMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);
PostMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);
【讨论】:
我在使用 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;
希望对你有帮助。
【讨论】:
这也应该有效:
tree1.TopNode := tree1.GetLast
【讨论】: