问题标签 [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)
正如Rob Kennedy 先生所建议的那样,我已经到了需要停止将数据存储在 VCL 组件中并拥有“基础数据结构”的地步。
首先,这个问题是关于“我如何制作底层数据结构”。:)
我的层次结构由 2 个级别的节点组成。
现在,我通过循环根节点来遍历我的东西,其中我循环遍历根节点的子节点,以获得我需要的(数据)。我希望能够将我的所有数据存储在所谓的基础数据结构中,以便我可以使用线程轻松修改条目(我想我可以做到吗?)
但是,当循环遍历我的条目时(现在),结果取决于节点的 Checkstate - 如果我使用的是底层数据结构,我如何知道我的节点是否被检查,当我的数据结构循环时,而不是我的节点?
假设我想使用 2 个级别。
这将是父母:
还有孩子:
这基本上就是我现在所做的。评论指出这不是最好的解决方案,所以我愿意接受建议。:)
我希望你能理解我的问题。:)
谢谢!
delphi - 鼠标移动时单元格内的虚拟 TreeView 更新提示
我使用 TVirtualStringTree 作为网格,效果很好。
当用户将鼠标放在单元格上时,我正在使用树视图提示功能来显示提示。 我不得不将 HintMode 更改为 hmHint,因为无论单元格文本长度如何,我都希望我的提示出现。
我现在要做的是根据鼠标在单元格内的位置显示不同的提示。
在使用 OnGetHint 事件显示提示之前,我可以做到这一点。我的问题是仅在用户将鼠标移动到另一个单元格时才会引发此事件。
我看不到在提示显示和鼠标在同一单元格内移动时更新提示的方法
我已经使用应用程序的 OnShowHint 事件查看了其他控件的建议,但它们似乎只是使提示消失并且不再显示。
有人有什么想法吗?
谢谢
更新
经过一番调查后,我发现它可以帮助某人提出解决方案:
CMHintShow 方法将 HintInfo 记录的 CursoRect 字段设置为单元格的边界。这似乎阻止了 VCl 再次触发提示代码,直到鼠标移出该矩形 (TApplication.HintMouseMessage)。
如果我将 CursorRect 设置为小于单元格边界的值,则提示将更新。我在几个地方出于不同的目的使用了 VT,所以我不能直接进行这些更改。获得不需要此更改的解决方案会很好。
delphi - 如何从 TStringList 添加到 VirtualTreeView?
这是我“试图”实现的目标
我有一个生成密码的功能,然后我将其添加到 TStringList 之后,我应该用这些项目填充 VirtualTreeView,但我没有运气可以快速到达任何地方。应该如何以正确的方式完成?我还在学习,不是专业人士。
我生成密码的功能:
我是这样称呼它的
我希望我以完全错误的方式这样做,我已经尝试了 2 天,如果有人能告诉我我应该如何去做,那就太好了。
克里斯
delphi - 如何在 TVirtualDrawTree 中创建具有透明背景的节点?
我正在从 TVirtualDrawTree 派生一个自定义控件,并且我正在覆盖该DoPaintBackground
事件以绘制树视图的背景渐变效果。
我也重写了这个DoBeforeItemPaint
函数,所以我可以自定义绘制树视图项。但是,我不能完全设法让项目以透明背景绘制。
查看 TVirtualDrawTree 的源代码,看起来好像该项目被复制到 TBitmap 图像然后复制到画布上,但是,我尝试编辑源代码并在位图本身上设置透明度选项,但它似乎仍然没有工作。
我还尝试在绘制之前清除画布Canvas.Brush.Style := bsClear
并填充项目矩形,但没有任何乐趣。
multithreading - 从另一个线程访问 VT 数据是否安全?
从辅助线程更改 VirtualTreeView 数据是否安全?如果是,我应该使用关键部分(甚至是同步方法)吗?
恐怕当我从另一个线程写入 VT 的数据记录时,主线程会同时调用它的重绘,这个刷新会导致一次读取相同的记录。我会补充说我在应用程序中只使用了 2 个线程。
就像是 ...
更新
我已经在代码中添加了关键部分,即使这个函数只返回一个指向记录的指针,从 TMyCreatedThread 类调用 GetNodeData 真的不安全吗?
非常感谢
问候
delphi - 如何保持多个虚拟树视图节点的检查状态同步?
我的树有 2 个级别的节点 - 它是一个联系人列表样式树。
我的问题是,我想检查所有“联系人类别”中的每个联系人。这是我现在看起来的联系人列表的屏幕截图(是的,我有权发布它)
如您所见,Todd Hirsch在 Category Test Category中被选中,但不是在All Contacts中。我想要实现的是让联系人在每个类别中都具有相同的检查状态。
示例:我在测试类别中检查 Todd Hirsch - Todd Hirsch 在所有联系人(以及所有其他类别)中自动检查。如果我在所有联系人中检查 Todd Hirsch,他也会在测试类别中检查。如果我在所有联系人中取消选中 Todd Hirsch,他也将在测试类别中取消选中。
我尝试通过 VirtualStringtree 的 OnChecking 事件来完成它,通过循环遍历树中每个节点的整个树,但是当联系人列表很大(2000 +)时,它非常慢,当有 5000 + 时,它甚至可能使我的程序崩溃(应用程序已停止工作)
你有什么建议?
这是我用来确保只检查一次联系人的代码。(这不是我现在想要的,但这是我现在正在使用的。)
delphi - 是否可以在 VirtualStringTree 中多次显示一个对象?
我意识到我真的需要重写我的程序数据结构(不是现在,而是很快,因为截止日期是星期一),因为我目前正在使用 VST(VirtualStringTree)来存储我的数据。
我想要实现的是一个联系人列表结构。根节点是类别,子节点是联系人。总共有2个级别。
问题是,我需要一个联系人来显示超过 1 个类别,但它们需要同步。特别是Checkstate。
目前,为了保持同步,我循环遍历整个树以查找与刚刚更改的节点具有相同 ID 的节点。但是当有大量节点时这样做非常慢。
所以,我想:是否可以在多个类别中显示联系人对象的一个实例?
注意:老实说,我不是 100% 熟悉这个术语——我的意思是实例,是一个对象(或记录),所以我不必查看整个树来查找具有相同 ID 的联系人对象。
这是一个例子:
如您所见,Todd Hirsch 出现在测试类别和所有联系人中。但在幕后,那些是 2 PVirtualNodes,所以当我更改节点之一(如 CheckState)的属性或节点的数据记录/类中的某些内容时,这 2 个节点不同步。目前我可以同步它们的唯一方法是遍历我的树,找到包含相同联系人的所有节点,并将更改应用于它们及其数据。
总结一下:我正在寻找的是一种使用一个对象/记录并将其显示在我的树中的多个类别中的方法 - 每当检查一个节点时,包含相同联系人对象的每个其他节点也会如此。
我在这里有意义吗?
delphi - 如何修改 TVirtualStringTree 中的焦点框颜色?
我需要修改 TVirtualStringTree 的焦点框边框颜色,就像这张图片:
delphi - Delphi 最好的免费第 3 方树实现是什么?
我需要一个可以与 Virtual Treeview 一起使用的树实现,它不会消耗太多内存,易于使用,并且与 VT 一样快(也就是说,当我将数据存储在 VT 本身时)
我尝试了 Linas 的 svTree - 它易于使用,但不像我希望的那样快速和内存友好。
另外,只想指出我的应用程序将管理数千个节点。:)
你推荐什么免费图书馆?您能否构建一个如何与 Virtual Treeview 一起使用的最小演示?
delphi - 单独的数据结构与 VirtualStringTree 的 PVirtualNodes 来存储数据?
所以我一直在搞乱创建自己的单独数据结构。我终于让它工作了,但后来我发现与旧方法相比,内存使用率高得离谱。
为了测试这一点,我创建了相同的测试应用程序,但我会将数据存储在我的 PVirtualNodes 中。
添加 1000 个根,每个根有 1000 个子节点时,单独的数据结构使用大约 208 MB,而 PVirtualNode 仅使用大约 160 MB,而且速度也快了一点。
我认为使用单独的数据结构应该使用更少的内存,并且速度更快,但我想这就是价格吗?
这是“在 PVirtualNode 中存储数据”的来源:http: //pastebin.com/j6L2eHJt
这是“将数据存储在单独的数据结构中”的来源: http ://pastebin.com/iSwR0hW1