公司动态
DevExpress VCL 20.2.4与RAD Studio 10.4实战
简介面向 RAD Studio 10.4 的 DevExpress VCL 20.2.4 官方编译版组件包是 2021 年发布的最新版本专供 Delphi/CBuilder 开发者在项目中快速落地成熟商业级 UI 控件满足表格、图表、导航、编辑器等界面开发需求。压缩包为 7z 格式体积约 362.21MB由于该版本不包含任何 DCU 文件构建出的程序在目标机器上运行时必须依赖 BPL 运行时包因此需要将 DevExpress 安装目录下的 RuntimePackages.txt 内容复制到项目运行时包选项中才能消除编译和运行阶段常见的异常。资源中还整理了配置注意事项能够帮助下载者理解链接原理、避开“不工作”的坑点。目前已有 1957 人学习下载适合具备 RAD Studio 基础、想在项目中直接集成官方编译版 DevExpress 控件、同时接受手动配置 BPL 的开发人员。若后续需要扩展源码级定制可参考作者提供的 19.1.2 源码包自行编译。 我一直在用 DevExpress VCL 这套控件说实话看到“DevExpress VCL 20.2.4 for RAD Studio 10.4”这个组合时第一反应不是“又出了一个补丁”而是“总算有个能稳定跑在 10.4 上的版本了”。我在项目里被控件崩溃折磨过太多次所以对版本号里的小版本差异特别敏感。如果你正在给公司维护一套 Delphi 业务系统或者刚把 RAD Studio 从老版本迁到 10.4 Sydney那么这篇东西能帮你省下不少试错时间。我会从版本背后的含义、安装配置、核心组件使用到老项目迁移和常见故障排查全部按我实际踩过的路走一遍。1. 版本定位与核心价值1.1 20.2.4 在版本序列里处于什么位置DevExpress VCL 的版本号规律是这样的20.2 代表 2020 年的第二个大版本发布线后面的 .4 是这条线里的第四个维护版本。大版本之间会加入新控件、新皮肤而小版本基本只做两件事修 Bug 和补兼容性。20.2.4 对 RAD Studio 10.4 来说是一个非常重要的“稳定点”。早期 20.2.0 和 20.2.1 在 Sydney 上跑起来问题不少比如 cxGrid 在编辑状态下偶发内存访问冲突dxLayoutControl 在 DPI 切换时会闪屏。到了 .4 这个版本我在项目里实测下来这些高频问题基本都清理干净了。还有一个容易被忽略的点20.2.4 修复了 IDE 设计期包与运行时包之间的版本一致性校验。什么意思呢就是你打开老的 .pas 或 .dfm 工程时工具箱里的组件带会正确匹配当前安装的包而不会出现“组件已安装但 IDE 却提示找不到类”的灵异事件。对团队协作来说统一到 20.2.4 能减少很多“我这能编译你那不能编译”的扯皮。1.2 为什么它和 RAD Studio 10.4 是天生一对RAD Studio 10.4 Sydney 是 Embarcadero 在 2020 年发布的版本。它的编译器版本是 Delphi Compiler 10.4 和 CBuilder 10.4。DevExpress VCL 20.2.4 这套组件就是在这个编译环境下编译并验证的。你不一定要用最新版 RAD Studio 12 才能跑它但如果你还在用 Delphi 7那就完全不支持了后面我会专门讲老工程怎么处理。从实际兼容性看这个组合适合用来构建桌面数据库应用、进销存系统、医院信息管理系统这类传统 VCL 项目。它和 10.4 的 Windows 10/11 高 DPI 支持配合得不错尤其是在 125%、150% 缩放下控件不会像老版本那样变得模糊。如果你现有的项目还停留在 RAD Studio 10.3 或者更早直接用 20.2.4 会面临一个问题安装包会扫描已安装的 IDE 版本只有 10.4 才会被自动识别老版本得单独指定目录。想清楚这一点后面安装才不会慌。2. 安装与初始配置2.1 安装前必须做的三个准备动作不要一上来就双击 Setup.exe那样很容易浪费半小时。先确认三件事第一RAD Studio 10.4 本体已经完成安装并且至少打上了 Update 1 补丁。DevExpress 安装程序在探测 IDE 版本时如果发现编译器版本号低于预期会直接拒绝安装组件包。第二关闭 IDE 和所有占用了 DevExpress DLL 的进程特别是后台常驻的服务程序。否则 BPL 文件可能被 Windows 文件锁锁定安装后 IDE 里控件不显示。第三检查系统盘的临时目录权限。安装程序会在 %TEMP% 下释放大量临时文件如果你装过需要管理员权限的软件导致临时目录权限异常安装到一半会报“无法创建文件”这时候以管理员身份重跑一次安装程序可解。2.2 安装过程和 IDE 组件面板的激活安装过程本身是向导式的但有一个关键步骤很多人会跳过选择“集成到 RAD Studio 10.4”时会列出当前机器的所有 IDE 实例。如果你同时装了 10.3 和 10.4这里必须手动勾掉 10.3不然安装程序会把旧版本的 bpl 也拷贝到公共目录以后你在 10.4 里编译时会莫名其妙引用到旧包。安装结束后打开 RAD Studio 10.4在主菜单选择 Component Install Packages。在弹出的包列表里你应该能看到所有以 “DevExpress” 开头的设计时包比如 dxDockD20.bpl、dxBarD20.bpl、cxGridD20.bpl。默认状态应该是全部勾选的如果没有说明安装时没有成功写入注册表这时需要手动定位到 DevExpress 安装目录下的 Bin 文件夹把对应的 bpl 文件添加进去。添加完之后工具箱里会出现一大批控件包括 cxGrid、cxTreeList、dxLayoutControl、dxBarManager、dxSpreadsheet 等等。2.3 第一个工程里的基础设置创建新工程后我建议第一件事就是拖一个 TdxSkinController 到主窗体上并把 SkinName 设置为 Office2019Colorful。这个动作能避免默认外观跟 Windows 10/11 的系统主题差异过大。同时在工程选项中确认以下配置Runtime packages 至少勾选 “DevExpress” 系列运行时包这样可以减小 EXE 体积。开启 “Build with runtime packages” 后发布时需要带上对应的 bpl 文件。在 project options 中设置高 DPI 模式为 “Per Monitor V2”这一步在 10.4 里是原生支持的配合 20.2.4 效果理想。高 DPI 这里多说一句如果你省事不设置程序在 150% 缩放的屏幕上打开cxGrid 的列头和编辑器会出现轻微发虚。20.2.4 虽然修复了大部分 DPI 缩放问题但工程本身不声明 DPI 感知控件再努力也没用。3. 核心组件实战cxGrid、布局控件与皮肤3.1 cxGrid 数据表格直接从数据库到界面cxGrid 是 DevExpress VCL 里最常用的控件没有之一。它的设计思路是“视图”和“数据”分离。一个 cxGrid 可以承载多个 View但业务里最常见的就是 TcxGridDBTableView它直接绑定 DataSource跟传统 TDBGrid 的使用习惯很接近。我项目里一般这样搭procedure TMainForm.SetupGridBindings(AGrid: TcxGrid; ADataSet: TDataSet); var AView: TcxGridDBTableView; AColumn: TcxGridDBColumn; begin AView : TcxGridDBTableView.Create(AGrid); AView.DataController.DataSource : DsMaster; // 已绑定的 DataSource AView.DataController.CreateAllItems; // 根据数据集字段自动生成列 AView.OptionsView.ColumnAutoWidth : True; AView.OptionsBehavior.Editing : True; AGrid.Levels[0].GridView : AView; end;CreateAllItems 是我最常用的一招它会根据 DataSet 的字段类型自动创建列。你要是嫌默认生成的列标题不好看可以在设计期再手动调整每列的 Caption。值得注意的一点cxGrid 的列属性和字段绑定是独立的如果你运行中动态修改了字段名列不会自动跟着变所以动态建列时必须显式设置 Column.DataBinding.FieldName。cxGrid 另一个好用的是统一的分页导航组件 TcxDBNavigator搭配 DataSource 使用。不过要提醒你它和传统 TNavigator 的事件命名不同比如点击“插入”按钮的事件是 BeforeAction 而不是 OnClick。这个细节容易让从传统控件迁移过来的老人踩坑。3.2 事件模型别被“客户端事件”这个词带偏搜索热词里有“devexpress clientside event”。在 VCL 世界里严格来说没有浏览器所谓的“客户端事件”因为 VCL 不是 Web 框架所有事件都在本地执行。但 DevExpress 控件的事件体系比传统 VCL 控件更丰富很多事件模仿了它在 ASP.NET 组件里的事件习惯比如 cxGrid 的 OnCustomDrawCell、OnCellClick、OnFocusedRecordChanged它们在语义上更接近“前端交互触发”。实际开发里我最常用的是 TcxGridDBTableView 的 OnCellDblClick 和 OnKeyDown。比如双击表格行打开详情窗体procedure TMainForm.AViewDblClick(Sender: TObject); begin if AView.Controller.FocusedRecord nil then ShowDetailForm(AView.DataController.DataSet.FieldByName(ID).AsInteger); end;这里的核心逻辑是只有 FocusedRecord 不为空才说明焦点落在一行有效的记录上否则用户可能在点击表头空白处这时直接跳详情会触发异常。事件处理是所见即所得的代码不复杂但注意点往往在小细节。3.3 皮肤、主题和视觉一致性DevExpress VCL 的皮肤引擎是一大卖点20.2.4 自带的皮肤里Office2019 系列和 VisualStudio2019 系列都比较现代。如果你维护的是企业级桌面系统界面视觉一致性比炫酷更重要所以我通常统一用 dxSkinController 全局控制而不是在单个窗体重写颜色。另外如果你用到了 dxLayoutControl 来做表单布局记得不要手动修改嵌套布局的 Caption 属性。因为 dxLayoutControl 的 Caption 是自动绑定到所属控件上的你改了后又手动改控件 Label保存布局文件时会发生冲突。我就曾经碰到过布局 JSON 被反复改写的问题最后是在 dxLayoutControl 的 OptionsView 里关闭自动生成标题才解决。4. 老项目迁移与 Delphi 7 兼容性问题4.1 老项目升级时的“破坏性变化”很多朋友还在维护 Delphi 7 时代的老项目搜索热词里也有“devexpress delphi 7 dcu”。请注意DevExpress VCL 20.2.4 完全不支持 Delphi 7它要求的运行时库和 ANSI 字符串支持跟 Delphi 7 不兼容。如果你下载的安装包里带有旧版 Delphi 7 的 DCU 文件那些只存在于很老的版本比如 7.x 时代。20.2.4 安装包扫描的时候会发现编译器版本不一致直接不给装。因此老项目迁移基本上只有两条路第一条把业务逻辑逐步迁到 RAD Studio 10.4 DevExpress 20.2.4第二条继续用老版本 DevExpress 留在 Delphi 7 上但需要自己承担安全和兼容性风险。我一般建议能迁则迁因为现在 Windows 系统更新频繁老版本控件在高 DPI 和 Unicode 上的问题会越来越多。4.2 利用工程转换工具处理 DCU 残留如果项目本身已经准备好迁移到 10.4但目录里残留了大量老 DevExpress 的 DCU 文件建议做一次彻底清理。我的做法是卸载旧版 DevExpress 包删除安装目录下所有残留。在 RAD Studio 10.4 的 Tools Options Environment Variables 中检查 Library 路径是否指向旧组件目录若有则移除。删除工程目录、本地缓存里的.dcu、.dcpp、.map、.bpl 文件。用 DevExpress 自带的工程转换工具在安装目录的 Tools 下扫描所有 .dpr 和 .dpk 文件自动替换单位和包名。4.3 字符串类型和索引长度的迁移细节老项目最常见的坑是字符串类型。在 Delphi 7 里字符串默认是 AnsiString而 10.4 默认是 UnicodeString。DevExpress VCL 20.2.4 的很多事件参数都改成了 UnicodeString因此老代码里如果直接对字符串做数组下标操作很可能拿到的是字节下标而不是字符下标。迁移时最好全局搜索string[和Length(逐个检查是否有跨字节问题。另外数据库表里的主键如果是字符串类型且字段长度超过 20 个字符容易在 cxGrid 排序或过滤时出现异常。因为 DevExpress VCL 内部会把值传进 TValueUnicode 字符串的排序规则与老版本不同。如果遇到排序错乱在 DataController 的 OnCompare 事件里自定义比较逻辑能比较稳妥地解决。5. 常见问题与排查技巧5.1 Package 找不到或 not installed 的错误这个错误在 20.2.4 安装后偶尔会冒出来。最常见的场景你在 IDE 里新打开一个工程IDE 提示找不到某个 DevExpress 设计时包。原因多半是之前的版本没有完全卸载干净或者 BPL 文件被其他程序锁住了。排查顺序是先打开 Component Install Packages确认对应包是否打勾再检查 BPL 文件是否存在于系统 PATH 包含的目录中最后看 IDE 的 Event Log里面会有具体是哪个包加载失败。如果还是加载不上可以用管理员身份运行命令行工具dxpgs.exe它会重新注册所有设计时包。注意注册完必须重启 IDE不然 IDE 的包缓存不会刷新。5.2 高 DPI 下字体模糊和列宽错乱这个问题在 10.4 20.2.4 下已经大幅减少但如果你的窗体是从 10.3 老版本迁移过来的窗体的 Scaled 属性可能还保持旧值。这时 IDE 会自动做一次缩放转换反而导致像素错位。建议在每个迁移过来的窗体上手动设置Form.Scaled : False然后重新调整一遍控件布局。如果窗体很小直接重建比调整快得多。5.3 与其他第三方库NativeExcel 等的冲突搜索热词里出现了“nativeexcel for rad studio 12”这让我想起不少人在项目中同时使用 DevExpress 和 NativeExcel 的情况。NativeExcel 主要是用来直接读写 Excel 文件而 DevExpress 的 dxSpreadsheet 也能导出 Excel两者并不冲突但要注意 COM 注册。NativeExcel 依赖控件注册如果你用 D7 时代注册过后来重装系统很可能只在注册表中留下了过期的 CLSID导致 DevExpress 导出 Excel 时发生 “Class not registered”。解决办法是重装 NativeExcel并确认在编译环境中勾选“Register Type Library”。另外dxSpreadsheet 在导出 .xlsx 时如果单元格内容包含长字符串超过 255 个字符老版本的 DevExpress 会出问题。20.2.4 已经修复了这个限制但如果你同时接入了 NativeExcel 的 ExcelApplication它内部仍按老逻辑处理长字符串最好统一用 dxSpreadsheet 做导出。5.4 事件不触发的排查方法排查 DevExpress VCL 事件不触发我有个固定套路先在事件处理函数里打一个 MessageBeep(0)确认事件是否真的执行如果 Beep 没响再检查事件是否绑定到了正确的 View 上。比如 cxGrid 有多个 View如果你在 Structure 面板选中了 Grid 本身而不是 DBTableView那么 OnClick 事件写的其实是 Grid 的事件不是表格视图的事件。这种低级错误占了日常问题的一半以上。另一个常见原因是某些 View 的 OptionsBehavior.Editing 设为 False 时OnCellClick 不会触发因为点击被当成了“选择列”操作而不是“编辑单元格”操作需要把OptionsBehavior.GoToNextCellOnEnter等属性打开才正常。5.5 编译慢和重复链接的优化建议20.2.4 的包数量很庞大如果使用隐含运行时包首次编译会比较慢。你可以把“Runtime packages”里的 DevExpress 运行时包全部勾上同时打开增量链接。首次编译后后续编译速度会明显提升。发布时记得把 bpl 文件一起拷贝到 exe 所在目录或者在安装目录中把 bpl 放到系统 PATH 下。我曾经遇到过客户电脑上程序运行提示找不到 dxCore 的情况就是因为 bpl 没拷贝全后来我用工具扫描 exe 的导入表把缺失的 bpl 全部补齐才解决。6. 一些实际体会和补充技巧在使用 20.2.4 的这段时间我最大的体会是它比 20.2.0 稳定了一个量级。以前我在 20.2.0 上遇到的 cxGrid 偶发崩溃到了 20.2.4 基本绝迹。这个版本很适合作为企业级项目的基础依赖前提是你把 RAD Studio 10.4 本体也保持在 Update 1 以上。关于更新安装再分享一个小技巧每次升级 DevExpress VCL 前先备份当前正在使用的整个安装目录尤其是 Bin 和 Source 目录。虽然官方安装程序不会立刻删除旧文件但 RegSvcs 在注册新包时可能覆盖同名的 bpl导致你不得不重新装回旧版本。备份加上一个干净的卸载流程可以保证任何一次升级失败了都能快速回滚这个习惯帮我省了好几次救火时间。本文还有配套的精品资源点击获取