Using a special class type reference in a Delphi constructor attribute

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.

+6
source share
1 answer

The simplest solution is to use a static string array to store labels, as defined below. you can simply index the array using an enumeration to get the desired label.

 type TMyEnum = (MyEnum0, MyEnum1, MyEnum2); const EnumLabels : array[TMyEnum] of string = ('MyEnumLabel0', 'MyEnumLabel1', 'MyEnumLabel2'); 
+2
source

Source: https://habr.com/ru/post/912211/


All Articles