我正在尝试在内存中构建几个“树”,然后将其中一个分配给用户可以与之交互的TTreeView控件。但是,如果不传递指向现有TTreeView的指针,我就无法构造任何TTreeNodes对象。传入NIL会导致AV。
两个问题: - TTreeNodes和TTreeViews之间“硬”链接的原因是什么,和,解决问题的最佳方式是什么?
我能看到的一些选项是:
..但我没有权衡这些的利弊。
答案 0 :(得分:4)
TTreeView
及其相关类中有很多代码可以使Delphi对象与底层Windows控件之间的链接保持同步。当通过窗口消息直接添加节点时,Delphi对象需要在下次询问它有多少节点时反映该更改,例如。
TTreeView
是Windows控件的包装器,TTreeNodes
和TTreeNode
只是该包装器的一部分。它们实际上并不实现控件执行的所有树操作。如果当前没有可用的Windows控件,则某些操作无效。
TTreeView
是一个视觉控件。如果您没有任何可视化的东西,那么它不适合您。如果您有多个树数据结构,并且只需要一个树控件,那么每当切换到不同的结构时,您将不得不忍受破坏并重新创建树节点。该控件甚至没有提供暂时隐藏某些节点的方法。
您可能对Mike Lischke's virtual tree control感兴趣。在其预期用途中,您自己管理树数据结构;控件只是可视化。它会询问每个节点有多少个子节点,然后它会询问每次节点绘制该节点时每个节点的文本。它管理哪些节点被扩展,选择,检查或可见,但您管理所有数据。它是free and open-source。
答案 1 :(得分:3)
如果你看一下TTreeNodes的来源,你会发现它需要所有者(这是一个TCustomTreeView)。您可以使用隐藏的树视图或创建自定义子类。
我更喜欢将gui与datamodel分开。因此,总会有一个具有正确关系的数据模型。
答案 2 :(得分:2)
(主要)原因可能是阻止您在超过1个TTreeview中出现TTreeNode。这是一种常见的设计模式,也可以在XmlNode类等中找到。
至于你的2个选项,如果不了解更多关于项目中的内容/方式/数量的话,很难说。
如果与节点集相关的外观/行为存在最微小的差异,我会去交换TTreeviews。