在IDE中的属性编辑器中链接时限制组件列表

时间:2015-02-11 12:41:15

标签: delphi custom-component delphi-xe7

我创建了一个新的设计时组件,其中包含Handler类型的已发布属性TComponent,并将其注册到工具选项板中。

当我在我的表单上放置这种类型的组件时,IDE的属性编辑器会向我显示属性' Handler'使用下拉框,允许我在设计时设置此属性。保管箱显示当前表单上的所有可用TComponents。

如何将此处显示的组件列表(设计时间)限制为某种类型的组件或具有某种属性?即实现某些(一组)接口的组件。

我知道你也可以使用界面属性,但也在互联网上遇到了几个帖子,说这非常不稳定并引发各种各样的问题。

我是否可以为每个建议的组件调用一个方法,我可以确定它们是否应该在设计时出现在列表中?

在@David回答之后添加:
既然我已经知道TComponentProperty正是我想要的,我也在这里找到了一个相关的问题:How to modify TComponentProperty to show only particular items on drop down list?

2 个答案:

答案 0 :(得分:4)

  1. 导出TComponentProperty
  2. 的子类
  3. 覆盖其GetValues方法以应用您的过滤器。
  4. 将此TComponentProperty注册为您的媒体资源的属性编辑器。
  5. 这是一个非常简单的例子:

    <强>组件

    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字段/属性类型是您希望能够的所需组件的第一个共同祖先类/组件的类型分配给处理程序字段/属性。