You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何覆盖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从全局资源字符串池读取内容,你可以在项目的初始化部分重新定义对应常量,覆盖默认值:

  1. 先找到DevExpress源码中对应菜单项的资源字符串常量名,比如cxSImageLoad(对应Load)、cxSImageSave(对应Save)这类,具体可通过搜索RefreshCaptions方法里的cxGetResourceString调用找到。
  2. 在项目任意单元(比如主窗体单元)的initialization块中重新赋值:
{$J+} // 开启常量可写模式,Delphi默认常量只读
initialization
  cxSImageLoad := '加载'; // 替换为你的目标语言文本
  cxSImageSave := '保存';
  // 其他需要修改的菜单项常量同理
{$J-}

注:需确保这些常量在单元中可见,必要时引用对应的DevExpress单元。

方法二:创建自定义资源文件替换

若不想修改代码,可创建包含字符串表的.res文件,让Delphi优先加载你的资源:

  1. 新建.rc资源脚本文件,内容示例:
STRINGTABLE
BEGIN
  1000, "加载"   // 对应cxSImageLoad的资源ID,需从源码中查找对应ID值
  1001, "保存"   // 对应cxSImageSave的资源ID
END
  1. 使用Delphi自带的brcc32.exe工具编译.rc为.res:
brcc32 yourstrings.rc
  1. 将生成的.res文件添加到项目中,调整项目文件里{$R}指令的顺序,确保自定义.res在DevExpress组件的.res之前加载。

注意事项

  • 6.45属于旧版本,官方Localizer工具大概率不兼容,上述两种方法是更直接的替代方案。
  • 查找资源字符串的常量名或ID时,直接查看TcxDBImage所在单元(如cxDBImage.pas)的源码,搜索RefreshCaptions方法即可定位目标常量。

内容的提问来源于stack exchange,提问作者TomR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:32:32