Поскольку Delphi не может обрабатывать атрибуты перечислимых значений, я попробовал другой подход.TMyEnum - это мое перечисление.Класс TMyEnumLabelProvider предоставляет нужные мне метки.Я связываю enum-тип с атрибутом с его labelprovider.Это не компилируется однако.Я не могу полностью определить провайдера, прежде чем ссылаться на его класс, так как он использует TMyEnum в одном из своих методов.
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;
Любые идеи о том, как сделать это правильно.Сейчас я обхожу себя, объявляя GetLabel (MyEnum: integer), но, очевидно, я предпочитаю быть строгим типом.
Заранее спасибо.