Since Delphi cannot handle attributes for enum values, I tried a different approach. TMyEnum is my listing. The TMyEnumLabelProvider class provides the shortcuts I need. I associate an enum type with an attribute with its labelprovider. However, this does not compile. I cannot fully define the provider before referring to its class type, as it uses TMyEnum in one of its methods.
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;
Any ideas on how to do this properly. At the moment, I am declaring GetLabel (MyEnum: integer) in a workaround, but obviously I prefer to be strict.
Thanks in advance.
source share