我有一个自定义控件。它有一个类型为
TOwnedCollection
的已发布属性,当然它包含 TCollectionItem
的多个实例(继承到我自己的实现)。我们称它们为 TMyComponent
、TMyCollection
和 TMyCollectionItem
。
在
TMyCollectionItem
中,我有一个 TPersistent
属性(我们称之为 MyProp: TMyProp
),它还安装了一个相应的设计时编辑器到 IDE 中。所有这些都工作正常,因此当您编辑集合时,选择一个集合项,您可以单击对象检查器中的小按钮来调用属性编辑器。所有这些都很好用。
我想添加的是双击集合编辑器中的项目也可以调用相同的属性编辑器的功能。但是,我找不到如何执行此操作的适当信息。 ChatGPT 给我的代码根本无法编译,可能是因为它适用于更旧版本的 Delphi。
如何实现双击
TMyCollectionItem
来调用 TMyCollectionItem.MyProp
的属性编辑器的功能?
注意:查看
ColnEdit.pas
的来源(对于这个集合编辑器),我看到 TListView
实现了 OnClick
,但不是 OnDblClick
,所以我怀疑是否可以做我想做的事情没有推出我自己的收藏编辑器。
IDE 的默认集合编辑器本身并不支持您正在寻找的功能。正如您所指出的:
注意:查看
的来源(对于这个集合编辑器),我看到ColnEdit.pas
实现了TListView
,但不是OnClick
,所以我怀疑是否可以做我想做的事情没有推出我自己的收藏编辑器。OnDblClick
双击 ListView 项时,默认的集合编辑器不会实现任何逻辑。
(顺便说一句,更新对象检查器的不是
TListVew.OnClick
事件,而是 TListVew.OnChange
事件。这是在选择 ListView 项目时触发的事件。)
但是,话虽这么说,OpenTools 插件可以访问和操作 IDE 的 UI 控件,因此您可能能够利用 OpenTools API 来监视 IDE 的窗口,以了解默认集合编辑器何时打开(不要问我怎么知道,我没有这些详细信息),然后手动访问它的
TListView
并为其分配您自己的 OnDblClick
事件处理程序。
如果您能够以某种方式检测到对集合项的双击,那么您可以使用
TMyCollectionItem.MyProp
函数调用
DesignEditors.GetComponentProperties()
属性的编辑器。使用 DesignIntf.CreateSelectionList()
创建一个列表,并将所需的 Add()
对象传递给它,然后将该列表传递给 TMyCollectionItem
,以及一个回调,该回调将为每个 GetComponentProperties()
接收一个
IPropertyEditor
的性质。当回调看到您的
CollectionItem
编辑器时,您可以调用其 MyProp
方法来调用您的编辑器。例如:
Edit()
棘手的部分是从活动属性/组件编辑器外部访问
uses
..., DesignIntf, DesignEditors, TypInfo;
...
procedure TMyEditor.ListViewDblClick(Sender: TObject);
var
ListView: TListView;
Item: TListItem;
Component: TMyComponent;
Components: IDesignerSelections;
begin
ListView := Sender as TListView;
Item := ListView.Selected;
if Item = nil then Exit;
Component := ...; // reference to the TMyComponent being edited...
Components := CreateSelectionList();
Components.Add(Component.MyCollection.Items[Item.Index]);
GetComponentProperties(Components, [tkClass], Designer, InvokeMyPropEditor);
end;
procedure TMyEditor.InvokeMyPropEditor(const Prop: IProperty);
begin
if Prop.GetPropType = typeinfo(TMyProp) then
Prop.Edit;
end;
和
TMyComponent
对象。因此,您可能最好简单地制作自己的集合/组件编辑器来完成您想要的任务。