问题标签 [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.

0 投票
6 回答
6094 浏览

delphi - 树状数据结构(用于 VirtualTreeview)

正如Rob Kennedy 先生所建议的那样,我已经到了需要停止将数据存储在 VCL 组件中并拥有“基础数据结构”的地步。

首先,这个问题是关于“我如何制作底层数据结构”。:)

我的层次结构由 2 个级别的节点组成。

现在,我通过循环根节点来遍历我的东西,其中我循环遍历根节点的子节点,以获得我需要的(数据)。我希望能够将我的所有数据存储在所谓的基础数据结构中,以便我可以使用线程轻松修改条目(我想我可以做到吗?)

但是,当循环遍历我的条目时(现在),结果取决于节点的 Checkstate - 如果我使用的是底层数据结构,我如何知道我的节点是否被检查,当我的数据结构循环时,而不是我的节点?

假设我想使用 2 个级别。

这将是父母:

还有孩子:

这基本上就是我现在所做的。评论指出这不是最好的解决方案,所以我愿意接受建议。:)

我希望你能理解我的问题。:)

谢谢!

0 投票
1 回答
1738 浏览

delphi - 鼠标移动时单元格内的虚拟 TreeView 更新提示

我使用 TVirtualStringTree 作为网格,效果很好。

当用户将鼠标放在单元格上时,我正在使用树视图提示功能来显示提示。 我不得不将 HintMode 更改为 hmHint,因为无论单元格文本长度如何,我都希望我的提示出现。

我现在要做的是根据鼠标在单元格内的位置显示不同的提示。

在使用 OnGetHint 事件显示提示之前,我可以做到这一点。我的问题是仅在用户将鼠标移动到另一个单元格时才会引发此事件。

我看不到在提示显示和鼠标在同一单元格内移动时更新提示的方法

我已经使用应用程序的 OnShowHint 事件查看了其他控件的建议,但它们似乎只是使提示消失并且不再显示。

有人有什么想法吗?

谢谢

更新

经过一番调查后,我发现它可以帮助某人提出解决方案:

CMHintShow 方法将 HintInfo 记录的 CursoRect 字段设置为单元格的边界。这似乎阻止了 VCl 再次触发提示代码,直到鼠标移出该矩形 (TApplication.HintMouseMessage)。

如果我将 CursorRect 设置为小于单元格边界的值,则提示将更新。我在几个地方出于不同的目的使用了 VT,所以我不能直接进行这些更改。获得不需要此更改的解决方案会很好。

0 投票
3 回答
1520 浏览

delphi - 如何从 TStringList 添加到 VirtualTreeView?

这是我“试图”实现的目标

我有一个生成密码的功能,然后我将其添加到 TStringList 之后,我应该用这些项目填充 VirtualTreeView,但我没有运气可以快速到达任何地方。应该如何以正确的方式完成?我还在学习,不是专业人士。

我生成密码的功能:

我是这样称呼它的

我希望我以完全错误的方式这样做,我已经尝试了 2 天,如果有人能告诉我我应该如何去做,那就太好了。

克里斯

0 投票
1 回答
1050 浏览

delphi - 如何在 TVirtualDrawTree 中创建具有透明背景的节点?

我正在从 TVirtualDrawTree 派生一个自定义控件,并且我正在覆盖该DoPaintBackground事件以绘制树视图的背景渐变效果。

我也重写了这个DoBeforeItemPaint函数,所以我可以自定义绘制树视图项。但是,我不能完全设法让项目以透明背景绘制。

查看 TVirtualDrawTree 的源代码,看起来好像该项目被复制到 TBitmap 图像然后复制到画布上,但是,我尝试编辑源代码并在位图本身上设置透明度选项,但它似乎仍然没有工作。

我还尝试在绘制之前清除画布Canvas.Brush.Style := bsClear并填充项目矩形,但没有任何乐趣。

0 投票
1 回答
639 浏览

multithreading - 从另一个线程访问 VT 数据是否安全?

从辅助线程更改 VirtualTreeView 数据是否安全?如果是,我应该使用关键部分(甚至是同步方法)吗?

恐怕当我从另一个线程写入 VT 的数据记录时,主线程会同时调用它的重绘,这个刷新会导致一次读取相同的记录。我会补充说我在应用程序中只使用了 2 个线程。

就像是 ...

更新

我已经在代码中添加了关键部分,即使这个函数只返回一个指向记录的指针,从 TMyCreatedThread 类调用 GetNodeData 真的不安全吗?

非常感谢

问候

