Фильтрация VirtualStringTree выполнена правильно
Я ищу быстрый способ фильтрации узлов в VirtualStringTree на основе правила фильтра, особенно при изменении правила фильтра. В VST встроен механизм фильтрации, где вы можете определить, отфильтрован ли узел.
Мое решение прямо сейчас состоит в том, чтобы определить при инициализации узла, отфильтрован ли узел. Когда фильтр меняется, я перебираю все инициализированные узлы и при необходимости изменяю состояние фильтра.
Проблема в том, что чем больше узлов инициализируется, тем больше времени требуется для их итерации. За пределами окна есть много узлов, где информация о фильтре сейчас не нужна (виртуальная парадигма).
Вопрос в том, существует ли что-то вроде системы аннулирования фильтра / событий фильтра / других решений, которые касаются только тех узлов, которые действительно нуждаются в информации "фильтр-изменен"?
procedure TfrmMain.vstInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
Data: PMyDataType;
begin
Data := Sender.GetNodeData(Node);
Data^ := GetData(Node.Index);
if IsNodeFiltered(Data^) then Include(InitialStates, ivsFiltered);
end;
procedure TfrmMain.OnFilterRuleChanged();
var
Node: PVirtualNode;
Data: PMyDataType;
begin
vst.BeginUpdate;
try
for Node in vst.InitializedNodes do
begin
Data := vst.GetNodeData(Node);
vst.IsFiltered[Node] := IsNodeFiltered(Data^);
end;
finally
vst.EndUpdate;
end;
end;
Спасибо!
1 ответ
Не существует системы аннулирования, которая "затрагивает только узлы, которые действительно нуждаются в информации" фильтр-изменен "". Чтобы отобразить правильные полосы прокрутки и правильное расширяемое состояние всех узлов, необходимо просмотреть все инициализированные узлы, если они все еще должны отображаться или нет. Зная, как работает ваш фильтр, вы сможете оптимизировать вещи в цикле for и пропустить определенные узлы. Вы также можете рассмотреть возможность использования vst.VisibleNodes
вместо InitializedNodes
, но тогда нужно также фильтровать, когда узел расширяется.