【问题标题】:Populating VirtualStringTree as virtually as possible?尽可能虚拟地填充 VirtualStringTree?
【发布时间】: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


【解决方案1】:

我为此苦苦挣扎。 以防万一它对其他人有所帮助,我学到的(对于我的简单数据有很多分支,每个分支都有不同数量的子分支但没有子分支)是:

  1. 一旦知道该数字,就将 RootNodeCount 设置为您拥有的分支数(如各处所建议的那样)。

  2. 不要为您的数据创建索引系统,那是浪费精力。让 Tree 自动完成。

  3. 在 InitNode 中,首先检查 Level:Level := Sender.GetNodeLevel(Node); 如果级别为 0,请检查该节点索引的数据是否有任何子分支:

    如果 repeats.chunks_list.FileOccurrences[Node.Index].Count>0 那么 包括(初始状态,ivsHasChildren); 并调用 InitChildren 事件。在你设置它

    ChildCount := repeats.chunks_list.FileOccurrences[Node.Index].Count;

如果level在0以上,则Exclude(InitialStates, ivsHasChildren)然后简单的访问ParentNode.index的数据,寻找Node.index编号的子分支。

  1. 节点自动编号。无需设置它们的 Index 属性或 ChildCount 属性。

  2. 对于级别 0(顶级)节点,将其 CheckType 设置为 ctTriStateCheckbox,对于子分支,将其设置为 TCheckType(level)。

【讨论】:

    猜你喜欢
    • 2017-10-08
    • 1970-01-01
    • 2021-01-09
    • 2019-06-17
    • 2018-05-20
    • 2017-04-04
    • 2017-09-19
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多