【问题标题】:VirtualStringTree filtering done rightVirtualStringTree 过滤正确完成
【发布时间】:2017-04-02 12:13:00
【问题描述】:

我正在寻找一种快速方法来根据过滤规则过滤 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;

【问题讨论】:

    标签: delphi virtualtreeview tvirtualstringtree


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 2013-05-13
      • 2011-07-07
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多