【发布时间】:2021-06-23 03:05:11
【问题描述】:
我正在尝试填充 VirtualStringTree。我的基础数据是这样的,这里显示了许多分支中的 3 个,每个分支都有不同数量的树枝。
string 1
chunk:string 1, fname:c:\temp\file0.txt, freq:8
chunk:string 1, fname:c:\temp\file4.txt, freq:5
chunk:string 1, fname:c:\temp\file2.txt, freq:6
string 2
chunk:string 2, fname:c:\temp\file1.txt, freq:10
chunk:string 2, fname:c:\temp\file5.txt, freq:6
chunk:string 2, fname:c:\temp\file3.txt, freq:4
chunk:string 2, fname:c:\temp\file4.txt, freq:3
string 3
chunk:string 3, fname:c:\temp\file2.txt, freq:12
chunk:string 3, fname:c:\temp\file0.txt, freq:4
chunk:string 3, fname:c:\temp\file4.txt, freq:5
我的查询涉及如何确保树知道它需要多少种不同类型的子节点。 RootNodeCount 很简单,但我不知道如何在不初始化所有数据的情况下分配不同的“ChildNodeCount”(在这种情况下为什么要使用 VirtualStringTree)。
我的尝试是遍历我的数据中的条目,并使用 AddChild 并将 nil 作为其参数或将最后一个节点作为其参数。那是有效的。但我认为这不是一个虚拟解决方案,因为每次调用 AddChild 都会调用 InitNode。
VirtualStringTreeBoiler.Clear;
VirtualStringTreeBoiler.BeginUpdate;
VirtualStringTreeBoiler.NodeDataSize := SizeOf(TBoilerRec);
repetition_seeker.BuildNodeIndex;
VirtualStringTreeBoiler.RootNodeCount := 0;
mum := nil;
MainNode := nil;
for i := 0 to repetition_seeker.NodeCount - 1 do
begin
rec := repetition_seeker.NodeIndexToMainAndSub[i];
if rec.sub_ndx<0 then
begin
MainNode := VirtualStringTreeBoiler.AddChild(mum);
MainNode.index := i;
end else begin
SubNode := VirtualStringTreeBoiler.AddChild(MainNode);
SubNode.Index := i;
end;
end;
VirtualStringTreeBoiler.EndUpdate;
有没有一种有效的方法来通知树一个节点有多少孩子——但实际上是?我可以举个例子吗?
【问题讨论】:
-
看看事件 InitChildren。每个状态有 ivsHasChildren 的节点都会请求这个。在事件中设置 ChildCount。所以对于虚拟模式不要使用 AddChild。只需设置每个级别的节点数即可。
标签: delphi addchild tvirtualstringtree