2012-04-02 103 views
6

由于Delphi无法处理枚举值的属性,我尝试了另一种方法。 TMyEnum是我的枚举。类TMyEnumLabelProvider提供我需要的标签。我将枚举类型的属性链接到它的labelprovider。但是这并不能编译。由于在其方法中使用TMyEnum,因此在引用其类型之前,我无法完全定义提供者。在Delphi属性构造函数中使用特定的类类型引用

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; 

有关如何正确执行此操作的任何想法。现在我通过声明GetLabel(MyEnum:integer)来解决问题,但显然我更喜欢键入strict。

在此先感谢。

+0

一想到我可以通过使用类助手来解决这个问题。不是很优雅,但比使用int更好: 'TMyEnumLabelProvider = class(TEnumLabelProvider) public procedure Iterate(Context:TObject; Callback:TEnumLabelProviderCallback);覆盖; 结束; [TEnumLabelProvider(TMyEnumLabelProvider)] TMyEnum =(MyEnum0, MyEnum1, MyEnum2); (MyEnum:TMyEnum):string; TMyEnumLabelProviderHelper = TMyEnumLabelProvider的类帮助程序 public 类函数GetLabel(MyEnum:TMyEnum):string; 结束;' – 2012-04-02 10:37:17

+1

对不起,但我无法找出你想要完成的。例如:你是什么意思的“枚举标签”? – 2012-04-02 11:15:01

+0

@UweRaabe我认为他意味着附加到显示在用户界面中的枚举元素的字符串。例如,考虑绑定框架。 – jpfollenius 2012-04-02 11:17:47

回答

2

最简单的解决方案是使用静态字符串数组来存储下面定义的标签。那么你可以简单地使用枚举对数组进行索引来获得所需的标签。

type 
    TMyEnum = (MyEnum0, MyEnum1, MyEnum2); 

const 
    EnumLabels : array[TMyEnum] of string = ('MyEnumLabel0', 'MyEnumLabel1', 'MyEnumLabel2'); 
相关问题