简介:面向已升级至 Delphi 11、需要为原有工程补齐第三方界面控件库的开发者,这份 DevExpress VCL 20.2.6 完整源码安装包可解决国内资源版本混杂、下载后无法编译的痛点。包内以 7z 压缩,体积约 473.21MB,核心为可直接运行的 DxAutoInstaller.exe 安装程序及配套源码组件,省去手工配置搜索路径与环境变量的繁琐环节,装完即可在 D11 中调用。资源标签涵盖 DevExpressVCL、fullsource 与 Delphi11,适合具备一定 VCL 开发经验、希望快速恢复既有项目界面层的中高级程序员。目前已有 520 人浏览学习,说明该版本在升级迁移场景中具备一定参考价值。对于正被控件兼容性问题困扰、又不愿在多个来源间反复试错的读者,这份亲测可用的安装包能显著缩短环境搭建时间,把精力留给业务代码本身。
1. DevExpress VCL 20.2.6 装到 Delphi 11:一份能直接复现的控件包落地记录
上周有个做桌面管理系统的朋友找我,说他手上一个老项目要从 Delphi 10.2 迁到 Delphi 11,界面里几十个表格、树、报表全靠 DevExpress VCL 撑着,结果新环境一编译就报找不到单元,重装控件包又卡在编译阶段。这类场景其实很典型:DevExpress VCL 20.2.6 这个版本的 fullsource 安装包,官方支持范围正好覆盖到 Delphi 11,源码完整、非试用版,装好之后 VCL 控件库、编辑器、报表、皮肤这些模块都能正常编译进项目。它解决的不是“要不要用第三方控件”的问题,而是“老项目升级 IDE 后控件包怎么重新落地”的问题。适合手上维护 Delphi 桌面项目、需要完整源码可控、又不想被试用版水印和功能限制卡住的从业者。下面按我实际拆包、编译、排错的顺序讲,参数和坑都落到具体位置。
2. 拆包与目录结构:fullsource 包到底给了什么
拿到一个 fullsource 版本的控件包,第一件事不是急着点安装程序,而是先把目录结构和编译产物看清楚。DevExpress VCL 的 fullsource 包和试用版的差别,核心就在“源码是否完整、是否带编译脚本、是否区分 IDE 版本”。20.2.6 这个版本对应 Delphi 11 的编译目标,包内一般会按模块和 IDE 版本分目录,理解这套组织方式,后面编译报错才知道去哪找。
2.1 包内模块划分与源码目录
常见的目录组织是这样的:根目录下有Library、Packages、Sources、Help、Bin这几类。Sources下按功能模块再分,比如cxLibrary(基础库)、cxGrid(表格)、cxTreeList、cxEditors(编辑器)、cxScheduler(日程)、cxReports(报表)等,每个模块里是.pas源码和.dcr资源。Packages下是按 IDE 版本分的.dpk/.dproj工程文件,Delphi 11 对应的是带D28或Delphi11标识的那一组(不同小版本命名略有差异,以包内实际为准)。
我一般先做一次目录清点,确认三件事:源码目录是否完整(有没有缺模块)、Packages 下是否有对应 Delphi 11 的工程、Bin 下是否有预编译的.bpl。如果 Bin 里已经有对应版本的 bpl,说明这个包是“源码 + 预编译”双份,安装会快很多;如果只有源码,那就得自己走一遍编译流程。这一步用资源管理器看就行,不需要工具。
提示:fullsource 包体积通常比试用版大不少,解压后如果发现某个模块目录是空的或者只有
.dcu没有.pas,那大概率是包不完整,别往下装,先换包。
2.2 版本对应关系:20.2.6 与 Delphi 11 的匹配点
版本匹配是这类控件包最容易翻车的地方。DevExpress VCL 的版本号和 Delphi 编译器版本是两套体系:20.2.6 是控件库版本,Delphi 11 的编译器代号是 D28(对应$(BDS)下的 22.0 目录)。安装包能不能用,取决于它有没有为 D28 准备好包工程和编译条件。
判断方法很直接:打开Packages下对应目录的.dproj,看<ProjectVersion>和DCC_Define里有没有VER360(Delphi 11 的条件符号)之类的定义;再看Sources里有没有针对新编译器的条件编译分支。20.2.6 这个版本在源码里对 Delphi 11 的支持是有的,但个别老模块可能还留着旧条件,编译时会暴露出来,这就是后面排错章节要处理的东西。
| 检查项 | 位置 | 合格标准 |
|---|---|---|
| 源码完整性 | Sources 各模块目录 | 每个模块有 .pas 与 .dcr |
| IDE 工程 | Packages 下 D28/Delphi11 目录 | 存在 .dpk 与 .dproj |
| 预编译产物 | Bin 目录 | 有对应版本 .bpl(可选) |
| 条件符号 | .dproj 的 DCC_Define | 含 VER360 等新版本符号 |
这张表我每次装新包都会过一遍,五分钟的事,能省掉后面半小时的编译报错排查。
2.3 安装前的环境准备清单
动手之前,环境要清干净。Delphi 11 的 IDE 里如果之前装过旧版 DevExpress,必须先卸载干净:IDE 里Component > Install Packages把旧的 DevExpress 包全部 Remove,再到注册表HKEY_CURRENT_USER\Software\Embarcadero\BDS\22.0\Known Packages下把残留的 DevExpress 路径删掉,最后把$(BDS)\bin下旧的dcl*.bpl和dcu目录清掉。这一步不做,新包编译出来的 bpl 和旧的设计期包冲突,IDE 启动就报“找不到序数”或者加载失败。
另外确认 Library Path 里没有指向旧版源码目录的条目,编译输出目录($(BDS)\Dcp、$(BDS)\bin)有写权限。环境干净了,后面编译成功率会高很多,这是血泪经验。
3. 编译与安装:从源码到 IDE 里能拖控件
环境清干净之后,进入正题:把源码编译成设计期包(design-time package)和运行期包(runtime package),再注册进 IDE。DevExpress VCL 的包分两层,运行期包给应用程序链接,设计期包给 IDE 加载控件面板,两者都要编。顺序不能乱,先运行期后设计期。
3.1 用命令行编译运行期包
图形界面一个个点工程太慢,我一般用msbuild批量编。Delphi 11 自带的 msbuild 在$(BDS)\bin下,配合.dproj直接编。先编基础库,再编依赖它的模块,顺序按包内Packages目录的编号来(一般有cxLibrary在前)。
# 进入 Delphi 11 的 bin 目录,用其自带的 msbuild cd "C:\Program Files (x86)\Embarcadero\Studio\22.0\bin" # 编译基础运行期包,Release 配置,输出到统一目录 msbuild "D:\DevExpress\Packages\D28\cxLibrary_R.dproj" ^ /p:Config=Release ^ /p:Platform=Win32 ^ /p:DCC_ExeOutput=D:\DevExpress\Output\bpl ^ /p:DCC_DcuOutput=D:\DevExpress\Output\dcu # 依次编译表格、编辑器等依赖模块 msbuild "D:\DevExpress\Packages\D28\cxGrid_R.dproj" /p:Config=Release /p:Platform=Win32 msbuild "D:\DevExpress\Packages\D28\cxEditors_R.dproj" /p:Config=Release /p:Platform=Win32这里几个参数要说明:Config=Release编优化版,调试期可以先用Debug确认没问题;Platform=Win32要和你的目标程序位数一致,64 位项目要另编Win64;DCC_ExeOutput和DCC_DcuOutput把 bpl 和 dcu 集中到一个目录,方便后面统一加 Library Path,避免散落在各处找不到。编完检查输出目录里有没有对应的.bpl和.dcp,缺了就是某个模块没编过,看 msbuild 的报错行号定位。
3.2 设计期包的注册与 Library Path 配置
运行期包编完,编设计期包(一般带_D后缀,如cxLibrary_D.dproj),设计期包会引用运行期包,所以顺序不能反。编完之后要在 IDE 里注册:Component > Install Packages > Add,选中编出来的dcl*.bpl。注册成功后控件面板会出现 DevExpress 页签。
Library Path 要加上前面DCC_DcuOutput指向的目录,以及源码根目录(有些项目直接引用源码编译,不走 dcu)。在Tools > Options > Language > Delphi > Library里,把D:\DevExpress\Output\dcu和D:\DevExpress\Sources加进去,注意放在系统路径之前,避免和旧版冲突。
// 验证安装是否成功:新建一个 VCL 窗体,放一个 cxGrid 并编译 procedure TForm1.FormCreate(Sender: TObject); begin // 能正常创建说明运行期包链接成功 cxGrid1.CreateGrid(0); cxGrid1.Levels[0].Grid.OptionsView := cxGrid1.Levels[0].Grid.OptionsView + [gvIndicator]; end;这段代码的作用是验证运行期包真的被链接进来了:CreateGrid创建列视图,OptionsView加指示列,编译通过且运行不报“找不到类”,说明 bpl 和 dcu 路径都对。如果编译报Unit cxGridDBTableView not found,回去查 Library Path 顺序和 dcu 输出目录。
3.3 一个最小工程的链接验证
装完别急着上大项目,先建一个最小 VCL 工程做链接验证。新建 Application,拖一个cxGrid、一个cxTextEdit、一个cxTreeList,编译成 Win32 和 Win64 各一次。Win64 这一步很多人漏掉,结果 32 位能跑、64 位一编就报找不到 bpl,原因就是只编了 Win32 的运行期包。验证时把Project > Options > Packages里 “Link with runtime packages” 打开,确认运行期包名列表里有 DevExpress 的项。
注意:最小工程验证通过之前,不要往正式项目里合并,否则报错来源分不清是控件包问题还是项目自身问题。
4. 避坑与排查:五条装控件包时真踩过的坑
这一章是我这些年装 DevExpress VCL 攒下来的翻车记录,每条都按“现象 → 原因 → 解决”写,照着对号入座能省不少时间。
4.1 编译报“找不到 System.SysUtils”之类的系统单元
现象:msbuild 编运行期包时,报一堆系统单元找不到,明明 IDE 里能编。原因:命令行 msbuild 没有加载 IDE 的环境变量,$(BDS)和框架路径没解析。解决:在$(BDS)\bin目录下执行,或者先跑rsvars.bat设置环境变量再 msbuild。我一般写个批处理,第一行call "C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\rsvars.bat",后面再跟编译命令。
4.2 IDE 启动报“Cannot load package dclcx... 找不到序数”
现象:装完设计期包,重启 IDE 弹框报加载失败,序数错误。原因:旧版 DevExpress 的 bpl 没清干净,新旧设计期包同时被注册,符号冲突。解决:按 2.3 的清单把Known Packages注册表项和$(BDS)\bin下旧 bpl 清掉,只保留新编的,重启 IDE 再注册。
4.3 控件面板有页签但拖控件报“Class not found”
现象:IDE 里能看到 DevExpress 页签,拖一个控件到窗体上,报类找不到。原因:设计期包注册了,但运行期包没进 Library Path,或者 dcu 版本和 IDE 编译器不匹配(比如拿了旧版 dcu)。解决:确认 Library Path 里 dcu 目录在前,且 dcu 是用当前 Delphi 11 编的;必要时删掉 dcu 目录重新编译,别混用不同 IDE 版本的 dcu。
4.4 Win64 编译通过但运行时报缺 bpl
现象:64 位程序编译没问题,一运行提示找不到某个 DevExpress bpl。原因:只编了 Win32 运行期包,64 位程序链接时找不到对应 bpl,或者部署时没把 bpl 拷到 exe 同目录。解决:用Platform=Win64重编一遍运行期包,部署时把Output\bpl下的 64 位 bpl 一起带上,或者干脆静态链接(关掉 runtime packages)。
4.5 皮肤/报表模块单独报条件编译错误
现象:基础模块都编过了,编到皮肤或报表模块时报VER360未定义或某条件分支语法错误。原因:个别老模块的源码条件编译没跟上新编译器,或者包内该模块的源码版本偏旧。解决:打开报错单元的源码,找到条件编译段,确认VER360分支存在;缺失的话按同目录其他模块的写法补上对应分支,或者确认这个模块是否必须(非必需可以先跳过,主库能跑起来再说)。
5. 进阶:把控件包做成可复用的部署基线
装一次控件包不算本事,能把它变成团队里可复用的部署基线才算落地。我的习惯是:编译输出目录固定、Library Path 用相对路径脚本化、部署清单单独维护。这样换机器、换人接手,照着脚本走一遍就行,不用再靠记忆点 IDE 菜单。
具体做法是写一个build_devexpress.bat,把 3.1 的编译命令按模块顺序串起来,输出统一到D:\DevExpress\Output;再写一个set_library_path.reg或者用 IDE 的-r参数加载预设的注册表配置,把 Library Path 一次性写进去。部署清单用一个文本文件列清楚:哪些 bpl 要随 exe 发布、哪些 dcu 要进编译路径、哪些是设计期专用不发布。
| 产物类型 | 用途 | 是否随程序发布 |
|---|---|---|
| 运行期 bpl | 程序运行时链接 | 是(动态链接时) |
| 设计期 bpl(dcl*) | IDE 控件面板 | 否 |
| dcu | 编译期引用 | 否 |
| dcp | 包编译中间产物 | 否 |
验证方法也简单:找一台没装过 DevExpress 的干净机器,按脚本走一遍编译 + 最小工程验证,能过就说明基线可用。我吃过一次亏,在自己机器上一切正常,换到同事机器上因为 Library Path 里有一条绝对路径指向我的 D 盘,直接编不过。从那以后我每次做控件包基线,都强制在一台干净环境上走一遍完整流程再交付。希望帮到你。
本文还有配套的精品资源,点击获取