Da Delphi nicht mit Attributen auf Enum-Werte umgehen kann, habe ich einen anderen Ansatz versucht. TMyEnum ist mein enum. Klasse TMyEnumLabelProvider bietet die Etiketten, die ich brauche. Ich verknüpfe den Enum-Typ mit einem Attribut zu seinem Labelprovider. Dies kompiliert jedoch nicht. Ich kann den Provider nicht vollständig definieren, bevor ich auf seinen Classtyp referenziere, da er TMyEnum in einer seiner Methoden verwendet.Verwenden der spezifischen Klassen-Typ-Referenz in Delphi Attribut-Konstruktor
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;
Irgendwelche Ideen, wie man das richtig macht. Für den Moment erarbeite ich, indem ich GetLabel (MyEnum: integer) deklariere, aber offensichtlich bevorzuge ich Typ-strict.
Vielen Dank im Voraus.
Auf den zweiten Gedanken könnte ich dieses Problem mit einem Klassenhelfer lösen. Nicht wirklich elegant, aber besser als mit Int: 'TMyEnumLabelProvider = Klasse (TEnumLabelProvider) öffentliche Prozedur Iterate (Kontext: TObject; Callback: TEnumLabelProviderCallback); überschreiben; Ende; [TEnumLabelProvider (TMyEnumLabelProvider)] TMyEnum = (MyEnum0, MyEnum1, MyEnum2); TMyEnumLabelProviderHelper = Klassenhelfer für TMyEnumLabelProvider public Klassenfunktion GetLabel (MyEnum: TMyEnum): string; Ende; ' –
Entschuldigung, aber ich bin nicht in der Lage, herauszufinden, was Sie erreichen möchten. Zum Beispiel: Was meinst du mit "Enum Labels"? –
@UweRaabe Ich denke, er meint die Strings, die an enum-Elemente angehängt sind, die in der Benutzeroberfläche angezeigt werden. Denken Sie zum Beispiel an einen verbindlichen Rahmen. – jpfollenius