2012-04-02 4 views
6

Siccome Delphi non può gestire gli attributi sui valori enum, ho provato un altro approccio. TMyEnum è il mio enum. Classe TMyEnumLabelProvider fornisce le etichette di cui ho bisogno. Collego il tipo enum con un attributo al suo labelprovider. Questo non si compila comunque. Non riesco a definire il provider completamente prima di fare riferimento al suo tipo di classe poiché utilizza TMyEnum in uno dei suoi metodi.Uso del riferimento di tipo di classe specifico in Delphi attributo-costruttore

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; 

Qualsiasi idea su come farlo correttamente. Per ora ho risolto il problema dichiarando GetLabel (MyEnum: integer), ma ovviamente preferisco essere di tipo strict.

Grazie in anticipo.

+0

Ripensandoci, ho potuto risolvere questo problema utilizzando un helper di classe. Non proprio elegante ma migliore dell'uso di: 'TMyEnumLabelProvider = class (TEnumLabelProvider) public procedure Iterate (Context: TObject; Callback: TEnumLabelProviderCallback); oltrepassare; fine; [TEnumLabelProvider (TMyEnumLabelProvider)] TMyEnum = (MyEnum0, MyEnum1, MyEnum2); TMyEnumLabelProviderHelper = helper di classe per TMyEnumLabelProvider public function class GetLabel (MyEnum: TMyEnum): string; fine; ' –

+1

Scusami, ma non sono in grado di scoprire cosa stai cercando di realizzare. Ad esempio: cosa intendi con "etichette enum"? –

+0

@UweRaabe Penso che intenda le stringhe allegate agli elementi enum visualizzati nell'interfaccia utente. Pensa ad un quadro vincolante, per esempio. – jpfollenius

risposta

2

La soluzione più semplice consiste nell'utilizzare una matrice statica di stringa per memorizzare le etichette come definito di seguito. puoi quindi semplicemente indicizzare l'array usando l'enum per ottenere l'etichetta richiesta.

type 
    TMyEnum = (MyEnum0, MyEnum1, MyEnum2); 

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