
简介DevExpress VCL 20.2.4 for RAD Studio 10.4 是面向 Delphi/CBuilder 开发者的官方编译版 VCL 控件库适合需要为桌面应用补充高级界面组件、又希望跳过源码编译环节的中高级开发人员。该版本不含 DCU 文件发布包可直接解压使用但目标机运行程序时需依赖 BPL 运行时包作者特别强调安装后应在项目选项中链接相应运行时包否则容易误判为“安装后不工作”这份说明对初次使用者很有帮助。包体为单个 7z 压缩包大小约 362.21MB内含官方编译好的组件文件文件总数与类型明细上游未单独标注不影响整体解压与使用。目前已有 1959 人学习或下载该资源。相比源码自行编译方案这份版本省去编译环境搭建与版本适配成本适合快速集成到 RAD Studio 10.4 桌面项目兼顾稳定与即时可用。1. 从 RAD Studio 10.4 到 DevExpress VCL 20.2.4老 VCL 项目升级时最该先定的版本DevExpress VCL 20.2.4 for RAD Studio 10.4听起来就是一串版本号实际上它是老 VCL 桌面项目升级到 10.4 时最该先锁定的组件库版本。接手一个维护了三年的 Win32 项目客户要求把开发环境从 10.3 升到 10.4IDE 装好、旧代码也能打开但一编译就是几百个红叉——cxGrid、dxRibbon、dxBarManager 全部 Cannot find unit。不是代码坏了是组件库和 IDE 的包系统没对齐。DevExpress VCL 20.2.4 正好卡在 10.4 的兼容窗口上设计期能拖拽、运行期能编译、发布期能带上自己的 BPL。这篇笔记写给三种人要升 10.4 的老项目维护者、刚拿到组件库授权不知道怎么装的开发者以及想确认 20.2.4 到底值不值得用的选型人员。下面按选型、安装、激活、第一个界面、踩坑、进阶一路讲到底。2. 版本选型和安装前置20.2.4 为什么值得锁定2.1 先看懂版本谱系20.2、20.2.4、10.4 三者什么关系DevExpress VCL 每年出两个大版本命名规则是「年份.半年」20.1 是 2020 上半年线20.2 是 2020 下半年线。大版本之间会加新控件、改默认行为这就是为什么 19.2 的工程直接换 20.2 往往编译出一堆 Deprecated 警告——组件库做了破坏性调整。而 20.2.4 是 20.2 线的第四次维护构建。维护构建只修 bug 和兼容性不引入新控件、不轻易改属性默认值。对 RAD Studio 10.4 这种「IDE 版本带 update 节奏」的环境来说20.2.4 正好踩在 10.4.0、10.4.1、10.4.2 都验证过的位置。项目说明大版本 20.22020 年下半年功能线新增控件、调整行为维护构建 20.2.420.2 线第 4 次修复版本API 稳定IDE 端 RAD Studio 10.4Sydney 代内部版本 27包后缀常见 270匹配结论20.2.4 对 10.4 是同代稳定改动以修 bug 为主有人会问DevExpress VCL 21.x 不也支持 10.4 吗是支持但 21.x 属于下一代功能线皮肤默认值、单元格编辑器行为、包依赖结构都变过。老项目升 IDE 已经够折腾了再把组件库大版本一起升等于一次踩两个雷。我的建议是10.4 项目锁 20.2.4只有新项目才考虑 21.x 之后的版本。血泪经验是某开发者图省事直接装 21.1结果 cxGrid 的默认编辑行为变了测试用例挂了 40 多个最后回退到 20.2.4 才顺利发布。2.2 装之前先检查这四件事安装本身不难难的是装之前的环境准备。我一般按下面顺序过一遍。第一确认 IDE 版本号。Help About RAD Studio 能看到是 10.4.0 还是 10.4.1/10.4.2。20.2.4 对三个小版本都兼容但如果你 IDE 还是 10.4.0建议先把 update 打上再装组件否则某些 dcl 包注册时会因为 IDE 内部 bug 而失败。第二关掉 IDE 和 BDS 后台进程。安装器要往 Delphi 的包注册表写东西IDE 开着容易注册失败。以管理员身份运行安装器UAC 弹窗别急着点掉。第三处理老版本。如果这台机器上装过 DevExpress VCL 19.x 或 20.1要么卸载要么接受并存。并存的后果是设计期两个版本的 design-time 包都想注册之后每次 IDE 启动都可能弹 Package is already installed 冲突提示。我的习惯是同一 IDE 版本下只留一套组件库装新版前先退激活再卸载旧的。第四规划安装目录。默认路径是 C:\DevExpress VCL 20.2.4。如果改路径注意两点不要带中文不要带空格。虽然 Delphi 的 Library path 能处理带空格路径但 dcc32 在某些第三方插件的解析下会把带空格路径拆错最终表现就是玄学般的 Unit not found。与其花时间排错不如用 C:\DevExpressVCL202 这种短路径。2.3 安装介质在线安装器、离线 ISO、静默参数DevExpress 的 VCL 安装包常见分发形式有在线 Universal 安装器和离线 ISO。内网开发机没有外网时离线 ISO 是唯一可靠选择装完不需要联网拉东西。如果你要批量给组里好几台机器装安装器支持不支持静默参数要看具体打包方式——常见的是 Inno Setup 打包支持这类命令行C:\packages\DevExpressVCL.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART静默装的优点是快、不弹窗缺点是组件选择全部按默认走。如果这台机器只需要 Delphi 平台、不需要 CBuilder静默装会把两套都带进去白白增加编译包的时间。所以我的建议第一台「镜像母机」用交互式安装仔细选一遍之后的机器再用静默参数复刻或者干脆整盘复制母机的安装目录。提示装完先别急着开 IDE。回资源管理器看安装目录里的 Library 子目录是否生成了 RS 开头的文件夹RS27 对应 10.4RS 后面数字就是 IDE 内部版本看到了说明安装器已经为 10.4 准备好 Delphi 的单元和包文件这是后面所有编译能过得去的前提。3. 把 20.2.4 装进 RAD Studio 10.4安装、激活与验证的完整流程3.1 安装向导里的三个关键决定点交互式安装走到组件选择页时三个选项会决定之后的成败。第一个是 IDE 勾选。安装器会列出它能识别到的所有 RAD Studio 版本把 10.4 勾上旁边的 CBuilder 看需求。只做 Delphi 开发就不要勾 CBuilder省下将近一半的编译时间。第二个是包编译方式。安装器一般给「使用预编译包」和「从源码重新编译」两个选择。预编译包快装完立等可用从源码编译慢但能保证和 IDE 补丁版本完全咬合。我一般选预编译等 IDE 装完跑一个 demo 验证真遇到 dcl 包加载失败再用安装器的 Repair 功能走一遍源码编译这是最快的排错路径。第三个是皮肤资源。自带的十几个皮肤主题包括 Office2019 系列、Basic、DevExpress Dark默认全装。别手痒去掉皮肤文件不在包里的话TdxSkinController 在运行期换肤会直接没有效果而且不报错——这是最典型的黑匣子问题。安装器跑完会提示是否立即启动 IDE选不启动。马上启动的话 IDE 要重新枚举全部组件包反而容易卡在首屏。3.2 激活与授权离线机器怎么处理安装不等于激活。未激活状态下设计期拖控件能拖但运行期行为受限制最典型的是程序标题栏或网格上出现评估版水印。活性化方式单机正版一般用序列号在线激活内网机器不能联网时用离线激活在一台能上网的机器上生成激活申请文件把响应文件拷回开发机导入。激活信息写在哪Windows 下组件的许可证存放在当前用户的注册表键 Software\DevExpress 下它跟着用户走不跟着机器走。备份时要连这块注册表一起备份重装系统后导回去就能免激活恢复——这相当于你的后悔药。注意别把注册表导给别的机器共享授权授权数量按并发激活数控制乱导会导致激活名额被占满。激活完成后打开 RAD Studio 的 Help About组件库信息里会显示 License 状态。看到 Licensed 再继续否则后面编译出的程序行为不完整排查起来反而更浪费时间。3.3 验证安装30 秒的编译冒烟测试打开 RAD Studio 10.4先看两处主菜单栏多了一个 DevExpress 菜单项组件面板里出现一排 DevExpress 20.2 开头的 Tab。都出现了说明 design-time 包注册成功。接着做一个可以复现的最小验证新建 VCL Forms Application——注意是 Delphi 的 VCL不是 FMX——然后手动把这个 uses 写进单元文件uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, dxSkinsCore, dxRibbon, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters;这段 uses 的含义是后四行分别拉进了皮肤核心、Ribbon 功能区控件和 LookAndFeel 外观控制。它们能编译通过说明运行期包里的核心单元找得到组件库装得没问题。保存后按 F9窗体正常弹出来第一关就过了。如果编译报 F2613 找不到 dxRibbon.dcu别急着重装。先去 2.2 里的方法查 Library path多数是路径问题路径没错还报找不到再考虑包损坏去安装器里 Repair。4. 用 20.2.4 搭出第一个实际界面控件选型与最小实现4.1 常用控件先有一个映射表DevExpress VCL 组件多到新手会逛晕但老项目翻来覆去用的就这几类。先给你一个对照表选型时对着需求找组件比在组件面板里一个一个拖快得多场景需求对应组件在面板里的位置数据表格绑数据集、分组、合计TcxGridExpressQuantumGrid 系列DevExpress 20.2: Data功能区 Ribbon 菜单TdxRibbon TdxRibbonBackstageViewDevExpress 20.2: Ribbon传统工具栏/右键菜单TdxBarManagerDevExpress 20.2: Toolbars全局换肤TdxSkinControllerDevExpress 20.2: Common内嵌 Excel 式电子表格TdxSpreadSheetDevExpress 20.2: Spreadsheet一个常见误用是把 TcxGrid 当成增强版 TDBGrid。TcxGrid 的数据控制器是独立的它跟 DataSource 的交互、列自动生成逻辑、分组视图都和数据感知控件不完全一样。如果你只是想要一个更好看的 TDBGrid先想清楚是不是真需要 TcxGrid 的分组、汇总、多视图能力不然学习成本会超出收益。4.2 一个 Ribbon 网格的最小主窗口最常见的业务系统主窗口就是「上 Ribbon、中间网格、底部状态栏」。在空窗体上按下面几步走。第一步放 TdxRibbon 到窗体顶部让它自动接管标题栏区域。第二步放 TdxBarManagerRibbon 的页面和按钮都由它管理。第三步放 TcxGridDataSource 和 TcxGridDBTableView、TcxGridLevel把 TcxGrid 铺满窗体剩余区域。第四步放 TdxSkinController这个组件没有可视化外观它在运行时负责把皮肤应用到整个应用。然后写 FormCreateprocedure TMainForm.FormCreate(Sender: TObject); begin // 一行代码换全局皮肤所有 DevExpress 控件外观统一 dxSkinController1.SkinName : Office2019Colorful; // 数据控制器绑定业务数据集 cxGrid1DBTableView1.DataController.DataSource : DataSource1; cxGrid1DBTableView1.DataController.CreateAllItems; end;参数这里的重点是 SkinName 字符串大小写要和皮肤资源里的名字完全一致写错不报错、不抛异常只是皮肤不生效这是最常见的翻车点。CreateAllItems 是 TcxGrid 特有的「按数据集字段自动生成列」方法数据集打开后调用一次列就齐了如果希望自己控制列就别调它在设计期逐列配好 FieldName。这段代码编译运行后你会看到整个窗口的 Ribbon 和网格全部变成 Office2019 的彩色风格。这就是组件库和原生 VCL 最直观的差别原生控件要自己找第三方皮肤框架这套组件库自己把绘制管到底——代价是绘制逻辑是一个庞大的黑匣子出问题时往往是显示层的事而不是业务逻辑。4.3 手写 uses 的边界哪些单元该出现拖控件时 IDE 会自动维护 uses但团队代码评审时总有人喜欢手写或者在模块间复制粘贴。手写的最小原则是用到哪个组件所在单元就写哪个单元皮肤、外观这类「伴随行为」单元即使没直接引用类名也要带上。uses cxGrid, // 网格控件本体 cxGridDBTableView, // 数据表格视图 cxGridLevel, // 网格层级配置 dxBar, // BarManager 核心 dxRibbon, // Ribbon 核心 dxSkinsCore, // 皮肤核心 dxSkinOffice2019Colorful; // 实际皮肤的注册单元这里 dxSkinOffice2019Colorful 是最容易漏的。TdxSkinController 的 SkinName 只写字符串如果程序里没有任何单元引用具体皮肤类链接时皮肤资源不会被带进可执行文件运行时机子上只有默认皮肤。这个坑和 3.1 里说的「安装时去掉皮肤资源」是同一类问题都在运行时无声失效。编译期唯一的检查方式是看编译警告如果明显感觉换了皮肤没变化先查 uses 里有没有对应皮肤单元。提示换肤不生效先查 uses 里具体皮肤单元再查 SkinName 字符串大小写最后才怀疑包损坏。5. 避坑指南20.2.4 装完到发布前的高频翻车点5.1 现象IDE 启动报 Cannot load package 对应的 BPL原因安装器生成的 design-time 包和当前 IDE 的内部版本不一致最常见是 IDE 之后打了补丁比如 10.4.1 升 10.4.2包照旧用注册表里的 BPL 路径失效。解决回安装器选 Repair让它重新编译并注册 design-time 包。注意 Repair 之前先把 IDE 关掉。这个修复会把编译时间拉长到半小时级别别中途关进程。5.2 现象工程编译报 F2613 Unit dxRibbon not found原因分三种Library path 没加组件的源码头装了新版但工程搜索路径指到旧版残留目录或者把 dcu 混在源码目录里路径顺序串了。解决先到 Tools Options Delphi Options Library把安装目录 Library\RS27\Win32 加进去再查工程 *.dproj 的 DCC_UnitSearchPath 里有没有旧路径删掉 19.x 的残留最后在工程选项里关掉 Implicit Build 重建让 dcc32 重新找所有单元。5.3 现象皮肤换了一半原生控件和 DevExpress 控件两个风格原因TdxSkinController 只能换组件库自己控件的绘制原生 TButton、TPanel 这类控件不会变。这不是 bug是这套库的边界。解决要么接受混合风格在界面设计上让原生控件靠边站要么去用 RAD Studio 自带的 Vcl.Themes 统套换肤但 Vcl 样式会和组件的皮肤打架不建议同时开。判断标准是一个窗口里组件控件占多数时用 TdxSkinController都是原生控件时干脆不用它。5.4 现象程序在自己机器能跑拷到别的机器缺 DLL 或 BPL原因组件默认和运行时包动态链接。开发机上装了组件所以没事目标机是干净环境BPL 一个都没有。解决看 Project Options Packages把 Build with runtime packages 去掉改为静态链接代价是 exe 体积增大 10 到 20MB或者把用到的 DevExpress BPL 和 VCL BPL 一起放进部署目录。静态链接省心但打补丁后必须完整重编重发动态链接则要维护一份 BPL 清单。我一般给公司内部项目用动态给客户交付的工具用静态。5.5 现象升级 IDE 后旧工程打不开或设计期卡死原因10.4 的 update 会更新 VCL 基础包组件库的包在部分机器上和新的 VCL 包存在时序问题典型现象是设计器打开 .dfm 时死锁。解决这属于「IDE 补丁先于组件补丁」的尴尬窗口。先把 10.4 补丁打齐再重新执行安装器的 Repair 编译全部包如果还卡清掉设计器缓存——关闭 IDE删除工程目录下 *.local 里的缓存再重开。多数情况到这一步就好了。这五类问题排完组件层面才算真正能用。剩下最关键的一步是到部署阶段把版本约定写清楚。6. 进阶把 20.2.4 固定成团队的发布基线6.1 用「包名 注册表」双重锁版本团队的开发机最怕版本漂移有人装 20.2.4有人装 20.2.3最后工程文件里混着两种 dcu编译器看心情报错。锁版本的做法是把安装器 ISO 和激活备份放到共享目录新机器的安装记录写进交接文档文档里记三件事组件版本 DevExpress VCL 20.2.4、IDE 版本 RAD Studio 10.4.2、包后缀 270。后缀可以在 IDE 的 Components 菜单里核对。依赖包清单可以这样辅助生成project_namebizapp # 列出工程链接到的 DevExpress 运行时包27 对应 10.4 内部版本 grep -oP dx[A-Za-z0-9]VCL27[0-9] ${project_name}.dproj | sort -u这段命令的作用是把 .dproj 里引用的运行时包名过滤出来。输出的清单拿去对着部署机器的包目录核对缺哪个补哪个比发布时等客户报错再排查要省事得多。6.2 大数据量网格的一个必调参数TcxGrid 在几万行数据上默认也能跑但滚动会有肉眼可见的卡顿。别急着上虚拟数据集先调 DataController 的 SmartRefresh只刷新变化区间而不是整表重建。// 大数据量下减少整表刷新 cxGrid1DBTableView1.DataController.SmartRefresh : True; cxGrid1DBTableView1.DataController.SmartRecreateItems : False;SmartRefresh 为 True 时数据变化只做局部刷新配合网格的缓冲绘制十万行级别的表格滚动流畅度会明显改善。代价是列结构变更后不会自动重建改了列记得手动调用 RecreateItems。我现在的习惯是任何项目写第一行业务之前先在交接文档里固定「IDE 补丁号 组件小版本号 包后缀」并在脚本里用上面那种 grep 校验包名。这个习惯帮我挡掉了至少三次「换台机器就编译不过」的排查——版本对齐这件事等到项目后期再补成本是最高的。希望帮到你。本文还有配套的精品资源点击获取