为什么Delphi TTreeNodes从根本上与TCustomTreeView绑定?

时间:2009-07-28 10:48:01

标签: delphi tree c++builder ttreenodes

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

两个问题: - TTreeNodes和TTreeViews之间“硬”链接的原因是什么,,解决问题的最佳方式是什么?

我能看到的一些选项是:

  • 维护自己的树结构 没有ttreenodes和动态 根据需要构建TTreeNodes。
  • 拥有多个不可见的TTreeView 刚刚用来制作的物品 TTreeNodes的工作原理。

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

3 个答案:

答案 0 :(得分:4)

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

TTreeView是Windows控件的包装器,TTreeNodesTTreeNode只是该包装器的一部分。它们实际上并不实现控件执行的所有树操作。如果当前没有可用的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。