2012-04-02 6 views
6

Da Delphi nicht mit Attributen auf Enum-Werte umgehen kann, habe ich einen anderen Ansatz versucht. TMyEnum ist mein enum. Klasse TMyEnumLabelProvider bietet die Etiketten, die ich brauche. Ich verknüpfe den Enum-Typ mit einem Attribut zu seinem Labelprovider. Dies kompiliert jedoch nicht. Ich kann den Provider nicht vollständig definieren, bevor ich auf seinen Classtyp referenziere, da er TMyEnum in einer seiner Methoden verwendet.Verwenden der spezifischen Klassen-Typ-Referenz in Delphi Attribut-Konstruktor

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; 

Irgendwelche Ideen, wie man das richtig macht. Für den Moment erarbeite ich, indem ich GetLabel (MyEnum: integer) deklariere, aber offensichtlich bevorzuge ich Typ-strict.

Vielen Dank im Voraus.

+0

Auf den zweiten Gedanken könnte ich dieses Problem mit einem Klassenhelfer lösen. Nicht wirklich elegant, aber besser als mit Int: 'TMyEnumLabelProvider = Klasse (TEnumLabelProvider) öffentliche Prozedur Iterate (Kontext: TObject; Callback: TEnumLabelProviderCallback); überschreiben; Ende; [TEnumLabelProvider (TMyEnumLabelProvider)] TMyEnum = (MyEnum0, MyEnum1, MyEnum2); TMyEnumLabelProviderHelper = Klassenhelfer für TMyEnumLabelProvider public Klassenfunktion GetLabel (MyEnum: TMyEnum): string; Ende; ' –

+1

Entschuldigung, aber ich bin nicht in der Lage, herauszufinden, was Sie erreichen möchten. Zum Beispiel: Was meinst du mit "Enum Labels"? –

+0

@UweRaabe Ich denke, er meint die Strings, die an enum-Elemente angehängt sind, die in der Benutzeroberfläche angezeigt werden. Denken Sie zum Beispiel an einen verbindlichen Rahmen. – jpfollenius

Antwort

2

Die einfachste Lösung besteht darin, ein statisches Array von Zeichenfolgen zu verwenden, um die Etiketten wie unten definiert zu speichern. Sie können das Array dann einfach mit der Enumeration indizieren, um die erforderliche Beschriftung zu erhalten.

type 
    TMyEnum = (MyEnum0, MyEnum1, MyEnum2); 

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