问题标签 [virtualtreeview]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - 如何构建数据库以快速访问节点
我正在寻找一种使用 VirtualTreeView 和 SQLite 数据库来构建数据库以快速检索数据的方法。使用 VirtualTreeView 有一个 OnNodeInit 事件,但它并不总是适用于此目的。
数据是从 Usenet 新闻组中获取的,需要进行线程化。对线程有用的数据是帖子 id(int64,也是主键)、引用(引用线程中以前帖子的字符串)。
该程序在引用中搜索字符串并确定它应该在哪个 postid 下。因此,例如帖子 id = 1234,那么下一个帖子可能是 1235,然后 1236 可能是对 1234 的回复。
这是一个可能的数据库示例:
所以现在这就是它现在的样子。
现在,问题是如何构建这些数据以加快检索速度。如果只有一个根节点,我可以根据数据库条目分配 RootNodeCount,然后在 OnNodeInit 中按要求一一读取。当有子节点时,我需要以某种方式重新排列数据库,以便它知道如何根据打开的节点更快地获取子节点。
我正在考虑为附加字段“has_subnodes”分配随后的子节点ID。单击一个节点时,它会读取该节点和每个链接的节点。
你将如何组织这个数据库以便它可以在 OnNodeInit 中很好地读取,或者你会使用那个事件吗?节点也可以使用 AddChildNoInit() 方法启动。欢迎任何想法或指示。
更新(以及我是如何解决的)
这里有一些与虚拟树视图无关的信息: 在数据库中实现分层数据结构
我最终做的是使用 Modified Preorder Tree Traversal 将有关节点的信息存储在数据库中,并且每次首先请求某个节点时:
a) 它在内部缓存中查找,该缓存基本上与 VirtualTreeView 结构具有相同的结构。
b) 如果在缓存中找到,则删除此缓存条目(它永远不会超过 100 个项目)
c) 如果没有找到,额外的 100 个项目被添加到缓存中(从请求的节点向上 50,向下 50)。如果需要,当然可以将此数量修改为 500 或 1000 个项目。有一些额外的检查来查看它需要读取多少向上/向下以避免读取过多的重复条目。
d)如果我需要更快的速度,我可以应用额外的技术——根据用户滚动 virtualtreeview 的多少从数据库加载节点——类似于 std::vector 分配内存的方式——首先我只加载 100 个节点,然后如果用户滚动很多,我加载 200,然后 400 等等......用户滚动的越多,加载整个树的速度越快,但如果他/她从不滚动,仍然不会加载它。
这样,从未见过的节点永远不会从数据库中加载。它适用于使用鼠标滚轮滚动(当它通过缓存为空且需要来自磁盘的更多数据的点时偶尔会有短暂的延迟)和使用箭头按钮/键滚动。当您将滚动条拖动到某个位置(例如从底部到中间)时,速度会稍慢一些,但这是意料之中的,因为无法立即从磁盘获取数据。
最好在加载缓存/项目之前预先确定要为缓存/项目使用多少内存,滚动速度越快,但如果数据从未显示,它当然会使用更多内存。
delphi - VirtualStringTree - 在单元格中嵌入控件 - 控件不显示
所以,我在这里的最终目标是有一种方法来列出项目(如 vsReport 中的 TListView),并在客户区域内使用添加/删除按钮。
前任:
如果您知道一个无需所有这些额外工作就可以做到这一点的组件,请告诉我!
所以我选择了一个红色的关闭“X”并使用 TJvTransparentButton (Jedi Components - JVCL) 来显示它。它处理按下/未按下状态并且只显示图像。我最初使用的是 TButton,但我不需要字形周围的所有绒毛。
现在,我将图像按钮保留在与每个节点关联的记录中。
代码如下:
在 OnAfterCellPaint 事件中,我管理图像按钮的定位,如下所示:
现在的问题是这根本不显示该项目。我知道 TImageList 中的图像很好,因为我可以在设计时创建按钮,并且在运行时看起来很好。
我也知道这段代码应该可以工作,因为如果我将 TJvTransparentButton 设为常规 TButton(不更改代码逻辑),它工作得很好并且显示得很好!
我唯一能想到的是 TButton 从 TWinControl 继承,而 TJvTransparentButton 从 TControl 继承。
有任何想法吗?
delphi - VirtualTreeView 中 IVTEditLink 编辑器的多个组件
有没有办法将多个组件添加到 VirtualTreeView 的 IVTEditLink 编辑器中?
delphi - 尝试为 Delphi XE2 安装 Virtual Treeview
在这里找到树干:http: //virtual-treeview.googlecode.com/svn/trunk/
下载的文件...解决了搜索路径的一些错误(VirtualTreesD 找不到所需的包“dclstd” - 它位于 lib/win32/release 中,将其添加到库 Delphi 路径中)
当我尝试构建所有我得到以下错误:
[DCC 致命错误] VirtualTreesR.dpk(29):E2225 必须重新编译从未构建的包 'dclstd' [DCC 致命错误] VirtualTreesD.dpk(35):E2202 找不到所需的包 'VirtualTreesR'
delphi - 为虚拟树列表节点设置标题
我无法理解文档中描述的过程。它说使用事件:
我怎么做?我不能就这样重新声明它。当我双击树列表OnGetTextEvent
时,它会向我抛出一些异常“属性和方法不兼容”
delphi - 迭代节点及其子节点并修改数据
我正在为 delphi 2009 使用虚拟树列表。我创建了一个包含以下数据的树:
我想迭代所有元素,但按特定顺序。我需要获取第一个顶级节点,然后遍历其所有子节点并修改FPath
字段。当我处理完它的子节点后,我想获得另一个顶级节点,依此类推。
首先,我不知道如何迭代顶级节点。
提前感谢您对此的任何提示
delphi - Tvirtualstringtree,超过2000行,它在底部添加节点并且变得不可见并且也不会在绘图功能上触发?
我阅读了有关隐藏和显示节点以进行过滤的文本,但如果我们设置超过 2000 行以使节点可见/不可见,
当我们尝试将ChildNode插入顶部时,在这一行之后,它会将节点添加到底部,并且此行中没有显示任何节点。
我查看了代码中提到的VirtualTreeView → CacheThreshold的代码作为init value 2000?
如果将节点添加到第一个函数,则可以重现错误
您可以随时添加很多行。
但是,当您在此操作后将所有这些行设置为可见时,
如果节点数达到大于CacheThreshold,则尝试插入更多根节点(始终为 root=nil)将被添加到底部,例如不可见节点。
只有白色空白区域显示添加了这个早期的孩子......在树的底部?
另外,对于这个空白区域,不会触发OnGetText、OnPaint事件吗?
我试图增加CacheThreshold,那么这些增加的数量是可以的,但是在更大的数量之后会出现同样的问题。
[编辑]
如果我使用下面的代码,它可以正常工作,但它会花费更多的 CPU 使用率,
但是如果我使用下面的代码,它可以工作一段时间,然后在 2000 年之后变得不稳定(默认缓存阈值),我将节点添加到顶部,但是在 2000 年添加之后,它开始添加到底部并且节点变得不可见,但体积为只有空白区域的行..我想使用代码作为打击来更新只关注的行,但是在 2000 年 NodeisVisible() 函数调用之后它是有问题的
NodeisVisibleFunction 是:
delphi - Delphi VirtualTreeView - 节点悬停时自动聚焦节点
我正在将一个节点从一个应用程序拖到另一个应用程序。只有当我之前选择节点时它才能正常工作。GetNodeData(FocusedNode)
这是因为我使用方法收集数据。
我想以某种方式将节点自动聚焦在节点悬停上。是否可以?
我正在使用 VirtualTreeView v. 4.8.7
delphi - VirtualTreeView:检查节点是否可见
如何使用 VirtualTreeView 组件检查节点是否可见(在屏幕上)?像这样的东西:
如果节点不可见,则应居中,但如果可见,则保持原位。
请注意,我不是在谈论节点的可见标志,而是在屏幕上的可见性。在我的情况下,该IsVisible
物业总是返回。True
delphi - 如何隐藏虚拟字符串树中的特定列?
如何隐藏虚拟字符串树中的特定列?
我试过这段代码:
它显示列,但不显示标题标题。为什么?