Есть проблемы с использованием .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;
Надеюсь, это поможет Извините, плохой английский ...