在Delphi属性构造函数中使用特定类类型引用
由于Delphi无法处理枚举值上的属性,我尝试了另一种方法。TMyEnum是我的枚举。类TMyEnumLabelProvider提供了我需要的标签。我将带有属性的枚举类型链接到其labelprovider。然而,这并不编译。我无法在引用其类类型之前完全定义提供程序,因为它在其中一个方法中使用了TMyEnum在Delphi属性构造函数中使用特定类类型引用,delphi,delphi-xe2,Delphi,Delphi Xe2,由于Delphi无法处理枚举值上的属性,我尝试了另一种方法。TMyEnum是我的枚举。类TMyEnumLabelProvider提供了我需要的标签。我将带有属性的枚举类型链接到其labelprovider。然而,这并不编译。我无法在引用其类类型之前完全定义提供程序,因为它在其中一个方法中使用了TMyEnum TEnumLabelProviderCallback = procedure(Context: TObject;
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)来解决问题,但显然我更喜欢严格的类型
提前感谢。最简单的解决方案是使用静态字符串数组来存储标签,如下所述。然后,您可以简单地使用枚举对数组进行索引,以获得所需的标签
type
TMyEnum = (MyEnum0, MyEnum1, MyEnum2);
const
EnumLabels : array[TMyEnum] of string = ('MyEnumLabel0', 'MyEnumLabel1', 'MyEnumLabel2');
经过再三考虑,我可以通过使用类助手来解决这个问题。不是很优雅,但比使用int:
TMyEnumLabelProvider=class(TEnumLabelProvider)公共过程迭代(Context:TObject;Callback:TEnumLabelProviderCallback)更好;推翻结束;[TEnumLabelProvider(TMyEnumLabelProvider)]TMyEnum=(MyEnum0,MyEnum1,MyEnum2);TMyEnumLabelProviderHelper=TMyEnumLabelProvider公共类函数GetLabel(MyEnum:TMyEnum):字符串的类助手;结束对不起,我无法知道你想要完成什么。例如:“枚举标签”是什么意思?@uwerabe我想他指的是附加到显示在UI中的枚举元素的字符串。以绑定框架为例。@Uwe-Raabe:Smasher非常正确。“这正是我想要实现的。”斯玛瑟,那为什么不使用它呢