如何覆盖Delphi DevExpress Cx组件资源字符串常量实现本地化?
问题描述
我正在使用适用于Delphi 2009的DevExpress ExpressEditors Library 6.45中的TcxDBImage组件,该组件自带包含“Load”“Save”等选项的弹出菜单。我正在开发非英文语言的应用,希望修改这些菜单项的标题。
查看DevExpress的Delphi代码后发现,菜单项标题通过RefreshCaptions方法调用cxGetResourceString加载对应的资源字符串,相关常量及默认值定义在dcr文件中。我想知道在自己的Delphi项目代码中如何覆盖这些常量?是否需要重新定义资源字符串,或是创建包含字符串表的*.res文件?我检查了项目和DevExpress组件的res文件,仅包含图标和版本信息,无字符串表。
我了解官方的本地化文档,但没有Localizer编辑器,且不确定新版文档是否适用于当前旧版本组件。
解决方案
针对DevExpress ExpressEditors 6.45这个旧版本,你可以通过以下两种方式覆盖资源字符串:
方法一:直接重定义资源字符串常量
由于cxGetResourceString从全局资源字符串池读取内容,你可以在项目的初始化部分重新定义对应常量,覆盖默认值:
- 先找到DevExpress源码中对应菜单项的资源字符串常量名,比如
cxSImageLoad(对应Load)、cxSImageSave(对应Save)这类,具体可通过搜索RefreshCaptions方法里的cxGetResourceString调用找到。 - 在项目任意单元(比如主窗体单元)的
initialization块中重新赋值:
{$J+} // 开启常量可写模式,Delphi默认常量只读 initialization cxSImageLoad := '加载'; // 替换为你的目标语言文本 cxSImageSave := '保存'; // 其他需要修改的菜单项常量同理 {$J-}
注:需确保这些常量在单元中可见,必要时引用对应的DevExpress单元。
方法二:创建自定义资源文件替换
若不想修改代码,可创建包含字符串表的.res文件,让Delphi优先加载你的资源:
- 新建
.rc资源脚本文件,内容示例:
STRINGTABLE BEGIN 1000, "加载" // 对应cxSImageLoad的资源ID,需从源码中查找对应ID值 1001, "保存" // 对应cxSImageSave的资源ID END
- 使用Delphi自带的
brcc32.exe工具编译.rc为.res:
brcc32 yourstrings.rc
- 将生成的
.res文件添加到项目中,调整项目文件里{$R}指令的顺序,确保自定义.res在DevExpress组件的.res之前加载。
注意事项
- 6.45属于旧版本,官方Localizer工具大概率不兼容,上述两种方法是更直接的替代方案。
- 查找资源字符串的常量名或ID时,直接查看
TcxDBImage所在单元(如cxDBImage.pas)的源码,搜索RefreshCaptions方法即可定位目标常量。
内容的提问来源于stack exchange,提问作者TomR
相关产品推荐
相关产品推荐

