VirtualStringTree скрыть узел (ы) - PullRequest
3 голосов
/ 09 июня 2010

возможно ли скрыть определенные узлы в VirtualStringTree?Я реализую функцию «фильтрации» (VST действует как список со столбцами), и я хотел бы избегать перезагрузки контента каждый раз, когда меняется фильтр - вместо этого гораздо быстрее было бы сказать VST не отображать определенные элементы... какие-либо решения?

Ответы [ 2 ]

16 голосов
/ 09 июня 2010
VirtualTree.IsVisible[Node] := False;
1 голос
/ 16 мая 2014

Есть проблемы с использованием .IsVisible [] или .IsFiltered [], и это очень медленно, я пробовал фильтр в дереве из 25 000 узлов и слишком медленный.

I 'мы нашли один подход, который быстрее и решает проблему с размером полосы прокрутки при использовании Include (Node.states, vsFiltered) или (Node.States, vsVisible), он заключается в изменении вручную значения Node.TotalHeight в соответствии с числомвидимые узлы (не отфильтрованные).

Например, я фильтрую 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;

Надеюсь, это поможет Извините, плохой английский ...

...