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ę.
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; ' –
Przepraszam, ale nie jestem w stanie dowiedzieć się, co próbujesz osiągnąć. Na przykład: co masz na myśli przez "etykiety enum"? –
@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