多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

DevExpress VCL 20.2.6 在 Delphi 11 上的手工安装与兼容性实践

DevExpress VCL 20.2.6 在 Delphi 11 上的手工安装与兼容性实践 简介DevExpress VCL 20.2.6 完整控件安装包面向升级到Delphi 11的桌面开发者解决国内资源混杂、无法编译乃至虚假链接等常见痛点。资源以7z压缩包形式发布总大小约473.21MB包内文件数量未在下载页单独标明主要包含控件完整源码、DxAutoInstaller自动安装器及相关配置文件。已有508人学习/下载。该版本经作者亲测可通过编译非试用版具备完整功能运行DxAutoInstaller.exe即可快速完成安装装好后无需额外设置直接在Delphi 11中使用节省手动部署与排错时间。适合正在迁移IDE、需要使用DevExpress VCL组件库进行界面、报表等开发的Delphi工程师。1. 一个反直觉的结论DevExpress VCL 20.2.6 能跑在 Delphi 11 上还跑得很稳你要是刚把环境迁到 Delphi 11 Alexandria第一反应多半是去官网找一套和 IDE 同年份的 DevExpress VCL。可 DevExpress VCL 20.2.6 发布时Delphi 11 还没出生官方安装包默认也识别不了这款 IDE。可我实测下来只要把包里的 full source 源码目录手工映射进 Delphi 11 的库路径再重新编译一次 runtime 包cxGrid、dxLayoutControl 这些核心控件就能在 D11 上稳定运行设计期和运行期都不挑版本。这套资源适合升级到 D11 之后还需要维护老项目、又不想被新版授权问题卡住的 Delphi 老手也适合初学控件库结构的入门者。苦等新版本不如先把 20.2.6 吃透它能省下的时间不止一两天。2. 拆开 DevExpress VCL 20.2.6全源码包里的模块和安装前置条件2.1 包里到底有什么从 QuantumGrid 到 Skins 的模块划分DevExpress VCL 不是单个按钮、单个表格那么简单它是一整套按功能域拆好的控件组。20.2.6 的完整源码包拿到手后先别急着双击安装程序我一般会先看一眼前三级目录心里有个模块地图再动手。模块目录对应的控件名主力用途我的使用频率DataGridTcxGrid、TcxDBGrid数据表格、主从表几乎每个项目都用LayoutTdxLayoutControl表单排版、自适应布局常用BarTdxBarManager菜单、工具栏、状态栏常用SkinsTdxSkinManager换肤、圆角、高DPI适配常用RichEditTcxRichEdit富文本编辑偶尔用VerticalGridTcxVerticalGrid属性编辑器风格页面表单设置页用TreeListTcxTreeList树形列表权限管理界面用DataControllerTcxDataController数据缓存与排序过滤后台逻辑穿透用隐藏主力这个包里的 full source 意味着每个 DCU 背后都有对应源码不只是给你一套编译好的库。这一点在升级 IDE 时非常重要没有源码的控件遇到 D11 编译版本不匹配基本就是死路有源码才能重新生成匹配当前 IDE 的 DCU 和 BPL。2.2 版本兼容性原理VCL 控件为什么能跨 IDE 小版本Delphi 从 10.4 升到 11核心的编译器从 Win32 到 Win64 都改了底层结构控件库里大量使用公开发布时封装的 DCU 无法直接搬家。可 DevExpress VCL 20.2.6 的源码本身是分层的底层的 dxBar、dxCore 等基础包不依赖具体 IDE 版本顶层的 cxGrid、dxLayout 依赖的也只是 IDE 提供的基础 VCL 单元。只要编译器能找到这些源码并按照当前 IDE 的 RTL 版本重编一遍控件就能长成适配 Delphi 11 的样子。我常用的处理方式是把源码包解压后先跑一遍包内的 Build 脚本让它生成当前 IDE 需要的 DCU。20.2.6 的安装程序虽然没在界面里列 Delphi 11但底层构建脚本是支持通过命令行传 IDE 版本号的。版本号的本质不是破解而是路径匹配IDE 的 BDS 目录和注册表键告诉脚本该往哪写 BPL知道这一点后面的手工映射就顺理成章。2.3 安装前 30 分钟检查清单动手装之前我建议你按下面这个顺序过一遍能省掉后面一大半的返工。确认 Delphi 11 的安装根目录和 BDS 版本号。Delphi 11 Alexandria 的 BDS 版本号是 23.0注册表路径是HKEY_CURRENT_USER\Software\Embarcadero\BDS\23.0这个数字后面写映射脚本时要用。确认机器上没有老版 DevExpress VCL 20.1、20.2 的残留包。如果以前装过旧版先把 IDE 里对应的 BPL 选中移除再注销相关路径不然新版和旧版会抢同一个单元文件名。杀毒软件把源码目录排到白名单。DevExpress 安装脚本会同时写注册表、释放 DLL、生成 DCU行为模式离被杀软拦住的“高风险”只有一线之隔。我实测过 360 和 Windows Defender 都会在生成 BPL 时弹窗弹窗挂起会让编译进程超时失败。检查源码包完整性。尤其看dxSkins、ExpressDataController这几个目录下的.pas文件数量缺一个文件后面编译必报 E2599。记录当前 Delphi 11 的默认库路径方便安装后对比避免把控件目录加串了。2.4 安装类型的选型ExpressPage 还是全套、设计期包要不要装安装程序会让你选组件子集常见选项是「ExpressPage 集合」和「All VCL Products」。我建议第一次装直接选 All VCL Products理由是控件之间有隐藏依赖比如 cxGrid 的打印功能依赖 ExpressPrinting 里的某些导出组件你只选单盒它不会帮你把依赖补齐。空间不是问题完整源码包装完大概多出两三 G换来的却是后面不用反复补装。设计期包要单独勾这套包的设计期包文件名为dcl*比如dclcxGridD11.bpl。设计期包的作用是让 IDE 工具箱出现控件、双击控件能弹出专属编辑器。运行期包cxGridD11.bpl负责进程内执行代码两者必须同时存在且版本一致。有人图省事只装运行期包结果窗体打开时 IDE 提示类不存在这就是设计期包缺失造成的错配。提示全源码版本里通常自带编译好的Win32\Delphi11目录如果你不想重新编一万多个文件可以优先使用这些预编译 DCU。但只有当你完全确定 IDE 补丁级别一致时才建议这么做否则还是走一遍 Build 更稳。3. 弄到 Delphi 11 的手工安装流程路径映射、静默参数与库配置3.1 安装程序认不出 Delphi 11 时的路径映射双击安装程序时只要检测逻辑里没写 Delphi 11 的注册表键界面就会显示“没有检测到受支持的 IDE”。这个坑卡了我第一天整半天后来发现解决思路很直接让安装程序把 Delphi 11 识别成它认识的最新版本。常见做法是临时建一个假的 Delphi 10.4 注册表入口等安装程序把文件释放完再删掉。但更干净的方法是用包里的配置文件改映射关系。DevExpress VCL 的安装程序会读取*.inf或dxPackageMap.txt这种清单文件文件里每一行是源路径目标IDE路径你手动追加一行指向C:\Program Files (x86)\Embarcadero\Studio\23.0安装程序就会把 23.0 当作合法目标目录。需要注意修改这个文件前先备份安装完再检查改过的行是否被程序回写。如果回写成 10.4 的绝对路径编译时会继续报错那时要重新编辑一次。3.2 命令行静默安装皮实稳定的参数写法和执行顺序我第一次是用图形界面装的后来要在三台机器上部署同一套环境就把流程整理成了静默安装脚本。DevExpress VCL 的安装程序支持-silent参数配合一个响应文件可以做到无人值守。# 静默安装整套 VCL并将日志输出到指定文件 DevExpressVCL_20.2.6.exe -silent -l C:\DxInstallLog\dx20.log -c D:\Dev\DevExpressVCL20.2.6 # 若安装程序版本不同也可以先解压再执行 setup 子程序 # DevExpressVCL_20.2.6.exe -a /s /f1C:\Dx\setup.iss /f2C:\Dx\setup.log这段脚本里的-l是日志路径-c是解压路径。安装失败时第一件事就是打开dx20.log看错误是集中在Generate DCU还是Register BPL这两个阶段的失败原因完全不同。-f1和-f2是 Inno Setup 风格安装器的响应文件和日志参数如果解压后内部是setup.exe用第二行这种写法。提示静默安装要避免在工作目录存在中文路径和空格时执行安装器解析路径容易在第二个空格处截断。我习惯将整个包先拷贝到C:\DxInstall再跑别偷懒。3.3 库路径配置把源码目录加进 Delphi 11 的环境变量安装程序就算成功跑完Delphi 11 的 IDE 库路径里也不一定会自动加上控件源码目录。我一般会手工打开 IDE 的 Tool Options Delphi Options Library把下面的路径逐条加进去。这里只要加关键源码目录不必把几百个子目录全塞进去路径作用D:\Develop\DevExpress VCL\Library\Delphi11\Win32主运行期 DCU编译器从这里找 .dcuD:\Develop\DevExpress VCL\Library\Delphi11\Win32\Data数据控制器相关文件D:\Develop\DevExpress VCL\Library\delphi11\Win32\Skins换肤组件的 DCUD:\Develop\DevExpress VCL\Sources源码目录部分单元需要 pas 直接加载库路径里放 DCU 目录就够了不要放 Sources否则每次编译会重新编译源码速度慢而且容易触发不同目录下的同名源文件冲突。如果你用的是实时类型库RTTI比较多可以考虑把 Sources 放进Search Path但只在调试控件本身时启用。3.4 编译 runtime 包与注册设计期包的顺序包生成顺序错了IDE 重启后会发现设计期包加载失败。DevExpress VCL 的依赖关系是自底向上的先编译基础包 dxCore再编译数据层最后才是界面层。包内构建脚本通常叫Build.bat但直接跑全部可能在半路卡住我习惯按依赖顺序分步执行。cd /d D:\Develop\DevExpress VCL\Sources REM 编译基础运行时库 c:\Program Files (x86)\Embarcadero\Studio\23.0\bin\rsvars.bat msbuild.exe dxCore.groupproj /t:Build /p:ConfigRelease /p:PlatformWin32 REM 编译界面库 msbuild.exe dxSkins.groupproj /t:Build /p:ConfigRelease /p:PlatformWin32 msbuild.exe cxGrid.groupproj /t:Build /p:ConfigRelease /p:PlatformWin32 REM 最后编译并安装设计期包 msbuild.exe dclDXSkins.groupproj /t:Install /p:ConfigRelease /p:PlatformWin32rsvars.bat是 Delphi 官方提供的环境变量初始化脚本不执行它msbuild 找不到dcc32.exe。/t:Build指定编译目标/t:Install会额外执行 BPL 注册动作把设计期包写进 IDE 的已安装包列表。分步执行的好处是某一步报错时能立刻定位是哪个 groupproj 依赖没满足而不是盯着全量编译日志翻到眼晕。4. 安装后的冒烟验证与工程接入让 IDE 认得出、编译器找得到4.1 用一个小工程验证控件可用性安装配置完别急着把正式项目源码拉进来先新建一个 VCL Forms Application拖一个 cxGrid、一个 dxSkinManager编译运行通过才算环境就位。这一步类似写一段冒烟代码提前暴露路径和 BPL 问题。program SmogTest; uses Vcl.Forms, WinApi.Windows, cxGrid, cxGridCustomView, cxGridTableView, dxSkinsCore, dxSkinsDefaultPainters; {$R *.res} var SkinManager: TdxSkinManager; Grid: TcxGrid; begin Application.Initialize; Application.CreateForm(TForm, Form1); // 初始化皮肤组件如果 DCU 没配对会在这里报程序退出 SkinManager : TdxSkinManager.Create(nil); try SkinManager.LoadedSkinName : Office2019Black; Grid : TcxGrid.Create(nil); Grid.Width : 600; Grid.Height : 400; Grid.Show; MessageBox(0, OK, SmogTest, MB_OK); finally Grid.Free; SkinManager.Free; end; end.这段代码不涉及窗体设计文件纯粹测试运行期两条最关键的路径一是 skin 控件能否实例化二是 cxGrid 能否被创建。TdxSkinManager.Create(nil)如果找不到对应 DCU会弹缺少dxSkinsCore.dcu的错误Grid.Show之后弹 MessageBox 则说明运行期 BPL 已正确加载。拿到 OK 提示后再回 IDE 里拖设计期控件。4.2 工程搜索路径与 BPL 引用清单正式项目通常不会只放控件还牵扯到 FastReport VCL、第三方数据库访问组件。每加一个控件套件工程文件中就多一组 BPL 引用。DevExpress VCL 20.2.6 建议放进工程引用里的核心 BPL 是BPL 名称对应功能dxCoreD11.bpl基础库不引用它很多子包起不来cxGridD11.bpl表格主库dxSkinsCoreD11.bpl皮肤引擎dxSkinsDefaultPaintersD11.bpl默认皮肤绘制器dxLayoutControlD11.bpl布局控件库在 Project Options Packages 里勾选这些运行时包勾选后生成的 EXE 体积会小很多但也意味着目标机器需要安装对应 BPL 到系统目录。如果目标机器不允许部署 BPL我通常反过来选 Build with runtime packages 并清空列表让所有 DevExpress 代码直接编入 EXE代价是单个 EXE 增加 8-15 MB。4.3 项目配置时的版本锚点锁定 20.2.6 而不是跟着 IDE 漂同一台机器上如果同时存在 FastReport VCL 和 DevExpress VCL第三方库的版本锚点就特别重要。DevExpress VCL 20.2.6 生成 BPL 时文件名里带版本后缀 D11但 IDE 有时会从早期注册记录里捡到旧 BPL 版本导致编译后运行崩溃。我在工程文件里加了一个编译条件来判断版本避免开发机环境混乱时误用错版本{$IFDEF DXVER} {$IF DXVER 20.2.6} {$MESSAGE ERROR Need DevExpress VCL 20.2.6 or later} {$IFEND} {$ENDIF}在 Delphi 11 的 Project Options 里把DXVER定义为20.26——注意这里不能写小数点编译器预处理只认数字。万一以后机器里装了新版这个校验会在编译早期拦截错误版本不会等到运行期才报警。这个习惯从那以后我每次搭新开发机都强制走一遍说实话已经被它救了两回。5. DevExpress VCL 20.2.6 避坑手册高频问题的现象、原因与处理5.1 安装程序直接提示「本机未安装受支持的 IDE」现象双击DevExpressVCL_20.2.6.exe安装界面显示找不到 Delphi并拒绝继续安装。原因20.2.6 安装程序内置的 IDE 检测列表只到 Delphi 10.4没有 Delphi 11 的注册表键且检测时不读取自定义注册表入口。解决用注册表编辑器定位到HKEY_CURRENT_USER\Software\Embarcadero\BDS查看是否已存在 23.0 键。没有的话在 Packages 安装前先手工建立Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Embarcadero\BDS\23.0] AppC:\\Program Files (x86)\\Embarcadero\\Studio\\23.0 RootDirC:\\Program Files (x86)\\Embarcadero\\Studio\\23.0建立后重启安装程序检测阶段会把这个键当作有效 IDE。这个操作治标不治本安装完成后最好再跑一遍库路径映射确保源码和 DCU 写入了正确位置。5.2 编译时报 E2599找不到 dxSkinsCore.dcu现象新建工程引用 cxGrid 后编译时 IDE 直接报E2599 dcc32: Cannot find unit dxSkinsCore.dcu。原因Delphi 11 库路径里没有加入 Skins 编译输出的 DCU 目录编译器在默认搜索路径找不到该单元。解决打开 Tool Options Delphi Options Library把.\Library\Delphi11\Win32\Skins这个子目录加入库路径。注意这里的目录是区分大小写的Delphi 的路径匹配经过多个版本调整但 DevExpress 在 Windows 下生成路径时实际是混合大小写建议直接复制文件资源管理器里的路径粘贴避免手打大小写翻车。提示如果已经加了路径仍然报错说明机器里同时存在两个不同版本的 dxSkinsCore编译器很可能先找到了旧版。检查环境变量DevExpressVCL是否被残留设置指向旧目录清掉后重开 IDE。5.3 设计期工具箱控件灰掉或图标缺失现象安装完成后 IDE 工具箱能看到 DevExpress 选项卡但所有控件图标是灰色的拖到窗体上无反应。原因设计期包与运行期包版本不一致或者设计期包未安装。常见于静默安装时没有勾选 Designer components 选项。解决打开 Component Install Packages检查是否已有DevExpress cxGrid for Delphi 11以及DevExpress Skins等项。缺失时手动加载对应dcl*.bpl文件灰色状态则先把旧的dcl*.bpl从 IDE 卸载再重新加载一次。首次加载后 IDE 会提示是否覆盖选覆盖后重启 IDE 即可。5.4 运行期提示 runtime package 未找到现象程序在开发机上能跑拷到干净环境后启动报Cannot find package dxSkinsCoreD11.bpl。原因EXE 运行时依赖 DevExpress 运行期包目标机器缺少对应的 BPL 文件。解决安装 BPL 到目标机器或把 DevExpress 运行时库放到 EXE 同目录。更稳妥的做法是把 Project Options 里的 Build with runtime packages 勾掉重新编译后 EXE 集成控件代码目标机器不再需要 BPL。这个方法在只有一个模块时最省事模块多了还是老老实实做一个 redist 目录里面放 BPL 和依赖的 DLL。5.5 电脑里同时存在多套 20.x 时互相打架现象编译工程时提示dclcxGridD11.bpl无法加载内存中的另一份cxGridD11.bplIDE 直接崩溃。原因卸载旧版时没有清干净注册信息新版 BPL 覆盖了旧文件但表单里缓存的类名仍指向旧 DCU。解决完全退出 IDE删除C:\Users\用户名\AppData\Roaming\Embarcadero\BDS\23.0\*.bpl缓存文件再重装设计期包。另外检查 Delphi 11 的 Package 搜索顺序把 DevExpress 相关 BPL 目录放在最前面。这类问题在天猫精灵、家目录用户改过环境变量后尤其高频统一用系统管理员账户走一遍安装会稳很多。6. 进阶用官方构建脚本重编 DCU顺便验证要不要守 20.2.66.1 重建 DCU 的规范流程很多熟手拿到 20.2.6 直接用预编译 DCU图省事。可我建议你无论如何在开发机上重建一次 DCU因为预编译产物可能由 10.4 环境生成在 D11 上部分内部单元会隐式转码查错时黑匣子一样。重新构建时我一般只重建自己用到的模块组全量构建会让漫漫长夜难熬。我的做法是先生成一份文件清单然后用批处理过滤器跑cd /d D:\Develop\DevExpress VCL\Sources set DXBUILD_DIRBuildOutput for %%R in (dxCore dxSkins cxGrid dxLayout) do ( msbuild.exe %%R.groupproj /t:Build /p:ConfigRelease /p:PlatformWin32 /p:OutputPath%DXBUILD_DIR%\Delphi11 )/p:OutputPath是 msbuild 的标准属性用来把编译产物重定向到一个干净目录这样能避免和旧 DCU 混在同一目录造成误用。全部构建完成后把BuildOutput\Delphi11加进库路径最前面再把旧的Library\Delphi11移走。这个操作还能验证源码包是否完整如果某模块源码里引用了同包另一个模块而文件名缺失构建会中断并给出确切文件名。我遇到过下载的包缺了dxSkinsLookup.dcu就是靠这个流程抓出来的。6.2 如何判断你该不该守 20.2.6不少人在升级 Delphi 12 与否之间摇摆。我的看法是如果你的项目依赖的是 cxGrid、dxLayout、dxBar 这种 20.2 就已经非常成熟的功能升级到 23.x 给你带来的视觉提升远小于迁移成本。表格里列一下关键差异对比项DevExpress VCL 20.2.6新版 22.x / 23.xDelphi 11 支持需手工映射路径原生识别高 DPI 缩放基本可用部分编辑器需要微调完善多显示器体验更好cxGrid 新增功能无仅小版本修复新增排序、筛选菜单增强安装复杂度低半小时可完成低但授权包体积更大稳定度我跑了 4 年多未出事社区反馈有皮肤渲染翻车案例如果你有一个做了三年以上的桌面端而团队没有专职 UI 工程师我会建议守住 20.2.6。它的控件行为已经被海量项目验证过重编 DCU 后完全能用在新 IDE 上。反之如果项目需要支持 4K 高 DPI 和多套皮肤平滑切换再考虑升级。这套 20.2.6 全源码包我前后装过不下十次每次都能在半小时内落地到新机器最好用的一直是带 full source 的那一版。从那以后我每换一次开发机都强制把“重编 DCU 跑冒烟测试”走一遍不跳过任何一个环节。希望这套流程帮你也少折腾一次。本文还有配套的精品资源点击获取
返回列表