Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在IDE的属性编辑器中链接时限制组件列表_Delphi_Custom Component_Delphi Xe7 - Fatal编程技术网

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

Delphi 在IDE的属性编辑器中链接时限制组件列表,delphi,custom-component,delphi-xe7,Delphi,Custom Component,Delphi Xe7,我创建了一个新的designtime组件,其中包含类型为TComponent的已发布属性Handler,并将其注册到工具选项板中 当我在表单上放置这种类型的组件时,IDE的属性编辑器会显示属性“Handler”,并带有一个下拉框,允许我在设计时设置此属性。dropbox显示当前表单上所有可用的tComponent 如何将此处显示的组件列表(设计时)限制为特定类型或具有特定属性的组件?i、 e.实现特定(一组)接口的组件 我知道你也可以使用接口属性,但也遇到了一些在互联网上的帖子,说这是非常不稳定

我创建了一个新的designtime组件,其中包含类型为
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