【问题标题】:Delphi non visual TTree implementationDelphi 非可视化 TTree 实现
【发布时间】:2009-12-03 17:43:13
【问题描述】:

我正在寻找一种非可视化持久树 (TStringTree) 实现。如果有人知道它有什么好的实现,请告诉我。

谢谢。

【问题讨论】:

    标签: delphi tree vcl


    【解决方案1】:

    您会在DI Containers 库(商业)中找到一个灵活的非可视树结构。但是,正如其他人在上面所指出的那样,推出自己的功能真的很容易,只添加您需要的功能。

    您可以只使用两个基础对象:TNode 和一个 TNodeList(例如,一个 TObjectList 后代)。至少,TNode 只需要三个成员:您的字符串数据、对其父节点的引用(如果该节点是根节点,则为 nil)和一个 TNodeList,它是其子节点的列表。剩下的是(有点乏味的)各种伴随方法的实现,例如 Add()、Delete()、IndexOf()、MoveTo()、GetFirstChild()、GetNext() 等。基本树应该小于一个-通宵。

    【讨论】:

    • 这就是我向他推荐巴克纳尔书的原因;它有树、链表等的实现,我认为它可能会提供替代方案。
    • @Moodfaraday。谢谢,这是一个简单的方法。但它没有持久性行为
    • @Francis:我确实错过了“持久”要求,抱歉。 DI Containers 库确实通过 SaveToStream/LoadFromStream 方法为其所有数据结构内置了持久性。我自己没有使用过 DI 容器,但我使用了来自同一供应商的其他三个组件,根据我的经验,它们都非常可靠。
    【解决方案2】:

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

    您可能想看看 Julian Bucknall 的书,Tomes of Delphi: Data Structures and Algorithms。它有各种具有完整 Delphi 源代码的树实现;您可以轻松地调整它们中的任何一个以使用字符串。

    【讨论】:

    • 这看起来更多关于二叉树索引等。我正在寻找更简单的东西,它是一个树实现。因为 VCL 有很多不同的列表(tlist、tcollection 等)但没有一个树实现。
    • 您可以使用平衡树和非平衡树进行索引之外的其他用途...您到底想做什么?除了能够组织数据以便能够搜索它(因此通常用于索引)之外,非可视化的树结构有什么用?
    • 在我看来,树的实现在很多情况下都很好。 VCL 有大量的非视觉列表和视觉树。但是树没有一个基类,这对于其他一些类来说可能是一个好的开始。例如目录结构,或者所有的互联网内容,如 HTML、XML、JSON 等
    【解决方案3】:

    当然还有时髦的 DECAL(以前的 Rosetta),它尝试使用接口和变体创建一种 STL。

    http://sourceforge.net/projects/decal/

    更多的是为人们提供灵活性而不是速度。基本树结构是红黑 iirc。

    【讨论】:

      【解决方案4】:

      为什么不简单地使用 XML DOM 文档?

      对于一个真正微不足道的字符串树来说,这可能有点过头了,但用于该目的不会太繁琐,而且它的好处是能够容纳几乎任何对字符串树的扩展(用于存储额外的数据如果需要,树中的每个字符串 - 作为属性等)。

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

      如果您担心基于 COM 的 XML 实现和围绕它的 VCL 包装器的“开销”,您可以查看TNativeXML

      【讨论】:

      • 基本上我正在寻找一个没有任何 Json 或 XML 引用的树实现,只有准系统。
      【解决方案5】:

      您可以只使用 tStringList 并添加其他 tStringLists 的对象...粗略,但如果您的数据只能表示为字符串数据,它就可以工作。

      Child := tStringlist.create;
      ParentList.AddObject('Child',Child);
      

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

      【讨论】:

        猜你喜欢
        • 2011-03-20
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 2013-01-24
        相关资源
        最近更新 更多