0 投票
3 回答
5105 浏览

delphi - 如何保持多个虚拟树视图节点的检查状态同步?

我的树有 2 个级别的节点 - 它是一个联系人列表样式树。

我的问题是,我想检查所有“联系人类别”中的每个联系人。这是我现在看起来的联系人列表的屏幕截图(是的,我有权发布它)

联系人列表

如您所见,Todd Hirsch在 Category Test Category中被选中,但不是在All Contacts中。我想要实现的是让联系人在每个类别中都具有相同的检查状态。

示例:我在测试类别中检查 Todd Hirsch - Todd Hirsch 在所有联系人(以及所有其他类别)中自动检查。如果我在所有联系人中检查 Todd Hirsch,他也会在测试类别中检查。如果我在所有联系人中取消选中 Todd Hirsch,他也将在测试类别中取消选中。

我尝试通过 VirtualStringtree 的 OnChecking 事件来完成它,通过循环遍历树中每个节点的整个树,但是当联系人列表很大(2000 +)时,它非常慢,当有 5000 + 时,它甚至可能使我的程序崩溃(应用程序已停止工作)

你有什么建议?

这是我用来确保只检查一次联系人的代码。(这不是我现在想要的,但这是我现在正在使用的。)

0 投票
1 回答
714 浏览

delphi - 是否可以在 VirtualStringTree 中多次显示一个对象?

我意识到我真的需要重写我的程序数据结构(不是现在,而是很快,因为截止日期是星期一),因为我目前正在使用 VST(VirtualStringTree)来存储我的数据。

我想要实现的是一个联系人列表结构。根节点是类别,子节点是联系人。总共有2个级别。

问题是,我需要一个联系人来显示超过 1 个类别,但它们需要同步。特别是Checkstate

目前,为了保持同步,我循环遍历整个树以查找与刚刚更改的节点具有相同 ID 的节点。但是当有大量节点时这样做非常慢。

所以,我想:是否可以在多个类别中显示联系人对象的一个​​实例?

注意:老实说,我不是 100% 熟悉这个术语——我的意思是实例,是一个对象(或记录),所以我不必查看整个树来查找具有相同 ID 的联系人对象。

这是一个例子:

例子

如您所见,Todd Hirsch 出现在测试类别和所有联系人中。但在幕后,那些是 2 PVirtualNodes,所以当我更改节点之一(如 CheckState)的属性或节点的数据记录/类中的某些内容时,这 2 个节点不同步。目前我可以同步它们的唯一方法是遍历我的树,找到包含相同联系人的所有节点,并将更改应用于它们及其数据。

总结一下:我正在寻找的是一种使用一个对象/记录并将其显示在我的树中的多个类别中的方法 - 每当检查一个节点时,包含相同联系人对象的每个其他节点也会如此。

我在这里有意义吗?

0 投票
2 回答
2342 浏览

delphi - 如何修改 TVirtualStringTree 中的焦点框颜色?

我需要修改 TVirtualStringTree 的焦点框边框颜色,就像这张图片:

从灰色到红色

0 投票
4 回答
1429 浏览

delphi - Delphi 最好的免费第 3 方树实现是什么?

我需要一个可以与 Virtual Treeview 一起使用的树实现,它不会消耗太多内存,易于使用,并且与 VT 一样快(也就是说,当我将数据存储在 VT 本身时)

我尝试了 Linas 的 svTree - 它易于使用,但不像我希望的那样快速和内存友好。

另外,只想指出我的应用程序将管理数千个节点。:)

你推荐什么免费图书馆?您能否构建一个如何与 Virtual Treeview 一起使用的最小演示?

0 投票
1 回答
1062 浏览

delphi - 单独的数据结构与 VirtualStringTree 的 PVirtualNodes 来存储数据?

所以我一直在搞乱创建自己的单独数据结构。我终于让它工作了,但后来我发现与旧方法相比,内存使用率高得离谱。

为了测试这一点,我创建了相同的测试应用程序,但我会将数据存储在我的 PVirtualNodes 中。

添加 1000 个根,每个根有 1000 个子节点时,单独的数据结构使用大约 208 MB,而 PVirtualNode 仅使用大约 160 MB,而且速度也快了一点。

我认为使用单独的数据结构应该使用更少的内存,并且速度更快,但我想这就是价格吗?

这是“在 PVirtualNode 中存储数据”的来源:http: //pastebin.com/j6L2eHJt

这是“将数据存储在单独的数据结构中”的来源: http ://pastebin.com/iSwR0hW1