2

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

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

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

  • 在没有 ttreenodes 的情况下维护我自己的树结构并根据需要动态构建 TTreeNodes。
  • 拥有多个不可见的 TTreeView 对象,这些对象仅用于使 TTreeNodes 工作。

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

4

3 回答 3

4

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

TTreeView是 Windows 控件的包装器,并且TTreeNodes只是TTreeNode该包装器的一部分。它们实际上并没有实现控件所做的所有树操作。如果当前没有任何 Windows 控件可用,则某些操作无效。

TTreeView是一种视觉控制。如果您没有任何可视化的东西,那么它不适合您。如果您有多个树数据结构,并且您只想要一个树控件,那么每当您切换到不同的结构时,您将不得不销毁和重新创建树节点。该控件甚至没有提供暂时隐藏某些节点的方法。

您可能对Mike Lischke 的虚拟树控件感兴趣。在其预期用途中,您自己管理树数据结构;该控件只是一个可视化。它询问您每个节点有多少个子节点,然后在每次必须绘制该节点时询问您每个节点的文本是什么。它管理哪些节点被展开、选择、检查或可见,但您管理所有数据。它是免费和开源的

于 2009-07-28T13:17:52.957 回答
3

如果您查看 TTreeNodes 的源代码,您会发现它需要 Owner(它是一个 TCustomTreeView)。您可以使用隐藏的树视图或创建自定义子类。

我更喜欢将 gui 与数据模型分开。所以总是有一个具有正确关系的数据模型。

于 2009-07-28T11:00:07.507 回答
2

(主要)原因可能是阻止您在超过 1 个 TTreeview 中出现 TTreeNode。这是一种常见的设计模式,也可以在 XmlNode 类等中找到。

至于您的 2 个选项,如果不了解项目中的内容/方式/数量,很难说。

如果与节点集相关的外观/行为有最细微的差异,我会去交换 TTreeviews。

于 2009-07-28T10:57:48.307 回答