为什么 Delphi TTreeNodes 从根本上与 TCustomTreeView 相关?

Rod*_*ddy 3 delphi tree c++builder ttreenodes

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

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

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

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

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

Rob*_*edy 5

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

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

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

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