【发布时间】:2011-01-16 20:50:29
【问题描述】:
我想曾经使用过 Delphi 的 VirtualStringTree 的每个人都会同意它是一个很棒的控件。这是一个“虚拟”控件(您的数据必须保存在其他地方)所以我在想哪种数据结构最适合这样的任务? IMO 认为数据结构必须支持层次结构,它必须快速且易于扩展。最简单的实现是使用记录,这就是大多数可以找到的文档所建议的。但是,如果您需要进行一些快速查找、计算总数等怎么办?与 VirtualStringTree 一起使用的数据结构是什么?
EDIT1:我使用的是 Delphi 2010。
好的,我将尝试提供有关我的要求的更多详细信息。 数据大小可以变化很大,从 1 到数千个项目。每个项目可以包含多个字符串、整数值。我需要随机访问,我的数据可以在应用程序生命周期内多次更改。良好的性能是非常可取的。我还需要数据保存和重新加载。
EDIT2: 得到 1 个答案,所以我会尝试评论我的意见。谢谢,多林你的回答,但是 我不认为你的结构很方便。 1)它不处理层次结构。 2) 每个节点都有单独的 TStringList 或 TList 不是很有效的 IMO。通过这种实现,我只能查找当前节点的数据,但不能有效地在整个树中搜索。
我觉得这个数据结构一定像一棵树。它必须具有能够添加子节点的节点。然后我可以在 OnInitNode 事件中获取节点的数据,检查我的节点是否有一些子节点,如果有则设置 ivsHasChildren 标志,然后在 OnInitChildren 事件中设置正确的子节点计数。稍后在 OnGetText 事件中,我可以从节点结构中获取所需的数据,并根据 Column 索引将其设置为 CellText。我的想法是拥有一个单独的数据结构并使用它进行所有需要的操作,而无需使用 VirtualStringTree。希望有人明白我的意思:)。
EDIT3:我发现了非常有趣的 JclTrees 单元,乍一看可以用来实现我正在寻找的东西。它属于JCL 库。缺乏像样的文档使得很难快速调查它的功能。当我有更多时间时,我可能会更深入地研究它。
【问题讨论】:
-
@Linas 您能否告诉我们更多有关您希望存储的数据的信息。它有多大?它在您的流程生命周期中如何变化?你需要随机访问吗?性能限制是什么?目前我觉得您的问题过于笼统,无法提供有意义的建议。
-
@Linas 随机访问意味着你需要一个数组。
-
@David a TList
恕我直言,但数组也可以。 -
@dorin TList 是一个数组
-
@David 是的,它是一个指针数组,但使用起来更容易:-) 这是我的观点。
标签: delphi data-structures virtualtreeview