VirtualStringTree过滤完成

时间:2017-04-02 12:13:01

标签: delphi virtualtreeview tvirtualstringtree

我正在寻找一种快速方法,根据过滤规则过滤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 个答案:

答案 0 :(得分:1)

没有失效系统“只触及真正需要”过滤器已更改“信息的节点”。为了显示正确的滚动条和所有节点的正确可扩展状态,您需要查看所有已初始化的节点(如果它们仍然要显示)。通过了解过滤器的工作原理,您可以优化for循环中的内容并跳过某些节点。您也可以考虑使用vst.VisibleNodes代替InitializedNodes,但是还需要在展开节点时进行过滤。