- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想每个曾经使用过Delphi的VirtualStringTree的人都会同意它是一个很棒的控件。它是一个“虚拟”控件(您的数据必须保存在其他地方),所以我在想什么数据结构最适合这样的任务? IMO认为数据结构必须支持层次结构,它必须快速且易于扩展。最简单的实现是使用记录,这是大多数可以找到的文档所建议的。但是如果您需要进行一些快速查找、计算总数等怎么办?您将什么数据结构与 VirtualStringTree 一起使用?
EDIT1:我正在使用 Delphi 2010。
好的,我会尝试提供有关我的要求的更多详细信息。数据大小可能变化很大,从 1 个项目到数千个项目。每个项目可以保存多个字符串、整数值。我需要随机访问,我的数据在应用程序生命周期内可能会多次更改。良好的性能是非常可取的。我还需要保存和重新加载数据。
编辑2:得到 1 个答案,所以我会尝试发表我的意见。谢谢,多林的回答,但是我认为你的结构不是很方便。1)它不涉及层次结构。2) 在我看来,为每个节点使用单独的 TStringList 或 TList 并不是非常有效。通过这个实现,我只能查找当前节点的数据,但无法有效地在整个树中搜索。
我想这个数据结构一定像一棵树。它必须具有能够添加子节点的节点。然后我就可以在 OnInitNode 事件中获取节点的数据,检查我的节点是否有一些子节点,如果有,则设置 ivsHasChildren 标志,然后在 OnInitChildren 事件中设置正确的子节点计数。稍后在 OnGetText 事件中,我可以从节点结构中获取所需的数据,并根据列索引将其设置为 CellText。我的想法是拥有一个单独的数据结构,并用它执行所有需要的操作,而不需要使用 VirtualStringTree。希望有人明白我的观点:)。
EDIT3:我发现了非常有趣的 JclTrees 单元,乍一看可以用来实现我正在寻找的东西。它属于JCL图书馆。缺乏像样的文档使得快速研究其功能变得困难。当我有更多时间时,我可能会更深入地研究它。
最佳答案
好的,因为给定的答案没有解决我的问题,所以我编写了自己的树数据结构,它模仿 TVirtualStringTree 并处理我在问题中提到的所有问题。现在我可以选择仅使用我的数据结构,其中的所有更改都会自动更新 VirtualStringTree。我想我稍后会在某个地方上传源代码并在此处发布链接。感谢您的所有回答。
编辑:我已将源代码上传到 Google 代码:svTrees 。有一个小演示展示了它是如何工作的。
关于delphi - 哪种数据结构最适合 VirtualStringTree?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4707959/
是的,我知道我发布了很多问题,但那是因为我要么需要保证我做对了,我做错了什么,要么我完全一无所知,并且在文档中找不到任何东西。无论如何, 我正在尝试检查重复的节点。这是我想要的方式: 循环遍历我的节点
我有一个带有 X header 和 x 根的 virtualstringtree(启用了网格线)。 我想将子项(至少 1 个)添加到只有 1 个文本位于中间并通过所有标题(独立)的根中。因此,无论我是
我在窗体上有一个virtualstringtree控件,该控件必须显示图像列表中某些节点的图标。这很好用,但是,对于某些节点,还必须显示与节点和正方形一样高的自定义绘制图标。 我正在使用OnBefor
我想在单元格文本已完全显示时显示提示。 所以,在表单的 OnCreate 上 procedure TForm1.FormCreate(Sender: TObject); begin Virtual
是否可以隐藏 VirtualStringTree 中的特定节点?我正在实现“过滤”功能(VST 充当包含列的列表),并且我希望避免每次更改过滤器时重新加载内容 - 相反,更快的方法是告诉 VST 不要
我想每个曾经使用过Delphi的VirtualStringTree的人都会同意它是一个很棒的控件。它是一个“虚拟”控件(您的数据必须保存在其他地方),所以我在想什么数据结构最适合这样的任务? IMO认
如果 VirtualStringTree 中的节点是多行的(与 Node.States 中的 Multiline 相比),那么如何使该节点中所有列(多行列除外)的文本垂直居中? 我尝试使用OnBefo
我正在尝试更改节点的索引,因为有些特定节点始终需要位于树的底部。我试图更改 Node.Index,但这并没有改变任何东西。所以我的问题是:如何更改 PVirtualNode 的索引? 谢谢! - 杰夫
VirtualStringTree的滚动条如何刷新如果每个节点高度都更改为不同的高度。因为,滚动仍然处于相同状态,导致滚动时无法查看其他节点。 toVariableNodeHeight选项不起作用?还
我有一个带有 X 个根和 X 个子节点的 VirtualStringTree。 每个根都有一个特殊的 NodeData 分配。 每个子节点都分配了另一个 NodeData。 我怎么知道 OnFreeN
我启用了 MultiSelect 选项的 VST。 How can I retrieve the list of selected nodes in VirtualStringTree when th
我正在寻找一个程序或某些东西,如果我右键单击一个节点(或通常在 VirtualStringTree 上),它就会被触发 我有以下场景: 我的 VST 接近 ListView 。 我只能用鼠标多选根节点
是否可以锁定VirtualStringTree中的第0列(带有节点名称)像在 Excel 中一样水平滚动吗? 最佳答案 如果我没记错的话,此功能是在版本 5 中引入的。要在其 Options 中设置列
我目前在树的 OnBeforeCellPaint 事件中使用此代码: if Node.Index mod 2 = 0 then begin TargetCanvas.Brush.Color :=
我使用 virtualstringtree 一段时间了。我将它用于两个不同的用途,首先是一个用于选择、显示数据的普通树,其次是作为一个网格来显示 SQL 语句的输出。 我加载到树中的所有数据都来自数据
我有一个包含 3 列的 VST,均匀地占用可用空间。 我已在 Header.Options 中设置了 hoAutoSpring,并且 所有列都设置了 Column[x].Option 和 coAuto
所以,我的最终目标是找到一种方法,通过客户端区域内的添加/删除按钮来列出项目(例如 vsReport 中的 TListView)。 例如: |----------------| |Old Item 1
我正在尝试将项目从 D6 移动到 D-XE3。使用 VirtualStringTree 5.10 版本在 OnSaveNode 和 OnLoadEvents 中保存和加载树数据时,我遇到了垃圾。我可能
当从控件拖动到 VirtualStringTree 时,如果该控件具有 TDragObject,则预计将其用作 OnDragDrop 和 OnDragOver 中的源,但它始终返回该组件。我相信这是一
我正在严格按照本教程来保存和加载我的 VirtualStringTree:http://wiki.freepascal.org/VirtualTreeview_Example_for_Lazarus我
我是一名优秀的程序员,十分优秀!