Delphi非可视化TTree实现

4
我正在寻找一种非可视的持久树(TStringTree)实现。如果有人知道任何好的实现方法,请告诉我。
谢谢。
5个回答

6

DI容器库(商业)中,您将找到一个灵活的、非可视的树形结构。然而,正如其他人在上面指出的那样,很容易自己编写,只需添加所需的功能即可。

您只需要两个基本对象:TNode和TNodeList(例如TObjectList派生)。最少,TNode只需要三个成员:您的字符串数据、它的父节点的引用(如果节点是根则为nil),以及TNodeList,这是它的子节点列表。剩下的是实现各种附属方法的(有点繁琐),例如Add()、Delete()、IndexOf()、MoveTo()、GetFirstChild()、GetNext()等。基本树应该不到一晚。


这就是为什么我向他推荐了Bucknall的书;它包含了树、链表等的实现,我想它可能会提供一些替代方案。 - Ken White
@Moodfaraday。谢谢,这是一个简单的方式。但它没有持久性行为。 - Francis Lee
@Francis:我确实错过了“持久性”要求,很抱歉。DI容器库确实具有持久性功能,通过SaveToStream/LoadFromStream方法为其所有数据结构提供支持。我自己没有使用过DI容器,但我使用了来自同一供应商的其他三个组件,在我的经验中都非常可靠。 - Marek Jedliński

2

是什么类型的树?B-树?Splay 树?红黑树?这些都是常见的树算法。

你可能想看看 Julian Bucknall 的书,Tomes of Delphi: Data Structures and Algorithms。它包含各种树实现和完整的 Delphi 源代码;你可以轻松地将它们中的任何一个适应于字符串工作。


这似乎更多关于二叉树索引等内容。我正在寻找的是更为常见的树实现。因为VCL有很多不同的列表(TList,TCollections等),但没有一个树实现。 - Francis Lee
您可以使用平衡和非平衡树来进行不仅限于索引的操作...您到底想做什么?除了能够组织数据以便搜索(因此用于索引查询),树形结构在非可视化方面还有什么用途? - Ken White
在我看来,树的实现在许多情况下都是不错的选择。VCL中有很多非可视列表和充满了可视化树形结构。但是并没有一个基类可以作为其他类的良好起点。例如,目录结构或所有互联网相关的内容,如HTML、XML、JSON等等。在我的情况下,我想使用它来获取不同层次的内容部分。 - Francis Lee

2
当然,还有那个时髦的DECAL(以前叫Rosetta),试图创建一种使用接口和变量的STL类型。更多的是为那些追求灵活性而不是速度的人。基本的树结构是红黑树。 http://sourceforge.net/projects/decal/

1
你可以使用tStringList,并添加其他tStringList对象……虽然不太精细,但如果你的数据只能表示为字符串数据,这种方法是可行的。
Child := tStringlist.create;
ParentList.AddObject('Child',Child);

当然,更好的解决方案是创建自己的对象,其中包含一个对象列表。

1

为什么不直接使用XML DOM文档?

对于一个真正微不足道的字符串树来说,这可能有些过度,但是对于这个目的而言使用XML DOM并不会太繁琐,而且它还具有可适应字符串树任何扩展的好处(例如用作属性等来存储每个字符串的附加数据),如果需要的话。

根据我的经验,通常最初或预期需求微不足道的东西很快就会超出预期。 :)

如果您担心基于COM的XML实现和VCL包装器的“开销”,您可以尝试TNativeXML


基本上我正在寻找一种树实现,没有任何关于Json或XML的参考,只有最基本的。 - Francis Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接