Delphi 在IDE的属性编辑器中链接时限制组件列表
我创建了一个新的designtime组件,其中包含类型为Delphi 在IDE的属性编辑器中链接时限制组件列表,delphi,custom-component,delphi-xe7,Delphi,Custom Component,Delphi Xe7,我创建了一个新的designtime组件,其中包含类型为TComponent的已发布属性Handler,并将其注册到工具选项板中 当我在表单上放置这种类型的组件时,IDE的属性编辑器会显示属性“Handler”,并带有一个下拉框,允许我在设计时设置此属性。dropbox显示当前表单上所有可用的tComponent 如何将此处显示的组件列表(设计时)限制为特定类型或具有特定属性的组件?i、 e.实现特定(一组)接口的组件 我知道你也可以使用接口属性,但也遇到了一些在互联网上的帖子,说这是非常不稳定
TComponent
的已发布属性Handler
,并将其注册到工具选项板中
当我在表单上放置这种类型的组件时,IDE的属性编辑器会显示属性“Handler”,并带有一个下拉框,允许我在设计时设置此属性。dropbox显示当前表单上所有可用的tComponent
如何将此处显示的组件列表(设计时)限制为特定类型或具有特定属性的组件?i、 e.实现特定(一组)接口的组件
我知道你也可以使用接口属性,但也遇到了一些在互联网上的帖子,说这是非常不稳定的,并提出了各种各样的问题
是否有一种方法可以为每个建议的组件调用,从而确定它们是否应在设计时出现在列表中
在@David:现在,我已经了解到TComponentProperty是我正在寻找的,我在这里也发现了一个相关的问题:正如@TLama已经指出的,您需要更改处理程序字段/属性的tpe 现在,如果您希望能够将特定类型的组件分配给此字段/属性,请将此字段类型设置为该组件的相同类型
但是,如果您希望能够分配几个不同的组件类型,但不是所有组件,请确保处理程序字段/属性类型是您希望能够分配给处理程序字段/属性的所需组件的第一个公共祖先类/组件的类型。正如@TLama已经指出的,您需要更改处理程序字段/属性的tpe 现在,如果您希望能够将特定类型的组件分配给此字段/属性,请将此字段类型设置为该组件的相同类型
但是,如果您希望能够分配几个不同的组件类型,但不是所有组件,请确保处理程序字段/属性类型是您希望能够分配给处理程序字段/属性的所需组件的第一个公共祖先类/组件的类型。正如@TLama已经指出的,您需要更改处理程序字段/属性的tpe 现在,如果您希望能够将特定类型的组件分配给此字段/属性,请将此字段类型设置为该组件的相同类型
但是,如果您希望能够分配几个不同的组件类型,但不是所有组件,请确保处理程序字段/属性类型是您希望能够分配给处理程序字段/属性的所需组件的第一个公共祖先类/组件的类型。正如@TLama已经指出的,您需要更改处理程序字段/属性的tpe 现在,如果您希望能够将特定类型的组件分配给此字段/属性,请将此字段类型设置为该组件的相同类型 但是,如果您希望能够分配几个不同的组件类型,但不是所有组件,请确保处理程序字段/属性类型是您希望能够分配给处理程序字段/属性的所需组件的第一个公共祖先类/组件的类型
TComponentProperty
的子类GetValues
方法以应用过滤器TComponentProperty
注册为您的属性的属性编辑器unit uComponent;
interface
uses
System.Classes;
type
TMyComponent = class(TComponent)
private
FRef: TComponent;
published
property Ref: TComponent read FRef write FRef;
end;
implementation
end.
注册
unit uRegister;
interface
uses
System.SysUtils, System.Classes, DesignIntf, DesignEditors, uComponent;
procedure Register;
implementation
type
TRefEditor = class(TComponentProperty)
private
FGetValuesProc: TGetStrProc;
procedure FilteredGetValuesProc(const S: string);
public
procedure GetValues(Proc: TGetStrProc); override;
end;
procedure TRefEditor.FilteredGetValuesProc(const S: string);
begin
if S.StartsWith('A') then
FGetValuesProc(S);
end;
procedure TRefEditor.GetValues(Proc: TGetStrProc);
begin
FGetValuesProc := Proc;
try
inherited GetValues(FilteredGetValuesProc);
finally
FGetValuesProc := nil;
end;
end;
procedure Register;
begin
RegisterComponents('Test', [TMyComponent]);
RegisterPropertyEditor(TypeInfo(TComponent), nil, 'Ref', TRefEditor);
end;
end.
这个相当无用的属性编辑器只提供名称以A
开头的组件。尽管它完全缺乏实用性,但这确实说明了你所希望的过滤能力。您可能需要调用Designer.GetComponent(…)
传递组件名称以获取组件实例,并根据该组件实例的类型和状态实现过滤
TComponentProperty
的子类GetValues
方法以应用过滤器TComponentProperty
注册为您的属性的属性编辑器unit uComponent;
interface
uses
System.Classes;
type
TMyComponent = class(TComponent)
private
FRef: TComponent;
published
property Ref: TComponent read FRef write FRef;
end;
implementation
end.
注册
unit uRegister;
interface
uses
System.SysUtils, System.Classes, DesignIntf, DesignEditors, uComponent;
procedure Register;
implementation
type
TRefEditor = class(TComponentProperty)
private
FGetValuesProc: TGetStrProc;
procedure FilteredGetValuesProc(const S: string);
public
procedure GetValues(Proc: TGetStrProc); override;
end;
procedure TRefEditor.FilteredGetValuesProc(const S: string);
begin
if S.StartsWith('A') then
FGetValuesProc(S);
end;
procedure TRefEditor.GetValues(Proc: TGetStrProc);
begin
FGetValuesProc := Proc;
try
inherited GetValues(FilteredGetValuesProc);
finally
FGetValuesProc := nil;
end;
end;
procedure Register;
begin
RegisterComponents('Test', [TMyComponent]);
RegisterPropertyEditor(TypeInfo(TComponent), nil, 'Ref', TRefEditor);
end;
end.
这个相当无用的属性编辑器只提供名称以A
开头的组件。尽管它完全缺乏实用性,但这确实说明了你所希望的过滤能力。您可能需要调用Designer.GetComponent(…)
传递组件名称以获取组件实例,并根据该组件实例的类型和状态实现过滤
TComponentProperty
的子类GetValues
方法以应用过滤器TComponentProperty
注册为您的属性的属性编辑器unit uComponent;
interface
uses
System.Classes;
type
TMyComponent = class(TComponent)
private
FRef: TComponent;
published
property Ref: TComponent read FRef write FRef;
end;
implementation
end.
注册
unit uRegister;
interface
uses
System.SysUtils, System.Classes, DesignIntf, DesignEditors, uComponent;
procedure Register;
implementation
type
TRefEditor = class(TComponentProperty)
private
FGetValuesProc: TGetStrProc;
procedure FilteredGetValuesProc(const S: string);
public
procedure GetValues(Proc: TGetStrProc); override;
end;
procedure TRefEditor.FilteredGetValuesProc(const S: string);
begin
if S.StartsWith('A') then
FGetValuesProc(S);
end;
procedure TRefEditor.GetValues(Proc: TGetStrProc);
begin
FGetValuesProc := Proc;
try
inherited GetValues(FilteredGetValuesProc);
finally
FGetValuesProc := nil;
end;
end;
procedure Register;
begin
RegisterComponents('Test', [TMyComponent]);
RegisterPropertyEditor(TypeInfo(TComponent), nil, 'Ref', TRefEditor);
end;
end.
这个相当无用的属性编辑器只提供名称以A
开头的组件。尽管它完全缺乏实用性,但这确实说明了你所希望的过滤能力。您可能需要调用Designer.GetComponent(…)
传递组件名称以获取组件实例,并根据该组件实例的类型和状态实现过滤
TComponentProperty
的子类GetValues
方法以应用过滤器TComponentProperty
注册为您的属性的属性编辑器unit uComponent;
interface
uses
System.Classes;
type
TMyComponent = class(TComponent)
private
FRef: TComponent;
published
property Ref: TComponent read FRef write FRef;
end;
implementation
end.
Re