代码之家  ›  专栏  ›  技术社区  ›  migajek

虚拟字符串树隐藏节点

  •  3
  • migajek  · 技术社区  · 14 年前

    是否可以在virtualstringtree中隐藏特定节点? 我正在实现“过滤”功能(vst充当一个带有列的列表),我希望避免每次更改过滤器时都重新加载内容-相反,更快的方法是告诉vst不要呈现特定的项…有什么解决办法吗?

    2 回复  |  直到 10 年前
        1
  •  16
  •   Senseful    14 年前
    VirtualTree.IsVisible[Node] := False;
    
        2
  •  1
  •   user3642851    10 年前

    使用.isvisible[]或.isfiltered[]时出现问题,速度非常慢,我在一个树中使用了25000个节点的探测筛选器,速度太慢。

    我发现了一个更快的方法,解决了使用include(node.states,vsfiltered)或(node.states,vsvisible)时滚动条大小的问题,它包括根据可见节点数(未过滤)手动更改node.totalheight值。

    例如,我正在过滤25000个节点,我使用的代码如下:

    procedure TFC_Articulo.Filtrar(Filtro:String);
    var
     Node:PVirtualNode;
     Data:PArticulo;
    begin
      Node := TV.GetFirst;
      TV.RootNode.TotalHeight:=TV.DefaultNodeHeight;  // The Trick
      while Assigned(Node) do
      begin
        Data:=TV.GetNodeData(Node);
        Exclude(Node.States,vsFiltered);     // By default all nodes wil be Visible
        if ComparationHereForDetermineFiltering then
           Include(Node.States,vsFiltered)   // This node wil be filtered
        else
           Inc(TV.RootNode.TotalHeight,Node.NodeHeight);  // Determine the Height of scrollbar
        Node:=TV.GetNext(Node);
      end;
      TV.RootNode.TotalHeight:=TV.RootNode.TotalHeight+TV.BottomSpace;
      TV.UpdateScrollBars(True);
    end;
    

    希望这有帮助 抱歉,糟糕的英语…