【发布时间】: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