C++ Builder如何注册TJvDefaultImageIndexProperty属性编辑器
C++ Builder 注册TImageIndex属性可视化编辑器方案
问题背景
存在一个类型为TImageIndex的ImageIndex属性,需要注册TJvDefaultImageIndexProperty属性编辑器,实现在对象检查器中显示可视化图像下拉选择列表。
可参考的Delphi实现代码如下:
RegisterPropertyEditor(TypeInfo(TImageIndex), TMyComponent, 'ImageIndex', TJvDefaultImageIndexProperty);
最初尝试改写为C++ Builder代码时使用了如下写法:
RegisterPropertyEditor(__typeinfo(TImageIndex), __classid(TMyComponent), L"ImageIndex", __classid(TJvDefaultImageIndexProperty));
编译阶段抛出错误:
System::Uitypes::TImageIndex (aka 'int') is not a class, namespace, or enumeration
错误根因
__typeinfo()是C++ Builder提供的宏,展开后等价于(PTypeInfo)TImageIndex::ClassInfo(),仅能用于继承自TObject的类类型获取RTTI信息。而TImageIndex本质是基础类型int的类型别名,不存在ClassInfo()成员方法,因此该写法无法通过编译。
正确实现方法
基础类型、普通枚举、类型别名的RTTI信息需要通过Typinfo.hpp中提供的GetTypeInfo模板函数获取,修正后的注册代码如下:
#include <TypInfo.hpp> #include <JvPropertyEditors.hpp> // 引入JEDI属性编辑器声明头文件 // 以下代码写在组件注册流程的Register函数中 RegisterPropertyEditor( *GetTypeInfo<System::Uitypes::TImageIndex>(), // 替换原__typeinfo调用,获取基础类型的RTTI指针 __classid(TMyComponent), L"ImageIndex", __classid(TJvDefaultImageIndexProperty) );
注意事项
- 编写代码前确认已正确引入JEDI VCL库的头文件搜索路径,避免出现
TJvDefaultImageIndexProperty未声明的编译错误。 TJvDefaultImageIndexProperty默认查找组件上名为Images、类型为TCustomImageList的属性作为图像数据源,如果你的组件中关联图像列表的属性名不是Images,需要自行派生属性编辑器类重写图像列表获取逻辑,否则下拉列表无法正常加载图像项。- 确保组件的
ImageIndex属性声明为__published级别,否则RTTI无法识别该属性,属性编辑器不会生效。
内容的提问来源于stack exchange,提问作者Max Kielland
相关产品推荐
相关产品推荐

