由于Delphi无法处理枚举值的属性,我尝试了另一种方法.TMyEnum是我的枚举.TMyEnumLabelProvider类提供了我需要的标签.我将enum-type与属性链接到labelprovider.但是这不能编译.在引用其classtype之前,我无法完全定义提供程序,因为它在其中一个方法中使用了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;
Run Code Online (Sandbox Code Playgroud)
关于如何正确地做这件事的任何想法.现在我通过声明GetLabel(MyEnum:integer)来解决问题,但显然我更喜欢类型严格.
提前致谢.
最简单的解决方案是使用静态字符串数组来存储标签,如下定义。然后,您可以简单地使用枚举索引数组来获取所需的标签。
type
TMyEnum = (MyEnum0, MyEnum1, MyEnum2);
const
EnumLabels : array[TMyEnum] of string = ('MyEnumLabel0', 'MyEnumLabel1', 'MyEnumLabel2');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
726 次 |
| 最近记录: |