我有一个自定义控件。它有一个TOwnedCollection
类型的published属性,其中当然包含几个TCollectionItem
的示例(继承到我自己的实现)。让我们称它们为TMyComponent
,TMyCollection
和TMyCollectionItem
。
在TMyCollectionItem
中,我有一个TPersistent
属性(我们称之为MyProp: TMyProp
),它也有一个安装在IDE中的相应的设计时编辑器。所有这些都很好,所以当你编辑集合时,选择一个集合项,你可以单击对象检查器中的小按钮来调用属性编辑器。所有这些都很好。
我想添加的是在集合编辑器中双击项目以调用相同的属性编辑器的功能。然而,我找不到如何做到这一点的适当信息。ChatGPT给了我无法编译的代码,可能是因为它适用于旧版本的 Delphi 。
如何实现双击TMyCollectionItem
以调用TMyCollectionItem.MyProp
的属性编辑器的功能?
注意事项:查看ColnEdit.pas
(用于此集合编辑器)的源代码,我看到TListView
实现了OnClick
,但没有实现OnDblClick
,因此我怀疑是否有可能在不推出自己的集合编辑器的情况下做我想做的事情。
1条答案
按热度按时间px9o7tmv1#
IDE的 default 集合编辑器本身不支持您要查找的功能。如您所述:
注意事项:查看
ColnEdit.pas
的源代码(对于这个集合编辑器),我看到TListView
实现了OnClick
,但没有实现OnDblClick
,因此我怀疑是否有可能在不推出自己的集合编辑器的情况下做我想做的事情。当双击
TListView
项时,默认的集合编辑器根本不实现任何逻辑。(BTW,更新对象检查器的不是
TListVew.OnClick
事件,而是TListVew.OnChange
事件。这是在选择ListView项目时触发的事件。)然而,一切都没有失去!有一种方法可以访问默认集合编辑器的
TListView
,并为其分配自己的OnDblClick
事件处理程序:ColnEdit.TCollectionEditor
派生一个新类,并让它为继承的TListView
分配一个OnDblClick
处理程序。ColnEdit.TCollectionProperty
派生一个新类并重写其虚GetEditorClass()
方法以返回从TCollectionEditor
派生的类类型。DesignIntf.RegisterPropertyEditor()
注册TCollectionProperty
派生类,以覆盖TMyCollection
类的默认集合编辑器。然后,派生的集合编辑器可以在需要时使用
DesignEditors.GetComponentProperties()
函数调用TMyProp
属性编辑器:DesignIntf.CreateSelectionList()
创建一个列表,并将相应的TMyCollectionItem
对象Add()
添加到列表中。GetComponentProperties()
,同时沿着一个回调,该回调将为TMyCollectionItem
对象的每个属性接收一个IPropertyEditor
。TMyProp
属性编辑器时,它可以调用编辑器的Edit()
方法。举例来说:
字符串
尽管如此,我确实测试了这种方法,虽然它在功能上确实有效,但有一个 * 轻微 * 的视觉副作用-在10.2.1及更高版本中,IDE的主题化功能将不再应用于显示的集合编辑器窗口。因此,例如,如果您在IDE中使用深色主题,集合编辑器将不再显示为深色。
要解决此问题,您需要使用OpenTools API中的
IOTAIDEThemingServices
接口注册TCollectionEditor
派生类,以便IDE将其主题化:Using IDE Styles in Third-Party Plugins的
大卫霍伊尔也写了一篇关于这个主题的文章:
Theming OTA Forms
举例来说:
型
尽管Embarcadero的文件说以下内容(重点是我的):
在插件初始化或表单构造函数中,使用表单的类(即表单类型)调用
IOTAIDEThemingServices.RegisterFormClass
。**您只需要执行一次此操作即可将样式钩子应用到表单。**您不需要注销它。我发现如果在主题更改后
RegisterFormClass()
没有在ApplyStyle()
之前再次调用RegisterFormClass()
,那么ApplyStyle()
不会正确应用新主题!就像IDE在主题更改期间丢失了以前的Form类注册一样(IDE bug?我已经报告了它:RSP-43972)。在每次调用ApplyStyle()
之前调用RegisterFormClass()
都可以工作。我还注意到,默认的
TCollectionEditor
根本不会对IDE主题的更改做出React(绝对是一个IDE bug,我已经报告过了:RSP-43971)。