简介:DevExpress VCL 20.2.6 控件安装包面向 Delphi 11 及更早版本开发环境,专为升级后需要重新匹配 VCL 控件库的 Delphi 开发者准备,解决国内常见渠道要么挂羊头卖狗肉、要么无法编译的痛点,属于可直接投入使用的正式发行版。压缩包约 473.21MB,采用 7z 单包交付,内含可执行的 DxAutoInstaller.exe 一键安装引导程序以及完整 full source 源码文件,无需手动配置环境;运行安装脚本后,即可在 D11 中直接加载控件,省去繁琐的注册与编译过程。该版本已经在实际环境亲测通过,且标注为非试用版,各类常用可视化组件和底层库均可正常使用,同时保留完整源码,便于二次开发与定制维护。目前已有 512 人学习/下载,适合从工具类小工具到大型企业级业务的 Delphi 开发者,快速补齐升级后的基础设施,把节约的时间投入业务开发。
1. DevExpress VCL 20.2.6:不是新版本,却正好能落在 Delphi 11 的坑位上
第一次听到“20.2.6 支持 Delphi 11”这种组合,不少人第一反应是版本对不上。DevExpress VCL 20.2 是 2020 年底发布的子版本线,Delphi 11 是 2021 年的 IDE 主线,按直觉应该装 21.2 或 22.x 才对。可实际工程环境里,很多团队就是拿 20.2.6 配 Delphi 11 做维护版,编译、部署都正常。这套资源属于 full source 版本,带有全部源码单元,不做黑匣子处理,适合需要长期维护老项目、又想让 IDE 升级的 Delphi 开发者。本文记录的是我完整走一遍安装、注册、建工程验证的实测过程,包括那些装完却拖不出控件的坑。
2. 版本兼容性:为什么 20.2.6 能在 Delphi 11 上注册成功
安装第三方控件最怕的是 IDE 崩掉或控件面板空白。在动手之前先搞清楚一个关键点:DevExpress VCL 判断 IDE 是否兼容,用的不是“Delphi 11”这个产品名,而是编译器版本号。它内部的公共头文件里写着一系列条件编译指令,根据 Delphi 的 VER 常量决定包含哪些单元和注册逻辑。Delphi 11 Alexandria 的编译器版本对应 VER350,而 20.2.6 在发布窗口上正好覆盖了这个编译分支,所以它能在新版 IDE 里正常编译、正常注册。
选择“旧大版本 + 新补丁”组合,图的是稳定。20.2 的功能集已经被大量项目验证过,20.2.6 又吸收了这个系列后期的修正,所以很多从 Delphi 10.4 迁移到 11 的团队会特意锁在这两个版本之间,而不是直接跳到 21.2 或 22.x。这和你“要不要追新”是两回事,做维护项目的人最看重的是:老代码能编译、新系统能跑、出问题有源码可追。
2.1 先用编译版本号而不是产品名判断兼容性
打开 Delphi 11 的 Tools > Options > IDE > Environment Variables,能看到平台版本号。Delphi 11 的 IDE 目录对应Studio\22.0,这不是编译器版本,只是 BDS 目录名。真正要留意的是编译器版本,见下方代码。注意 Delphi 11 的 CompilerVersion 输出是 35.0,对应的条件编译符号是 VER350,DevExpress 源码头文件里就是靠这个来切换兼容分支的。
program CheckCompiler; uses System.SysUtils; begin // 输出当前编译器的版本号,用来核对控件安装包是否兼容 WriteLn('CompilerVersion: ', CompilerVersion); WriteLn('RTLVersion: ', RTLVersion); Readln; end.这里的CompilerVersion和RTLVersion是编译器内置常量,前者对应编译器发行版本,后者对应运行时库版本。在 Delphi 11 上执行,会看到 35.0 这个值。判断 DevExpress 20.2.6 是否匹配,不用看宣传文案,直接看它的源码头文件里有没有VER350分支即可。我一般会先建一个空控制台程序跑一下,确认当前环境的编译版本号,再决定要不要继续安装,避免“装了又卸”的反复折腾。
2.2 安装前的环境检查:一份可以复用的清单
安装前还有一件容易被忽略的事:机器上是否存在旧版 DevExpress 残留。很多安装报错不是新包有问题,而是旧版本的 BPL、DCU 或注册表项混在环境里。检查清单见下。
$studioPath = "C:\Program Files (x86)\Embarcadero\Studio\22.0" if (Test-Path $studioPath) { # 22.0 是 Delphi 11 的 IDE 目录,21.0 是 10.4 Write-Host "[OK] Delphi 11 安装在默认路径" } else { Write-Host "[WARN] 没找到默认路径,请手动指定 IDE 根目录" } $oldDxPath = "C:\Program Files (x86)\DevExpress" if (Test-Path $oldDxPath) { # 这里列出的是旧版安装目录,检查是否同时存在 20.1/19.2 等目录 Get-ChildItem $oldDxPath -Directory | Select-Object Name }脚本里Test-Path用来测试路径是否存在,Get-ChildItem -Directory列出 DevExpress 根目录下的所有子目录。如果看到多个版本目录,说明机器上有版本混装风险。此时不要急着安装 20.2.6,先把旧版的 IDE 包从 Delphi 11 里卸载,再清理旧版目录,否则两个版本的同名 BPL 会在 IDE 加载时抢位置。full source 和试用版的差别也体现在这里:源码版会把完整的 Source 目录展开到安装目录下,而试用版只放编译好的 DCU 和少量文档。没有源码,后续一旦遇到控件内部异常,只能盲试。
3. 安装实操:从环境检查到控件面板出现图标
安装这一步我没有使用默认一路下一步的方式,而是把安装器流程拆成“模式选择、编译注册、许可校验”三个阶段来走。这样做的好处是,万一某一步没生效,你能立刻知道问题出在哪个阶段,不用反复卸载重装。
3.1 安装器的两种模式与版本路径识别
安装包执行后,第一个关键页面是让你选 Express 还是 Custom。做维护项目的建议选 Custom,因为 Express 会把大量不一定用得上的套件全部装进去,比如 ExpressSpreadSheet、ExpressNavBar 之类的,既拖慢安装,也增加 IDE 启动时加载的包数量。Custom 模式下,只需要勾选实际用到的套件即可。
接着是版本识别。安装程序会在页面上列出它检测到的 IDE 版本,如果 Delphi 11 没有被列出来,不要继续点下一步。常见做法是右键“以管理员身份运行”安装器,因为 Delphi 的 BDS 注册表主键位于 32 位注册表视角下,非管理员权限读取会失败。如果管理员权限运行后仍然识别不到,就在 Custom 页面里手动指定 IDE 根目录为C:\Program Files (x86)\Embarcadero\Studio\22.0,指向bds.exe所在目录。
这里有一个容易被忽略的点:安装器对 IDE 的检测是看注册表里的 BDS 键值,而不是扫描磁盘。如果之前安装过其他版本的 RAD Studio,后来又卸载不干净,注册表里可能残留旧路径,导致新安装器读到错误位置。所以检查注册表里 Embarcadero 相关主键是否指向 22.0,比反复重启安装器更有效。
3.2 BPL 注册与控件面板出现图标
安装完成后,大多数情况下安装器会自动完成 IDE 包注册。但实际项目中我见过多次“安装成功但控件面板空白”的情况,原因就是 IDE 集成步骤被 UAC 静默拒绝,或者安装器写完了文件但没有执行包注册。手动注册的操作是:Delphi 11 主菜单 Component > Install Packages > Add,然后进入 DevExpress 的 Library 目录下对应编译器版本的文件夹,选择以 dcl 开头的 BPL 文件。
这里要区分设计期包和运行期包:dcl 开头的是设计期包,只负责在 IDE 里显示控件、弹出属性编辑器;不带 dcl 的是运行期包,编译出来的程序运行时依赖它们。下面这段批处理用于把运行期 BPL 统一拷贝到团队公共目录,避免每台机器各装各的版本。
@echo off rem 将 DevExpress 运行时 BPL 统一拷贝到公共目录,避免机器间版本不一致 set DX_SRC=C:\Program Files (x86)\DevExpress\VCL\Library set APP_LIB=D:\TeamLib\DevExpress\20.2.6 if not exist "%APP_LIB%" mkdir "%APP_LIB%" rem dcl 开头的是设计期包,目标机器运行 exe 时不需要,只拷贝非 dcl 的 bpl for %%f in ("%DX_SRC%\*.bpl") do ( echo %%f | findstr /i /v "dcl" >nul if not errorlevel 1 copy /y "%%f" "%APP_LIB%" ) echo Copy done.这段脚本的逻辑是:遍历 Library 目录下所有 bpl 文件,用findstr /v排除包含 dcl 的文件名,剩下的就是运行期包,统一复制到公共目录。注意errorlevel 1表示 findstr 没找到匹配项,也就是文件名里没有 dcl,这时执行复制。运行脚本前要关掉 Delphi IDE,否则 bpl 文件被占用会复制失败。
3.3 非试用版许可状态的三种验证方式
很多人在这一步翻车:装到一半可以看到控件,但一编译就弹出试用提醒,或者 IDE 启动时提示试用到期。验证这份资源是否真正注册成功,可以从三个角度检查。第一,打开任意 VCL 工程,看主菜单是否出现 DevExpress 菜单,里面 About 窗口会显示当前版本号和许可状态。第二,新建一个空 VCL 工程,放一个 TcxGrid,直接编译,看是否弹出试用提醒框。第三,检查安装目录下是否存在完整的 Source 目录,这是 full source 版与试用版最直观的区别。
| 验证点 | 操作系统位置 | 期望结果 |
|---|---|---|
| IDE 菜单 | DevExpress > About | 显示 20.2.6 版本信息 |
| 编译验证 | 新建 VCL 工程放 TcxGrid | 编译无试用提醒 |
| 源码目录 | DevExpress 安装目录下的 Source | 多个子套件源码目录齐全 |
需要说明的是,非试用版指的是许可文件已经写入本机注册表,构建出的 exe 不会出现试用版的水印或弹窗。至于这个资源是怎么获得的,我不展开,也不评价,我只关注装完能不能稳定开发。
4. 避坑排查:三个装了也用不了的典型场景
这一章我直接记录实际安装中遇到过的三类典型故障,每一条都是完整走一遍安装后才暴露出来的问题。如果你按照第 3 章的步骤操作,大概率不会走到这里;但如果你的机器环境比较杂,下面三条能帮你省下一个下午。
4.1 安装器检测不到 Delphi 11
现象:安装向导的 IDE 列表里没有 Delphi 11 Alexandria,只有一个灰色提示说“未检测到支持的 IDE”,无法继续选择组件。
原因:安装器读取的是注册表里 Embarcadero 的 BDS 主键,不是扫描磁盘目录。常见情况是当前用户不是管理员,或者之前安装过其他版本 RAD Studio 后卸载不干净,注册表残留了旧路径。
解决:右键安装包,选择“以管理员身份运行”。如果管理员权限仍然无效,打开注册表编辑器,定位到 HKEY_LOCAL_MACHINE 下 Embarcadero 相关主键,确认 BDS 根目录值指向C:\Program Files (x86)\Embarcadero\Studio\22.0。这里有冲突路径时,修正后重新打开安装器就会识别出来。
4.2 安装过程顺利但控件面板没有 DevExpress 项
现象:安装向导全程正常走完,没有任何报错,但打开 Delphi 11 的工具面板,翻遍所有分类也找不到 TcxGrid、TcxButton、TcxTextEdit 这些控件。
原因:安装器把文件写进了磁盘,但没有成功完成 IDE 包注册。这种情况在 UAC 弹窗被忽略或权限不足时最常出现,表现为“文件到位、注册没到位”。
解决:打开 Component > Install Packages,看已安装包列表里是否存在 DevExpress 条目。没有就点击 Add,进入 DevExpress 的 Library 目录下对应 Delphi 11 的文件夹,手动选择 dclcxGrid、dclcxEditors、dclxLib 等关键设计期包,添加后确认。如果加载过程中提示找不到模块,参考下一条处理。
4.3 加载包提示 Can't load package 找不到指定模块
现象:在 Install Packages 中点 Add 后,IDE 弹窗显示 can't load package,后面跟着一个 bpl 文件名,但文件明明存在于磁盘上。
原因:设计期包依赖的若干运行期包没有同时被加载,或者搜索路径里存在旧版 DevExpress 的 bpl,导致 IDE 加载新包时优先找到了旧依赖。这是版本混装最典型的现场。
解决:先关掉 Delphi,打开系统环境变量或 IDE 的 Library Path,把所有指向旧版 DevExpress 目录的路径删掉。然后清理 IDE 缓存目录中对应 22.0 的缓存文件夹,重启 IDE,重新执行第 3.2 节的包注册步骤。注意,加载顺序在 Install Packages 里是可以调整的,把 DevExpress 的基础包如 dxSkinsCore、dxBar 排在前面,再加载 dcl 开头的设计期包。
4.4 老工程迁移后提示重复定义或找不到 dx 单元
现象:原本在 Delphi 10.4 上正常编译的工程,切到 Delphi 11 后编译报错,提示某个 dx 开头的单元重复定义,或者找不到某个 cx 开头的源文件。
原因:工程文件的搜索路径里还残留旧版本 DevExpress 的目录,Delphi 11 编译时会同时看到旧版.dcu和新版.dcu,两个包里的同名单元发生冲突。这种错不是 20.2.6 本身的问题,是路径污染。
解决:打开 Project > Options > Delphi Compiler > Searching Path,把旧版 DevExpress 相关目录全部移除,只保留 20.2.6 对应的 Library 目录。然后执行 Project > Build,清理工程目录下的旧.dcu文件后重新编译。我习惯在迁移前先复制一份工程,专门用来做路径清理实验,这样即使改错了也不影响原工程。
5. 验证安装:用 TcxGrid 跑通一个最小 VCL 工程
安装成功不等于能用。判断一套 VCL 控件包是否真的可用,我会新建一个最小工程,放一个最常用的控件,编译一次通过,才算真正落地。TcxGrid 是 DevExpress VCL 里最重型也最常被用到的控件,用它做验证性价比最高:编译通过,说明绝大多数套件依赖都已正常注册。
5.1 新建工程并放置 TcxGrid:把“安装成功”变成“能用”
打开 Delphi 11,新建 VCL Application,在表单上放置一个 TcxGrid。双击网格,DevExpress 会自动生成一个 cxGrid1DBTableView1 视图。此时在 Object Inspector 里可以看到 DataController 节点,这个对象负责网格的取数逻辑。下面的代码是最小验证单元,它把数据控制器和一个空的 DataSource 挂接起来,再调用 CreateAllItems 自动创建列。
unit Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxContainer, cxEdit, dxSkinsCore, dxSkinscxPCPainter, cxClasses, cxCustomData, cxData, cxDataStorage, cxDBData, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGridLevel, cxGrid, cxGridCustomView; type TForm1 = class(TForm) cxGrid1: TcxGrid; cxGrid1DBTableView1: TcxGridDBTableView; cxGrid1Level1: TcxGridLevel; procedure FormCreate(Sender: TObject); private FDataSource: TDataSource; public end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // DevExpress 网格取数入口是 DataController,不是直接操作 View FDataSource := TDataSource.Create(Self); FDataSource.DataSet := nil; // 把 DataSource 挂到当前 View 的 DataController 上 cxGrid1DBTableView1.DataController.DataSource := FDataSource; // 自动按数据集的字段创建列;DataSet 为空时只建空白结构 cxGrid1DBTableView1.DataController.CreateAllItems; end; end.这段代码里最关键的两行是DataController.DataSource := FDataSource和CreateAllItems。前者把标准 VCL 的数据源组件接入 DevExpress 的数据控制层,后者根据数据集的字段集合自动生成网格列。如果编译通过,说明控件的设计期包和运行期包都已正确装入 IDE,而不是只装了文件没注册。
如果这一步编译失败,报错信息多半和 dcl 包或 dcufiles 有关,直接回到第 4 章的排查路径里对号入座。注意,这个工程本身没有任何业务数据,它只验证控件链条是否完整。
5.2 核对依赖链与 BPL 版本
编译通过后,还可以再做一层验证:观察生成的 exe 依赖的 DevExpress BPL。常见做法是打开 Project > Deployment,勾选“自动部署运行期包”,然后在输出目录里看列出了哪些 bpl。下表列出最常出现的关键依赖及其作用,便于对照排查。
| BPL 名称 | 作用 | 验证点 |
|---|---|---|
| dxSkinsCore | 皮肤绘制基础库 | 缺失时启动程序报找不到 dxSkinsCore.bpl |
| dxBar | 工具栏与菜单支持库 | 使用 TdxBarManager 时依赖 |
| cxGrid*.bpl | 网格运行期库 | 包含 cxGrid 系列单元 |
| cxEditors*.bpl | 编辑器控件运行期库 | 使用 TcxButton、TcxTextEdit 时依赖 |
运行时最容易出的问题不是控件面板,而是 exe 拷到另一台机器后提示“找不到 dxSkinsCore.bpl”。解决办法很简单:把第 3.2 节公共目录里的运行期 bpl 和 exe 放在同一目录,或者启动前注册到目标系统的路径里。多数维护项目采用前者,简单直接,也方便回滚版本。DevExpress 版本升级时,BPL 文件名通常不变,但文件版本不同,混放会引发运行时错误,所以我在团队里强制要求公共目录按版本号建子目录,不允许直接丢根目录。
6. 进阶用法:把 full source 源码副本做成一劳永逸的调试基础
把安装包里的 Source 目录整体归档到独立目录,这是我对 full source 版最推荐的一步操作。安装目录受卸载程序控制,哪天机器重装或者卸载时误删,源码就找不回来了。我一般用 robocopy 把源码复制到非系统盘项目目录,然后把这个目录加入 IDE 的 Library Path。
robocopy "C:\Program Files (x86)\DevExpress\VCL\Source" "D:\DevExpressSource\20.2.6" /E /R:2 /W:2参数/E表示复制所有子目录包括空目录,/R:2表示失败重试两次,/W:2表示失败后等待两秒。robocopy 的退出码 0 到 7 都算成功,不需要在批处理里用if errorlevel去判断。源码归档后,在 Delphi 11 的 Tools > Options > IDE > Library 里把D:\DevExpressSource\20.2.6添加到 Library Path 的顶部,这样当你按 F7 跟踪进控件内部方法时,IDE 会直接打开这份源码,而不是进入没有调试信息的黑匣子。
这个习惯来自一次教训。我最开始装这套包时,图省事把安装包留在临时目录,后来系统盘清理时顺手删了。两个月后要改 cxGrid 的绘制细节,发现源码目录已经不存在,只能重新找安装包解压再对比。从那以后,我每次装完 DevExpress VCL 都会强制走一遍“归档源码、统一 BPL 目录、新建验证工程”这三步,已经养成习惯。希望帮到你。
本文还有配套的精品资源,点击获取