问题标签 [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 投票
4 回答
1010 浏览

delphi - 将数据写入 PVirtualNode,无需手动设置每个字段值

假设我有这个节点数据记录:

要填充我的 VirtualStringTree,我会这样做:

现在,虽然这工作得很好,但我想简化它,所以每当我向记录添加新字段时,我都不会修改 AddToTree 方法。

所以我尝试了这个:

这可以编译,似乎PVirtualNode没有获取数据,因为我的 VT 没有显示任何内容,并且在中断 OnGetText 事件时,我看到变量为空。

我究竟做错了什么?:)

0 投票
2 回答
2803 浏览

delphi - VirtualStringTree - 多行节点和垂直居中文本

如果 VirtualStringTree 中的节点是多行的(Node.States 中的 vsMultiline),那么我如何才能使该节点中所有列(多行列除外)的文本垂直居中?

我曾尝试使用OnBeforeCellPaint(using TargetCanvas.TextOut()) 但这根本不会绘制文本。默认情况下,多行节点的文本始终绘制在节点的顶部。

(对于非多行节点,文本垂直居中绘制)。

0 投票
2 回答
2994 浏览

delphi - 如何隐藏 TVirtualStringTree 节点?

如果我没记错的话,TVirtualStringTree 树视图中不可能有不可见的节点,因为没有启用、可见或其他属性可以这样做。我是对的吗?

如果是,我是如何设法拥有一个不可见的节点的?

我的树的结构:

  • 一个节点
  • 另一个节点
    • 子节点 1
    • 子节点 2
    • ...
    • 子节点 15
    • 子节点 16(不可见!)
  • 又一个节点
    • 来自另一个节点的子节点1
    • 来自另一个节点的子节点2

当我在整个树上执行 FirstNode/GetNextNode 循环并让我打印出第一列的文本时,我可以找到子节点 16。我还可以检查节点并查看他有一个前一个兄弟但没有下一个兄弟,例如节点高度为 18。

那么我是怎么做到的呢?

0 投票
1 回答
1474 浏览

delphi - 在虚拟树视图 (TVirtualStringTree) 中为每个项目组制作带有标题栏的主从视图

我试图从 TVirtualStringTree 中得到一个看起来像这样的结果:

所需的虚拟树视图外观

我相信可以直接使用TVirtualStringTree(Mike Lischke 的主 Virtual Treeview 控件),或者通过子类化并修改继承的控件,或者转到TVirtualDrawTree.

这是我能得到的,并显示了我面临的问题:

实际的虚拟树视图外观

我遇到的问题是我似乎无法让第 0 列的文本占据虚拟树视图控件的整个水平区域。高级演示中有一个虚拟树视图演示,显示多行文本似乎可以满足我的需要,但我无法弄清楚如何将它与我需要的标题行下方的详细信息列结合使用(显示为节点,节点,图中的节点)。

这是我尝试过的:

  • 在 BeforeCellPaint 事件中修改 ContentRect.Right:
  • 设置toGridExtensionsTreeOptions.MiscOptions.

这是一个代码示例,显示了我如何尝试更改 contentRect:

更新:

使用下面接受的答案,我得到以下信息:

在此处输入图像描述

0 投票
2 回答
1119 浏览

delphi - 如何保存和加载我的 svTree 数据结构?

我正在尝试使用 VirtualStringTree 组件实现一个简单的联系人管理器。我将它设置为看起来像一个列表视图组件,只有三列都包含文本:

布局

对于数据结构,我使用的是 Linas 的 svTree,在另一个 Stack Overflow 问题中提到过。

我已经宣布了这样的记录:

在表单的 OnCreate 我有这个:

我正在添加来自 TEdits 的数据,如下所示:

如何将其保存到要加载的流或文件中?我试过使用MyTree.SaveToFile('C:/Test.dat')and MyTree.LoadFromFile('C:/Test.dat'),但是当它加载回来时,树视图不包含数据,只有一个空白行。

0 投票
4 回答
5577 浏览

delphi - VirtualTreeView 的 Firemonkey 版本

有谁知道是否有流行的VirtualTreeView的 Firemonkey 版本正在准备中?另外,是否有人收集了一些将自定义控件移植到 Firemonkey 的经验,并且可以估计将虚拟树视图移植到 Firemonkey 需要多少工作?我们需要这个控件,如果我们可以让这个控件工作,切换到 Firemonkey 只是一种选择。

谢谢!

0 投票
1 回答
438 浏览

