由于Pascal和C++的本质区别,在Delphi里面强大的RTTI功能,BCB中就被相对弱化了很多。
不过即便如此,BCB仍然可以享受TObject带来的好处,
虽然我们不能够直接使用在delphi下十分方便的GetEnumName。
我们还是不需要为每个枚举类型实现一个静态的String列表。
考虑一下如下的宏实现,为了享受TObject的好处,我们需要从它继承一个VCL子类,
并且为这个类声明一个属性,使得我们可以使用GetPropInfo来取得ENUM类型信息。
#include <TYPINFO.HPP>
#define Marco_PrepareEnumerateName(ENUM) /
class ___TEnumObject___ : TObject /
{ /
ENUM _se; /
__published: /
__property ENUM Prop ={read=_se}; /
}; /
AnsiString GetEnumName(const ENUM& value) /
{ /
/
PPropInfo aPropInfo = GetPropInfo(__typeinfo(___TEnumObject___), "Prop"); /
if (aPropInfo) /
{ /
return GetEnumName(*(aPropInfo->PropType), int(value)); /
} /
return ""; /
}
有了这个宏的实现,使得将来取得enum类型的时候,事情变得更加容易。
本来计划使用template技术来实现的,但是__property声明后不允许使用模板参数。所以作罢。
//以下为测试代码
typedef enum {xxx,yyy,zzz,eee,ffff} TSampleEnum;
Marco_PrepareEnumerateName(TSampleEnum)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Caption = GetEnumName(xxx);
}