Siccome Delphi non può gestire gli attributi sui valori enum, ho provato un altro approccio. TMyEnum è il mio enum. Classe TMyEnumLabelProvider fornisce le etichette di cui ho bisogno. Collego il tipo enum con un attributo al suo labelprovider. Questo non si compila comunque. Non riesco a definire il provider completamente prima di fare riferimento al suo tipo di classe poiché utilizza TMyEnum in uno dei suoi metodi.Uso del riferimento di tipo di classe specifico in Delphi attributo-costruttore
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;
Qualsiasi idea su come farlo correttamente. Per ora ho risolto il problema dichiarando GetLabel (MyEnum: integer), ma ovviamente preferisco essere di tipo strict.
Grazie in anticipo.
Ripensandoci, ho potuto risolvere questo problema utilizzando un helper di classe. Non proprio elegante ma migliore dell'uso di: 'TMyEnumLabelProvider = class (TEnumLabelProvider) public procedure Iterate (Context: TObject; Callback: TEnumLabelProviderCallback); oltrepassare; fine; [TEnumLabelProvider (TMyEnumLabelProvider)] TMyEnum = (MyEnum0, MyEnum1, MyEnum2); TMyEnumLabelProviderHelper = helper di classe per TMyEnumLabelProvider public function class GetLabel (MyEnum: TMyEnum): string; fine; ' –
Scusami, ma non sono in grado di scoprire cosa stai cercando di realizzare. Ad esempio: cosa intendi con "etichette enum"? –
@UweRaabe Penso che intenda le stringhe allegate agli elementi enum visualizzati nell'interfaccia utente. Pensa ad un quadro vincolante, per esempio. – jpfollenius