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.