3

VirtualStringTree で特定のノードを非表示にすることは可能ですか? 「フィルタリング」機能を実装しています (VST は列を持つリストとして機能します)。フィルターが変更されるたびにコンテンツをリロードするのは避けたいと思います。 ..解決策はありますか?

4

2 に答える 2

16
VirtualTree.IsVisible[Node] := False;
于 2010-06-09T19:09:47.903 に答える
1

.IsVisible[] または .IsFiltered[] の使用に問題があり、それは非常に遅いです.25,000ノードのツリーでフィルターをプローブしましたが、遅すぎます。

Include(Node.states,vsFiltered) または (Node.States,vsVisible) を使用すると、より高速でスクロールバーのサイズの問題を解決する 1 つのアプローチが見つかりました。表示されているノードの数 (フィルタリングされていない)。

たとえば、25,000 のノードをフィルタリングしており、使用していたコードは次のとおりです。

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;

これが役に立てば幸いです申し訳ありませんが悪い英語...

于 2014-05-15T23:27:08.100 に答える