delphi - 如何不将重复项添加到 TVirtualStringTree?

我有两个 VirtualStringTree,第一个 VST 已经填充了数据,我想检查第二个 VST 并添加第一个 VST 中还没有的节点。或者我想从第二个 VST 添加那些不与第一个 VST 重复的节点。

我正在使用 D7。

0 投票
1 回答
1349 浏览

delphi - 如何使 VirtualStringTree 滚动条可见?

我在 form1 上放置了一个 VirtualStringTree(VST1) 并在其中添加了一些数据。无论节点数量如何,垂直滚动条都是可见的,并且我没有对节点高度的默认属性做任何事情。然后我将 VST1 复制到 form2 并将其命名为 VST2 并且 VST2 的滚动条不再可见。我改变了VST2的parent控件和align属性(我测试了很多次,不记得改变align和它的父属性的顺序),我不知道滚动条最后是如何显示的。然后我将 VST2 复制到 form3 并将其命名为 VST3。现在,无论我如何测试,当 VST3 中的数据超出其窗口视图时,它的垂直滚动条都无法看到。

VST的属性太多,应该设置哪些属性?

编辑:

[编辑]:

先谢谢了。

我仔细测试发现,如果我多次调用同一个函数,从第二次开始,就会出现那个virticalscrollbar。就像是:

我第一次点击button1,没有出现verticalscrollbar;如果是第二次或更多次,则显示完美。

为什么?,如何解决?

谢谢

0 投票
2 回答
3346 浏览

performance - VirtualStringTree 正确/推荐使用

我已经使用 virtualstringtree 一段时间了。我将它用于两件不同的事情,首先作为用于选择、显示数据的普通树,其次作为显示 SQL 语句输出的网格。

我加载到树中的所有数据都来自数据库。对于树示例,我有一个 parentId 字段来区分层次结构,对于网格示例,我只需使用 SQL 语句为每棵树(这是唯一的)定制记录。

我的问题与填充树的首选/最佳方式有关。我从 VST 文档中读到,您应该将 onInitNode 事件与 rootnodecount 一起使用。但是我发现使用 AddChild() 方法非常相似,即使不鼓励这样做。

让我展示一些(简化的)示例:

1. 层次结构

2.网格

所以基本上我绕过了 RootNodeCount 和 OnInitNode 方法/属性,并使用老式的方法将节点添加到树中。它似乎工作正常。请注意,在示例中,我在运行时创建和销毁我的查询。

我开始以这种方式使用树的原因是我可以一次加载树中的所有数据,然后在我完成使用后释放 TQuery。我在想,不管 TQuery 保持活动/创建,我仍然需要使用我的 rData 记录来存储数据,因此如果我不销毁 TQuery 会占用更多内存。目前,我的应用程序在完全加载时使用大约 250+MB,并且当我运行 SQL 报告并将它们显示在 VST 中时会增加。当我运行包含 20000 多个节点和 50 多列的 SQL 报告时,我已经看到它使用了大约 1GB 的内存。我想知道我使用 VST 的方式在最小化内存使用方面是否不正确?

我会更好地为树的生命周期创建一个查询并使用 onInitNode 事件吗?这样当树请求数据时,它会使用 onInitNode/OnInitChildren 事件(即树的纯虚拟范例)从 TQuery 中获取数据?因此,我需要在表单期间保持 TQuery 处于活动状态。以这种方式使用它会有任何内存优势/性能优势吗?

在上述情况下,我可以看到网格示例的差异将远远小于(如果有的话)层次结构 - 因为所有节点在填充时都需要初始化。

0 投票
2 回答
523 浏览

delphi - 使用 1 个数据副本同步多个 VirtualStringTree

我有一个显示在 VirtualStringTree 中的数据层次结构。我在我的应用程序中多次使用此层次结构,并对树的绘制/显示方式稍作修改。我的方法目前使用 AddChild() 过程来添加节点,因此当应用程序运行时我有多个数据副本。

我现在想合并这些树并拥有一个指向实际数据的“主”树,然后让“从”树指向相同的数据。

我有点不确定是否/如何实现这一点。我想我可以简单地加载主树并用指向我保存数据的位置的指针填充它的 NodeData,然后对于所有从树,只需将相同的指针存储在它们的节点数据中。

但是我运气不好。

我当前的代码如下所示:

将主树复制到从树的过程

从树获取CellText的过程

目前,节点已添加到正确的层次结构中,但是从属树没有出现任何文本。任何帮助,将不胜感激。