2012-04-02 16 views
6

Ponieważ Delphi nie może obsłużyć atrybutów w wartościach wyliczeniowych, spróbowałem innego podejścia. TMyEnum to moje wyliczenie. Klasa TMyEnumLabelProvider zapewnia etykiety, których potrzebuję. Łączę typ wyliczeniowy z atrybutem z jego dostawcą etykiet. To jednak nie kompiluje. Nie mogę zdefiniować dostawcy w pełni przed odniesieniem do jego klasy, ponieważ używa TMyEnum w jednej ze swoich metod.Używanie odwołania do określonego typu klasy w konstruktorze atrybutów 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; 

Wszelkie pomysły, jak to zrobić prawidłowo. Na razie obejść, deklarując GetLabel (MyEnum: integer), ale oczywiście wolę być typu strict.

Z góry dziękuję.

+0

W drugiej chwili mogłem rozwiązać ten problem za pomocą pomocnika klasy. Nie bardzo eleganckie, ale lepsze niż użycie int: 'TMyEnumLabelProvider = klasa (TEnumLabelProvider) publiczna procedura iteracyjna (kontekst: TObject; oddzwonienie: TEnumLabelProviderCallback); nadpisanie; koniec; [TEnumLabelProvider (TMyEnumLabelProvider)] TMyEnum = (MyEnum0, MyEnum1, MyEnum2); TMyEnumLabelProviderHelper = pomocnik klasy dla TMyEnumLabelProvider public funkcja klasy GetLabel (MyEnum: TMyEnum): string; koniec; ' –

+1

Przepraszam, ale nie jestem w stanie dowiedzieć się, co próbujesz osiągnąć. Na przykład: co masz na myśli przez "etykiety enum"? –

+0

@UweRaabe Myślę, że oznacza on ciągi dołączone do elementów wyliczeniowych wyświetlanych w interfejsie użytkownika. Pomyśl o wiążących ramach na przykład. – jpfollenius

Odpowiedz

2

Najprostszym rozwiązaniem jest użycie statycznej tablicy ciągów do przechowywania etykiet zdefiniowanych poniżej. możesz wtedy po prostu zindeksować tablicę za pomocą enum, aby uzyskać wymaganą etykietę.

type 
    TMyEnum = (MyEnum0, MyEnum1, MyEnum2); 

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