代码之家  ›  专栏  ›  技术社区  ›  Edwin Yip

如何可靠地将虚拟树视图滚动到底部?

  •  5
  • Edwin Yip  · 技术社区  · 15 年前

    一个具有自定义节点高度的Tvirtualstringtree对象,如何可靠地将虚拟树视图滚动到底部(即滚动条到达底部)?

    我试着打电话 tree1.FullExpand 然后 tree1.ScrollIntoView.(tree1.GetLast) 但是它不起作用。

    提前谢谢。

    4 回复  |  直到 12 年前
        1
  •  5
  •   Linas    15 年前

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

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

        2
  •  4
  •   Patman    12 年前

    试试这个:

    SendMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);
    PostMessage(VST.Handle, WM_VSCROLL, SB_BOTTOM, 0);
    
        3
  •  1
  •   anon    15 年前

    这也应该有效:

    tree1.TopNode := tree1.GetLast
    
        4
  •  1
  •   PetriW    13 年前

    我在使用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;
    

    希望对你有帮助。