【问题标题】:How to keep editor alive in Virtualtreeview?如何让编辑器在 Virtualtreeview 中保持活力?
【发布时间】:2012-06-02 00:08:39
【问题描述】:

我正在尝试基于 VirtualTreeView 构建一个简单的 2 列网格“属性编辑器”。

(我想模仿在 Delphi 的 IDE 对象检查器上看到的外观和用户体验)


该组件几乎可以工作并且可以处理多个编辑器, 但我遇到了一个烦人的错误:

当我单击一个新节点(新行)时,该节点被选中并出现编辑器,而与我单击的列无关。这是预期的,没问题。

然后,当我单击同一行的第一列时,我希望看到我的编辑器内容得到验证并且编辑器保持焦点(就像在 delphi 的对象检查器中一样)。

但是编辑器内容被验证然后它消失并且整个节点(行)被选中。编辑器不会回来(即使我点击第二列),直到我选择另一个节点并点击之前选择的节点。

编辑:为我的代码添加了插图和精确度。

关于代码: 我没有在此处插入代码,因为我使用(作为起点)与高级演示(属性页面)上的完全相同的代码


我尝试并发现了什么:

2003 年编译的高级演示(属性树页面)found here 似乎与我对组件(和虚拟树视图)的期望一样。

但是当我编译这个相同的演示时(我在谷歌代码的当前主干上尝试了 4.5.2、4.8.7 甚至 5.0.0 版本,在 delphi 2007 和 2009 上),错误再次出现!

我首先认为在 2003 年和更新的版本之间存在记录在案的重大变化, 但我什么也找不到。 我也尝试了所有可用的选项来解决这个问题,但没有成功。

我仍然不知道这个问题是来自新的 delphi RTL 还是 virtualtreeview 中的重大更改(错误?)。

所以我的问题:

  • 您在编译 Advanced demo 时是否遇到同样的问题?
  • 代码中的任何提示或解决方法可以解决我的问题?

顺便说一句,我今天下午几乎放弃了 virtualtreeview,我想尝试使用另一个组件的解决方案...我找到了这个 interesting question 并决定尝试 berg 的组件,但在购买过程中被停止了在他们的主页上阅读建议(请参阅我对相关问题的评论)

【问题讨论】:

  • 您是否有理由不使用 VCL 中提供的 TValueListEditor?它专门设计用于做您自己想做的事情(提供键列表并允许您编辑值,例如对象检查器)。它通过将KeyOptions.KeyEdit 设置为True 来实现您正在寻找的行为。它具有OnGet 事件处理程序,可让您提供列表和编辑掩码,并具有允许... 类型按钮的OnEditButtonClick 事件。
  • @KenWhite 好点,但我能看到的唯一原因是我注意到左侧的 [-] 按钮,因此 Damien 可能具有折叠功能,而 TValueListEditor 可能没有。
  • 是的,我需要折叠功能(例如在 IDE 的属性编辑器中)。好吧,我设法接近想要的行为,在许多事件(onDblclick 等)中添加 WM_STARTEDITING 消息,但我仍然认为 virtualtreeview 中可能有一些问题(我开始查看控件的内部,似乎 tsEditPending internal状态处理不当)

标签: delphi delphi-2009 delphi-2007 virtualtreeview


【解决方案1】:

VST 的 onChange 只是通过更改节点的选择来调用。如果节点已经被选中,状态将不再改变。因此,您必须自己实现类似于 Object Inspector 的行为,例如通过在 OnClick-Callback 中调用 VSTs EditNode()-Method:

procedure TMainForm.VSTClick(Sender: TObject);
var node: PVirtualNode;
begin
  node:= VST.GetFirstSelected();
  if(node <> nil) then
    VST.EditNode(node, EDITABLE_COLUMN_INDEX);
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2023-01-27
    • 2022-07-28
    • 1970-01-01
    相关资源
    最近更新 更多