我试图在内存中构建多个“树”,然后将其中一个分配给用户可以与之交互的TTreeView控件。但是,如果不传递指向现有TTreeView的指针,就无法构造任何TTreeNodes对象。传递NIL会导致AV。

两个问题:-TTreeNode和TTreeView之间这种“硬”链接的原因是什么,解决该问题的最佳方法是什么?

我可以看到的一些选项是:


维护我自己的树结构
没有ttreenodes且动态
根据需要构建TTreeNodes。
具有多个不可见的TTreeView
刚用来制作的对象
TTreeNodes的工作原理。


..但我没有权衡这些利弊。

最佳答案

TTreeView及其相关类中有很多代码可以使Delphi对象与基础Windows控件之间的链接保持同步。例如,当通过窗口消息直接添加节点时,Delphi对象需要在下次询问它有多少个节点时反映该更改。

TTreeView是Windows控件的包装,而TTreeNodesTTreeNode只是该包装的一部分。它们实际上并没有实现控件执行的所有树操作。如果当前没有任何Windows控件,则某些操作无效。

TTreeView是可视控件。如果您没有可视化的内容,那么它就不是您的控件。如果您具有多个树数据结构,并且只需要一个树控件,那么无论何时切换到其他结构,都将不得不销毁并重新创建树节点。该控件甚至没有提供暂时隐藏某些节点的方法。

您可能对Mike Lischke's virtual tree control感兴趣。在预期的用途中,您可以自己管理树数据结构。该控件只是一个可视化。它询问您每个节点有多少个子节点,然后询问您每次绘制该节点时每个节点的文本是什么。它管理着哪些节点被扩展,选择,检查或可见,但是您管理所有数据。是free and open-source

07-28 03:27