(RAD Studio) Virtual TreeView:如何一次性初始化所有节点?

3

我刚刚发现了这个组件并开始使用它。

我知道它的整个概念是在需要时初始化节点,但我需要所有节点立即初始化。

有什么聪明的方法吗?

我唯一想到的是在添加节点后使用 GetLast()
我相信,有更好的方法,对吗?


你能解释一下为什么需要立即初始化所有节点吗?在这种情况下,Virtual TreeView会失去很多速度和“虚拟性”。 - Uwe Raabe
因为这是一个糟糕的设计,而且我没有选择去改变软件设计并使其虚拟化 :( - Andrew
2
“聪明的方式”是不要这样做 - Rob Kennedy
2
嗯,如果你在处理数据库时不违反虚拟范式,那么当按需访问节点时会得到意想不到的结果。 - Wodzu
@Wodzu:这是不是意味着我应该选择另一个组件,还是只是妥协于"虚拟性"? - Andrew
@Andrew,除了我之前提到的,VritualTree非常好用。我在商业项目中与数据库一起使用它,没有任何问题。 - Wodzu
3个回答

7

更正确的初始化单个节点的方法是使用ValidateNode方法,而不是已经建议的FullExpand方法。根据VT的文档:

procedure ValidateNode(Node: PVirtualNode; Recursive: Boolean);

TBaseVirtualTree.ValidateNode 方法

ValidateNode 确保给定的节点(如果 Recursive 为 true,则包括其所有子节点)已初始化。如果 Node 为 nil,则使用隐藏的根节点(仅在 Recursive 为 true 时才有意义,在这种情况下,将验证整个树)。


2
这应该是被接受的答案,因为FullExpand会可视化地展开整个树,而你可能不希望发生这种情况。 - Edwin Yip

4
你可以编写自己的过程手动构建树形视图。
例如:
procedure TForm1.BuildTree;
var
  i: integer;
  Data: ^TYourRecord;
  pNode, cNode: PVirtualNode;
begin
  for i:=0 to 1000 - 1 do
  begin
    //build parent node
    pNode := VT.AddChild(nil);
    Data := VT.GetNodeData(pNode);
    //fill record values
    Data.SomeVar := 'Parent Node';
    //build child node
    cNode := VT.AddChild(pNode);
    Data := VT.GetNodeData(cNode);
    Data.SomeVar := 'Child Node';
  end;
end;

3

treeview.FullExpand;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接