Criando o Editor de Propriedades TSetProperty Customizado

Estou tentando criar um editor de propriedades personalizadas para algum componente personalizado. O editor de propriedades customizadas pretende editar algumas propriedades definidas, como

type
  TButtonOption = (boOption1, boOption2, boOption3);
  TButtonOptions = set of TButtonOption;

meu editor de propriedades descende da classe TSetProperty. O problema é: meu editor de propriedades personalizadas não é registrado e o Delphi IDE parece usar seu próprio editor de propriedades padrão, porque ShowMessage () chama dentro de métodos de propriedades nunca executados! Eu criei um pacote / componente de amostra a partir do zero, o mais simples possível, mostrando esse problema. Aqui está o código:

unit Button1;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, DesignIntf, DesignEditors;

type
  TButtonOption = (boOption1, boOption2, boOption3);

  TButtonOptions = set of TButtonOption;

  TButtonEx = class(TButton)
  private
    FOptions: TButtonOptions;
    function GetOptions: TButtonOptions;
    procedure SetOptions(Value: TButtonOptions);
  published
    property Options: TButtonOptions read GetOptions write SetOptions default [];
  end;

  TMySetProperty = class(TSetProperty)
  public
    function GetAttributes: TPropertyAttributes; override;
    procedure GetProperties(Proc: TGetPropProc); override;
    function GetValue: string; override;
  end;

procedure Register;

implementation

uses
  Dialogs;

// TButtonEx - sample component

function TButtonEx.GetOptions: TButtonOptions;
begin
  Result := FOptions;
end;

procedure TButtonEx.SetOptions(Value: TButtonOptions);
begin
  if FOptions <> Value then
  begin
    FOptions := Value;
  end;
end;

// register stuff

procedure Register;
begin
  RegisterComponents('Samples', [TButtonEx]);
  RegisterPropertyEditor(TypeInfo(TButtonOptions), nil, '', TMySetProperty);
end;

function TMySetProperty.GetAttributes: TPropertyAttributes;
begin
  ShowMessage('GetAttributes');
  Result := inherited GetAttributes;
end;

procedure TMySetProperty.GetProperties(Proc: TGetPropProc);
begin
  ShowMessage('GetProperties');
  inherited;
end;

function TMySetProperty.GetValue: string;
begin
  ShowMessage('GetValue');
  Result := inherited GetValue;
end;

end.

Observe que:

Estou registrando o novo editor de propriedades (TMySetProperty) para TODOS os componentes com uma propriedade TButtonOptions. Também tentei fazê-lo apenas para o TButtonEx, mas o resultado é o mesmo.Adicionei chamadas ShowMessage () em todos os métodos substituídos do meu editor de propriedades personalizadas e esses métodos NUNCA são chamados.Já depurei o pacote e o RegisterPropertyEditor () é executado. No entanto, meu código personalizado em métodos substituídos nunca é executado.Eu já vi outros componentes de terceiros usando esse editor de propriedades (descendentes do TSetProperty) em execução nos IDEs Delphi mais antigos e não encontrei nenhuma diferença relevante no código. Talvez o Delphi XE2 + exija algo mais?

Portanto, a pergunta é: Por que meu editor de propriedades personalizadas não se registra / funciona?

Nota: Esse problema ocorre no Delphi XE2, XE3, XE4 e também no XE5 pelo menos. Outros IDEs não foram testados, mas provavelmente têm o mesmo comportamento.

questionAnswers(1)

yourAnswerToTheQuestion