我创建了一个新的设计时组件,其中包含Handler
类型的已发布属性TComponent
,并将其注册到工具选项板中。
当我在我的表单上放置这种类型的组件时,IDE的属性编辑器会向我显示属性' Handler'使用下拉框,允许我在设计时设置此属性。保管箱显示当前表单上的所有可用TComponents。
如何将此处显示的组件列表(设计时间)限制为某种类型的组件或具有某种属性?即实现某些(一组)接口的组件。
我知道你也可以使用界面属性,但也在互联网上遇到了几个帖子,说这非常不稳定并引发各种各样的问题。
我是否可以为每个建议的组件调用一个方法,我可以确定它们是否应该在设计时出现在列表中?
在@David回答之后添加:
既然我已经知道TComponentProperty正是我想要的,我也在这里找到了一个相关的问题:How to modify TComponentProperty to show only particular items on drop down list?
答案 0 :(得分:4)
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(...)
传递组件名称以获取组件实例,并根据该组件实例的类型和状态实现过滤。
答案 1 :(得分:-1)
正如@TLama已经指出你需要改变处理程序字段/属性的tpe。
现在,如果您希望能够将特定类型的组件分配给此字段/属性,请将此字段类型设置为该组件的相同类型。
但是,如果您希望能够分配多个不同的组件类型但不是所有组件,请确保Handler字段/属性类型是您希望能够的所需组件的第一个共同祖先类/组件的类型分配给处理程序字段/属性。