Фильтрация 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, но тогда нужно также фильтровать, когда узел расширяется.

Другие вопросы по тегам