Delphi 尽可能真实地填充VirtualStringTree?
我正在尝试填充一个VirtualStringTree。我的底层数据是这样的,这里显示了许多分支中的3个,每个分支都有不同数量的细枝Delphi 尽可能真实地填充VirtualStringTree?,delphi,addchild,tvirtualstringtree,Delphi,Addchild,Tvirtualstringtree,我正在尝试填充一个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
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
virtualstringtreebiler.Clear;
VirtualStringTreebiler.BeginUpdate;
virtualstringtreebiler.NodeDataSize:=SizeOf(tboilerec);
重复\u seeker.BuildNodeIndex;
VirtualStringTreebiler.RootNodeCount:=0;
妈妈:=零;
主节点:=nil;
对于i:=0到seeker.NodeCount-1 do
开始
rec:=重复搜索器nodeIndextomanDSub[i];
如果rec.sub_ndx我为此而挣扎。
为了防止它对其他人有所帮助,我学到的(对于我的简单数据,有很多分支,每个分支都有不同数量的分支,但没有分支)是:
一旦知道分支数,就将RootNodeCount设置为您拥有的分支数(如建议的那样)
不要为你的数据建立索引系统,那是浪费精力。让树自动完成它
在InitNode中,首先检查级别:Level:=Sender.GetNodeLevel(节点);
如果级别为0,请检查该节点索引的数据是否有任何分支:
如果重复.chunks\u list.fileexecutions[Node.Index].Count>0,则
包括(初始状态,ivsHasChildren);
然后调用InitChildren事件。这是你设定的
ChildCount:=repeats.chunks\u list.FileOccents[Node.Index].Count
如果级别高于0,则排除(InitialStates,ivsHasChildren),然后仅访问ParentNode.index的数据,查找按Node.index编号的分支
节点自动编号。无需设置其索引属性或ChildCount属性
对于级别0(顶级)节点,将其CheckType设置为ctTriStateCheckbox;对于分支,将其CheckType设置为TCheckType(级别)
请看一看有关儿童的事件。在其状态中包含ivsHasChildren的每个节点都将请求此操作。在事件中设置ChildCount。因此,对于虚拟模式,不要使用AddChild。只需设置每个级别的节点数。