2012-04-02 19 views
6

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.

+0

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; ' –

+1

Disculpe, pero no puedo descubrir lo que está tratando de lograr. Por ejemplo: ¿qué quiere decir con "etiquetas enum"? –

+0

@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

Respuesta

2

La solución más simple es utilizar una matriz estática de cadena para almacenar las etiquetas como se define a continuación. luego puede simplemente indexar la matriz usando la enumeración para obtener la etiqueta requerida.

type 
    TMyEnum = (MyEnum0, MyEnum1, MyEnum2); 

const 
    EnumLabels : array[TMyEnum] of string = ('MyEnumLabel0', 'MyEnumLabel1', 'MyEnumLabel2'); 
Cuestiones relacionadas