Como Delphi no puede manejar los atributos en enum-values, probé con otro enfoque. TMyEnum es mi enum. La clase TMyEnumLabelProvider proporciona las etiquetas que necesito. Enlazo el tipo enum con un atributo a su proveedor de etiquetas. Esto no compila sin embargo. No puedo definir completamente el proveedor antes de hacer referencia a su tipo de clase dado que usa TMyEnum en uno de sus métodos.Usando una referencia de tipo de clase específica en el atributo-constructor Delphi
TEnumLabelProviderCallback = procedure(Context: TObject;
Index: integer;
const Name: string) of object;
TEnumLabelProvider = class abstract
public
procedure Iterate(Context: TObject;
Callback: TEnumLabelProviderCallback); virtual; abstract;
end;
TEnumLabelProviderClass = class of TEnumLabelProvider;
TEnumLabelProviderAttribute = class(TCustomAttribute)
private
FProviderClass: TEnumLabelProviderClass;
public
constructor Create(ProviderClass: TEnumLabelProviderClass);
property ProviderClass: TEnumLabelProviderClass read FProviderClass;
end;
TMyEnumLabelProvider = class;
{$SCOPEDENUMS ON}
[TEnumLabelProvider(TMyEnumLabelProvider)]
TMyEnum = (MyEnum0,
MyEnum1,
MyEnum2);
{$SCOPEDENUMS OFF}
// This is where the compilation fails.....
TMyEnumLabelProvider = class(TEnumLabelProvider)
public
class function GetLabel(MyEnum: TMyEnum): string;
procedure Iterate(Context: TObject; Callback: TEnumLabelProviderCallback); override;
end;
Cualquier idea sobre cómo hacer esto correctamente. Por ahora, estoy trabajando en la solución al declarar GetLabel (MyEnum: integer), pero obviamente prefiero ser tipo strict.
Gracias de antemano.
Pensándolo bien, pude resolver este problema utilizando un ayudante de clase. No es realmente elegante, pero es mejor que usar int: 'TMyEnumLabelProvider = clase (TEnumLabelProvider) public procedimiento Iterar (Contexto: TObject; Devolución de llamada: TEnumLabelProviderCallback); anular; final; [TEnumLabelProvider (TMyEnumLabelProvider)] TMyEnum = (MyEnum0, MyEnum1, MyEnum2); TMyEnumLabelProviderHelper = clase auxiliar para TMyEnumLabelProvider public clase function GetLabel (MyEnum: TMyEnum): cadena; final; ' –
Disculpe, pero no puedo descubrir lo que está tratando de lograr. Por ejemplo: ¿qué quiere decir con "etiquetas enum"? –
@UweRaabe Creo que se refiere a las cadenas asociadas a los elementos enumerados que se muestran en la interfaz de usuario. Piense en un marco vinculante, por ejemplo. – jpfollenius