Delphi VirtualStringTree筛选完成正确

Delphi VirtualStringTree筛选完成正确,delphi,virtualtreeview,tvirtualstringtree,Delphi,Virtualtreeview,Tvirtualstringtree,我正在寻找一种基于过滤规则快速过滤VirtualStringTree中节点的方法,尤其是当过滤规则更改时。VST中内置了一种过滤机制,您可以在其中定义节点是否被过滤掉 我现在的解决方案是在节点初始化时确定节点是否被过滤掉。当过滤器更改时,我迭代所有初始化的节点,并根据需要更改过滤器状态 问题是初始化的节点越多,迭代它们所需的时间就越长。窗口外有许多节点,此时不需要过滤信息(虚拟范例) 问题是,是否有类似于过滤器失效系统/过滤器事件/其他解决方案的方法,只接触真正需要“过滤器已更改”信息的节点 p

我正在寻找一种基于过滤规则快速过滤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;

不存在“仅接触真正需要过滤器的节点”的失效系统已更改“信息”。为了显示所有节点的正确滚动条和正确的可展开状态,您需要查看所有初始化的节点是否仍要显示。通过了解过滤器的工作原理,您可以优化for循环中的内容并跳过某些节点。您也可以考虑使用<代码> VST.VistiBeleNodis<代码>,而不是<代码>初始化节点,但在扩展节点时也需要过滤。