ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

DevExpress VCL 18.1.6源码包安装编译与Delphi迁移实践指南

DevExpress VCL 18.1.6源码包安装编译与Delphi迁移实践指南

简介:DevExpress VCL 18.1.6 完整源码包,配套 DxAutoInstaller 自动安装器,面向使用 Delphi 7 至 Delphi 10.3 Rio 的桌面应用开发者。资源解决了在较新 IDE 中手动安装第三方组件库耗时易错的问题,尤其适合需要阅读底层实现、二次封装或进行组件定制的进阶开发者。压缩包为 rar 格式,整体约 352.14 MB,内部文件结构与类型清单暂未提供,但依据版本号与命名可确认包含 DevExpress VCL 全系列可视与非可视组件源码及自动安装脚本。已有 420 人学习/下载,适合正在构建复杂界面、报表或数据管理系统的 Delphi 项目组收藏备用。通过该资源可一次性获得常用 UI 控件、皮肤引擎、数据感知组件和安装工具的完整源码,便于离线环境快速部署、跟踪组件更新或按项目规范调整默认行为,也能为排查组件冲突、研究事件机制提供一手代码依据。

1. 这份 DevExpress VCL 18.1.6 完整源码包,到底解决什么问题

半年前我从同事手里接过一个几年没人动过的 Delphi 7 老库,里面三分之二的界面都靠 DevExpress VCL 撑着。想搬到 Delphi 10.3 Rio 上重新编译,结果 IDE 里连控件面板都是空的。如果你也卡在“老项目 + 新 IDE”这个坎上,这份 DevExpress VCL 18.1.6 Full Source 加 DxAutoInstaller 的完整源码包就是现成的答案:它覆盖从 Delphi 7 到 10.3 Rio 的完整版本链,自带自动安装器帮你逐包编译、注册,也可以按源码手工编译去定位问题。适合长期维护老系统、又要在多版本 IDE 之间来回切换的 Delphi 程序员,下文直接给你安装配置、编译顺序和排错清单。

2. 用 DxAutoInstaller 自动安装:组件编译与注册的完整流程

2.1 DxAutoInstaller 到底是什么

DxAutoInstaller 不是一个普通的安装向导,它是一个“编译安装器”。它先读一个配置文件,根据当前安装的 Delphi 版本去匹配源码包里对应的包工程(.dpk),再从底层核心包开始,按依赖顺序调用编译器,逐个生成两种包:运行时包(runtime BPL)和设计时包(design-time BPL,文件名带 dcl 前缀),最后把设计时包注册进 IDE 的组件面板。

这和官方安装程序最大的区别在于:官方装的是预编译好的二进制包,它不知道你本机 IDE 的补丁等级、也确实不支持某些旧版本;而 DxAutoInstaller 是在你机器上现编现装,编出来的包和你 IDE 的编译器版本是严格对齐的。对 Delphi 7、2007、2009、2010 这种老 IDE,它还会单独做一层源码兼容预处理,这也是它比手工编译省心的核心原因。

18.1.6 这个版本号很关键。18.1 是 DevExpress VCL 的版本线,6 表示该版本线下的月度小版本,针对的是当年 6 月前后的发布状态。源码包里所有包的版本后缀都会带 v18.1,编译输出会生成类似DevExpress.Data.v18.1.bpl这样的文件。你在配置 IDE 路径时,如果看到 v18.1 和某个不带后缀的旧包混在一起,基本就是安装没做干净。

2.2 安装前的准备:四个容易翻车的细节

先别急着双击工具,我见过太多人栽在准备工作上。以下几点没做对,后面编译报错你都不知道往哪查。

第一,目标 Delphi 版本必须已经装好并且至少成功启动过一次。安装器识别 IDE 是读注册表的,不是看目录,IDE 没跑过初始化,注册表里没有对应键,它就会直接报“找不到 IDE 分支”。第二,源码包解压路径、IDE 安装路径都不要带中文和空格。老编译器对路径的解析能力有限,空格在某些批处理里会被拆成两个参数,我曾经被C:\My Files\Dev这种路径折腾了一下午。第三,关掉杀毒软件实时防护,至少把源码包目录加白名单。编译过程会频繁生成和删除临时 .dcu,实时扫描会让编译时间翻倍,还容易随机报“文件被占用”。第四,整个安装过程必须用管理员权限运行,否则写注册表和往 IDE 安装目录拷文件都会静默失败。

配置阶段我用一个.ini文件来控制安装行为。DxAutoInstaller 不同版本的参数名有差异,但常见做法是长这样:

[dxtools] ide_version=XE10.3 ide_path=C:\Delphi\10.3 component_set=full runtime_output=C:\DevExpress\Runtime design_output=C:\DevExpress\Design clean_before_build=1 skip_d7_compat=0

各参数作用我拆开说。ide_version指定目标 IDE 的版本标识,决定安装器去读哪一套包工程;ide_path是补丁,当注册表识别失败时,安装器直接用这个路径去找编译器;component_set可选full或core,full编译全部组件集(网格、工具条、皮肤、电子表格都在内),core只编译核心数据与界面基础包。runtime_output和design_output是两类 BPL 的输出目录,分开放的好处是后期部署只拷贝 runtime 目录。clean_before_build=1要求每次安装前清空输出目录,这个建议永远别关,否则残留的旧 .dcu 会让编译器遇到“两个单元同名”的玄学问题。skip_d7_compat只在安装目标包含 Delphi 7 时需要关注,保持 0 就让安装器自动做源码预降级处理。

2.3 执行安装:命令行跑完整流程

配置写好后,命令行执行即可。我一般不用它的交互界面,因为命令行能拿完整日志,失败了可以直接定位到具体包。

dxautoinstitaller.exe --config=installer.ini --log=install.log --wait

注意--wait参数在批处理里有用,它让进程跑完才返回,后面可以接if errorlevel 1 goto :failed做自动化。执行后先别急着切出去刷网页,观察前二十行日志。正常的开头会先打印 IDE 版本识别结果、组件集清单、包总数,然后进入编译序列。你会在日志里反复看到Compiling DevExpress.Data、Compiling dclDevExpress.Data、Compiling DevExpress.CxGrid、Compiling dclDevExpress.CxGrid这类记录,先 Data 后 dcl 前缀包,这就是它在按依赖顺序编译运行时包和设计时包。

这里有个判断标准:如果日志里出现Error、Fatal、Cannot find unit、Unable to register任意一个,不要继续等,直接中断。等也是白等,后面依赖这个包的几十个包都会跟着失败,日志拖得很长,真正的错误线索反而被淹没。处理方式是先修第一个Error对应的包,再重新跑。安装器对已经成功的包会做跳过处理,但为了保险,clean_before_build保持 1 的前提下重跑更干净。

如果自动安装器反复在同一个包上失败,别死磕。下一章我给你手工编译的完整路线,把 DxAutoInstaller 当作“快速成功路径”,手工编译当作“兜底和排查路径”,两条路配合才是完整解法。

3. 源码包手工编译路线:目录结构、编译顺序与库路径设置

3.1 源码包的目录结构:先分清四个关键目录

拿到源码包解压后,不要急着编译,先把目录认全。DxAutoInstaller 的目录命名在 18.1.6 里已经比较统一,常见结构如下表:

目录典型内容作用
packages各组件包的 .dpk 工程文件编译入口,按依赖关系逐包打开
Sources各单元的 .pas 源码编译时通过搜索路径引用,也供 IDE 跳转源码
Library编译输出的 dcu、bpl、dcl 文件输出目录,需加入 IDE 库路径
Win32 或 Resources皮肤、图片、图标等资源文件运行时皮肤加载和设计时图像搜索路径
DXAutoInstaller自动安装器的脚本与配置模板提供安装清单和预处理脚本

Delphi 7 用户要多看一个东西:源码包根目录下通常有一份COMPAT_D7或D7_COMPAT之类的说明文件,里面记录了对老编译器做了哪些源码级处理。找不到也没关系,直接用 DxAutoInstaller 的预处理分支就行。

手工编译的价值在于两点:一是你能看到全部.pas源码,某个控件行为不合预期时可以直接在 IDE 里 Ctrl+点击跳进去看实现,这是二进制安装包给不了的;二是你可以裁剪组件集,比如只编译网格和工具条,不编译报表模块,减小输出体积。代价是编译顺序得自己操持。

3.2 编译顺序与 BPL 命名规则:先 Data 后 dcl,先 runtime 后 design-time

手工编译要严守顺序:先编译不带 dcl 前缀的运行时包,再编译带 dcl 前缀的设计时包;同在运行时包里,先编核心 Data,再编依赖它的界面包。因为设计时包引用运行时包的导出符号,而界面包引用核心包。顺序反了,编译器直接报Cannot find unit或File not found。

18.1.x 的包命名规则很清楚。运行时包叫DevExpress.<模块>.v18.1.bpl,比如DevExpress.Data.v18.1.bpl、DevExpress.CxGrid.v18.1.bpl、DevExpress.DxBar.v18.1.bpl。设计时包叫dclDevExpress.<模块>.v18.1.bpl,比如dclDevExpress.Data.v18.1.bpl。设计时包只负责给 IDE 提供组件注册信息,程序运行不依赖它。

下面给一个手工编译核心包的批处理示意。注意 IDE 版本不同,dcc32.exe路径和版本宏(VERxxx)不同,编译前第一件事就是确认版本宏是对的:

@echo off set Dcc32=C:\Delphi\10.3\bin\dcc32.exe set SrcPath=C:\DevExpress\Sources set OutPath=C:\DevExpress\Library\Win32\Release set LibPath=%SrcPath%;C:\Delphi\10.3\lib "%Dcc32%" -B -Q -DVER330 -U"%LibPath%" -E"%OutPath%" -R"%SrcPath%" ^ -N"%OutPath%" "%SrcPath%\packages\DevExpress.Data.dpk" "%Dcc32%" -B -Q -DVER330 -U"%LibPath%" -E"%OutPath%" -R"%SrcPath%" ^ -N"%OutPath%" "%SrcPath%\packages\dclDevExpress.Data.dpk"

参数含义我说明一下。-B是全部重建,忽略已存在的 .dcu,这个参数在换 IDE 版本后必须带;-Q是安静模式,只在出错时打印信息,配合日志看比较舒服;-DVER330是条件编译宏,Delphi 10.3 Rio 对应VER330,换成 Delphi 7 就是VER120,宏不对会导致源码里大量的版本判断分支走错,编译产物行为会非常怪;-U指定搜索路径,多个路径用分号分隔,注意源码路径一定要放在系统库路径前面;-E指定 BPL 输出目录;-N指定 .dcu 输出目录。最后的参数是 .dpk 工程文件路径。

Delphi 7 特例要说清楚:它的编译器不认 UTF-8 编码的源码。18.1.6 的源码在较新版本下可能是带 BOM 的,直接丢给 Delphi 7 会报Invalid character,这也是很多人卡在“明明自动安装器能用,手工编译却全红”的原因。常见做法是先用 DxAutoInstaller 的预处理脚本把源码降级成 ANSI 编码,再做编译。所以我的建议是:目标只有 Delphi 7 时优先自动安装器,目标同时有多版本时,高版本手工编,D7 交给工具。

3.3 库路径与资源路径:编译后的 IDE 配置

包编译完不代表结束,还要让 IDE 能找到这些包和源码。进入 IDE 的Tools > Options > Environment Variables和Tools > Options > Delphi Options > Library - Library Path,把两个路径加进去:

C:\DevExpress\Library\Win32\Release C:\DevExpress\Sources

顺序有讲究。.dcu输出目录放在最前面,Sources放在后面。原因是查找单元时编译器优先找.dcu,找不到才去翻.pas源码。如果Sources在前,IDE 每次都会打开源码做语法解析,编译速度会明显变慢,而且源码版本和 .dcu 版本不一致时会触发“单元被重新编译”的连锁反应。

皮肤类组件的路径要单独确认。开发时拖一个 skin 控件,运行时皮肤加载要从资源目录找图片。如果你只加了 Library 路径,没加资源路径,常见现象是:设计时看得到皮肤预览,运行时LoadFromFile报找不到文件。处理方式是把源码包里的Win32资源目录也加进工程的搜索路径,或者运行时显式指定完整路径。

库路径配完后做一次验证:新建一个工程,在 uses 里写cxGrid,然后 Ctrl+点击这个单元名,如果能跳转到.pas源码,说明路径配通了;如果跳转失败或跳到一个 .dcu 的纯声明接口,说明Sources路径没配好。

4. 接入工程:包引用、单元依赖与部署选型

4.1 两种引用方式:Require 包与直接 uses

源码包安装完成、库路径配好之后,新建工程里就能看到 DevExpress 组件面板了。这个阶段常见一个困惑:工程里到底哪些控件需要显式引用包,哪些只需要 uses 单元?

先说清楚依赖机制。Delphi 工程有两种运行时依赖处理方式:一种是在Project Options > Packages里勾选Build with runtime packages,并手动Require具体包名;另一种是不勾选运行时包,所有控件单元直接静态编进 EXE。前者是“动态链接 BPL”,后者是“静态链入”。两者不冲突,甚至可以同时生效:编译时通过 uses 找到单元源码或 .dcu,运行时去按包名找 BPL。

推荐的做法是开发阶段勾选运行时包,这样 IDE 能自动管理依赖传递——你 Require 一个DevExpress.CxGrid.v18.1.bpl,它依赖的 Data、LookAndFeel 基础包会被 IDE 自动加入。省心。下面是一个用了网格和数据源的工程单元引用示例:

uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, cxGrid, cxGridDBTableView, cxGridLevel, dxBar, cxLookAndFeel, cxLookAndFeelPainters;

注意两个点。第一,Data.DB是 VCL 数据源的基础单元,cxGrid 的 DB 视图依赖它,漏了就报TDataSource not found。第二,cxLookAndFeel这类皮肤外观单元,如果你只是改了控件的LookAndFeel属性但没在 uses 里引用,编译会过,但设计时预览效果和运行时表现可能不一致。见过这种翻车无数次了,建议要么全用默认皮肤,要么明确 uses 相关的皮肤单元。

4.2 常用核心包的依赖链

手工编译或自动安装完后,Library\Win32\Release目录下会有一堆 BPL。挑包的时候不用全 require,按功能选。下表是这套版本里高频出现的组合,供参考:

功能域运行时包设计时包依赖说明
数据核心DevExpress.Data.v18.1.bpldclDevExpress.Data.v18.1.bpl大多数包的底层依赖,必须最先加载
外观体系DevExpress.LookAndFeel.v18.1.bpldclDevExpress.LookAndFeel.v18.1.bpl依赖 Data,控制全局外观
网格DevExpress.CxGrid.v18.1.bpldclDevExpress.CxGrid.v18.1.bpl依赖 Data、LookAndFeel
工具条菜单DevExpress.DxBar.v18.1.bpldclDevExpress.DxBar.v18.1.bpl依赖 Data、LookAndFeel
皮肤库DevExpress.DxSkins.v18.1.bpldclDevExpress.DxSkins.v18.1.bpl依赖 LookAndFeel,体积大,可选

按这个表挑包,逻辑就顺了。一般工程只要挑两三个包,IDE 自动把依赖链拉齐,不需要手工把所有 DevExpress 包全部 require 上。把全部包列上去并不会让程序更稳定,只会让 IDE 启动更慢、部署包更多。

4.3 部署到目标机:BPL 分发还是静态链入

开发机上跑得好好的程序,拷到目标机一闪而过或直接报Unable to locate,这是典型缺 BPL 的表现。DevExpress 的运行时包不像 VCL 标准包那样随系统走,你必须手动分发。最初的方案是直接把整个Library\Win32\Release目录拷贝到目标机,再把目录加到系统 PATH。能用,但会把开发用的一些中间文件(比如 .dcu、.map)也带过去,不干净。

更好的做法是写一个部署脚本,只拷贝运行时 BPL:

@echo off set SrcDir=C:\DevExpress\Library\Win32\Release set TargetDir=C:\Program Files\MyApp\Lib if not exist "%TargetDir%" mkdir "%TargetDir%" xcopy /y /d "%SrcDir%\DevExpress.Data.v18.1.bpl" "%TargetDir%\" xcopy /y /d "%SrcDir%\DevExpress.LookAndFeel.v18.1.bpl" "%TargetDir%\" xcopy /y /d "%SrcDir%\DevExpress.CxGrid.v18.1.bpl" "%TargetDir%\"

/y是覆盖同名文件不提示,/d是只在源文件比目标新时才复制——这个参数建议保留,增量部署时能省不少时间。拷完后在目标机打开%TargetDir%看一眼,确认三个 BPL 都在,且没有任何带dcl前缀的包混进去。设计时包绝不能分发到目标机,它依赖 IDE 环境,装了反而可能导致程序启动异常。

还有一种部署选型:不勾选Build with runtime packages,全部静态编译进 EXE。这样目标机一个文件都不用带,但 EXE 体积会明显增大,而且一旦项目中多个 EXE 都用 DevExpress,每个都塞一份,磁盘和内存都是浪费。我的经验是:单文件小工具静态链入省心,大型多程序系统走 BPL 分发更合理。编译方式切换后,记得全量重新编译一次,不要只 Rebuild 当前工程,否则旧的 .dcu 缓存会和新包定义打架。

5. 避坑:安装失败、编译报错与运行崩溃的五个高频问题

5.1 自动安装器报“找不到对应版本的 IDE 分支”

现象:DxAutoInstaller 启动后,日志里出现IDE branch not found for version XE10.3或类似文本,然后直接退出。

原因:安装器是读注册表来识别已安装 IDE 的,不是扫描磁盘目录。这台机器上要么没装对应版本的 Delphi,要么装了但 IDE 从未启动过,注册表项没初始化。还有一种可能是 64 位系统下 IDE 安装程序写入了 32 位视角的注册表,安装器读的是 64 位视角。

解决:先手动打开一次目标版本 IDE,随便新建一个工程再关掉,让 IDE 完成注册表初始化。然后重新跑安装器。若还是不行,在配置文件的ide_path里显式指定 IDE 安装目录,并确认路径下能找到bin\delphi32.exe。对 64/32 位注册表视角问题,可以试着用 32 位环境变量方式运行安装器,但 D7 场景下直接指定路径最省事。

5.2 编译报 Cannot find unit 且定位不到具体包

现象:手工编译某个 .dpk 时,编译器报Cannot find unit 'cxGrid',但你明明已经编译过 cxGrid 包。

原因:大概率是.dcu输出路径和当前编译包的搜索路径对不上。编译器是按-U参数提供的目录顺序去找.dcu的,如果你把第二个包的输出目录写到另一个目录,且没在搜索路径里包含它,就算文件存在也找不到。更隐蔽的情况是:两个目录下存在同名.dcu,比如一个旧的DevExpress.Data.dcu残留在 IDE 的默认输出目录里,编译器优先找到了它,然后从这个旧包里找不到 cxGrid 里新加的类。

解决:把源码包的Sources目录和统一输出目录都加进-U,保证全工程共用同一个输出目录。在命令行下手工编译时,统一用-N指定到Library\Win32\Release,不要默认输出。然后全量清理一次:删除编译输出目录下的所有.dcu、.bpl,再从头编译。这条血泪经验我重复过很多次:源码包从旧机器拷贝时,别把旧输出目录一起拷过来,那里面全是坑。

5.3 Delphi 7 下编译报 Invalid character 或源码乱码

现象:用 Delphi 7 打开 18.1.6 源码包里的.pas文件,编辑器显示乱码,编译时大量报Invalid character,甚至直接崩在预处理阶段。

原因:这套源码包在较新版本下保存时可能带 UTF-8 BOM 或部分非 ANSI 字符。Delphi 7 的编译器只认 ANSI 编码,看到 BOM 头三个字节EF BB BF就解析成乱码。自动安装器对 D7 有一层预处理,但手工编译时你不知道这层处理具体改了哪些文件,直接裸编就撞上了。

解决:不要手动去批量转码,工程太大。建议做法是:只针对 D7 用 DxAutoInstaller 的 D7 兼容模式跑,它会在预处理阶段生成一份 D7 可用的源码副本到单独目录,你在 IDE 的搜索路径里优先指到这份副本。如果你实在要全手工,再用文本转换工具统一转 ANSI,转完后重点检查*.dfm文件和含中文注释的单元,这两类最容易残留非法字符。转码之后如果某个包能编译过但跑起来界面文字乱码,那就不是编译问题,是窗体文件的编码没转干净,用 IDE 的窗体编辑器重新保存一遍即可。

5.4 装完重启 IDE 后组件面板空白或启动假死

现象:自动安装器报告全部成功,重启 IDE 后要么启动时间翻了几倍,要么组件面板上找不到任何 DevExpress 控件,更严重的直接卡在启动画面。

原因:设计时包注册失败或包版本不完整。常见两个根源:一是clean_before_build被关了,安装时新包覆盖旧包,但 IDE 的包缓存还记着旧包的导出符号,加载时符号对不上就会卡;二是设计时包和运行时包版本不一致,比如dclDevExpress.CxGrid.v18.1.bpl是 18.1.6,而DevExpress.CxGrid.v18.1.bpl是更早月份的 18.1.1,版本标识对不上,IDE 拒绝加载。

解决:先退出 IDE,删除 IDE 安装目录下的*.bpl残留(如果你把所有包都输出到了默认目录),再删除 IDE 缓存目录下的.dcu和.bpl相关缓存文件。然后重新跑一次干净安装,保持clean_before_build=1。另外,打开 IDE 的Components > Install Packages,手动把dclDevExpress开头的包移除后再重新添加一次,去掉重复注册项。这个操作在版本混装后比直接重装更快。

5.5 皮肤包编译慢或运行时找不到皮肤文件

现象:编译带皮肤包的工程时,单是dxSkins相关包就要编好几分钟;程序运行时调用皮肤加载却报File not found: dxSkins.skinres之类的错误。

原因:皮肤包体积大,包含大量图片资源和皮肤定义单元,编译慢是正常现象,但如果你只选了core组件集,根本没编皮肤包,那运行时报找不到文件就是必然。另一种常见情况是:皮肤包编译成功了,资源文件也在,但工程搜索路径里没有指向资源目录,运行时段代码按相对路径找不到。

解决:确认安装组件集时包含skins子集,手工编译的话要把DevExpress.DxSkins.v18.1.bpl及其依赖编进去;资源路径要显式加到工程的Search Path,或者运行时把皮肤文件路径写绝对路径验证一次。建议做法是:在程序的初始化代码里统一设置皮肤路径,用ExtractFilePath(Application.ExeName)拼出相对路径,然后把*.skin、*.skinres文件随程序一起分发,这样部署时不用猜目标机的目录结构。编译慢的问题不用解决,它不是故障;但你可以在做增量修改时只编你改动的包,不要每次全量-B重建,能省一半时间。

6. 安装后的验收技巧:留一个能复用的回退脚本

装完别急着把源码包删掉,先做验收。我的验收流程分三步,每一步都是踩坑换来的,顺序最好不要变。

第一步,确认 IDE 能新建工程并拖出控件。具体操作是:新建一个 VCL Forms 工程,从组件面板拖一个 cxGrid 到窗体上,然后双击窗体,在FormCreate里写一段动态创建代码。这一步能同时验证组件面板注册、运行时包加载、设计时包注册三段链路是否正常。

uses cxGrid, cxGridDBTableView, cxGridLevel, Data.DB; procedure TForm1.FormCreate(Sender: TObject); var AGrid: TcxGrid; ALevel: TcxGridLevel; AView: TcxGridDBTableView; begin AGrid := TcxGrid.Create(Self); AGrid.Parent := Self; AGrid.Align := alClient; ALevel := AGrid.Levels.Add; AView := AGrid.CreateView(TcxGridDBTableView) as TcxGridDBTableView; ALevel.GridView := AView; AView.DataController.DataSource := DataSource1; end;

这段代码的逻辑是:先创建网格容器,再加一个 Level,然后创建 DB 视图并绑定到 Level,最后把数据控制器的数据源指到你自己的 DataSource。能编译能跑,说明运行时包完整;如果报TAcxGrid not found,说明设计时包没注册成功,回 5.4 清理缓存。这段验收代码我至今留着,每次换版本都先跑一遍,比到处点组件面板快得多。

第二步,在安装完成、程序能正常跑的当下,立刻做一个回退镜像。源码包安装会改动 IDE 的库路径、注册表里的包列表、还有 IDE 目录下的部分文件,光靠卸载是卸不干净的。我习惯把所有被改动的东西存成一个备份脚本:

@echo off set BackupDir=C:\DevExpress\Backup_%date:~0,4%%date:~5,2%%date:~8,2% mkdir "%BackupDir%" reg export "HKCU\Software\Embarcadero\BDS\20.0\Known IDE Packages" "%BackupDir%\known_packages.reg" /y xcopy /y /d "C:\Delphi\10.3\bin\*.bpl" "%BackupDir%\IDE_bpl\" xcopy /y /d "C:\DevExpress\Sources\*.pas" "%BackupDir%\sources\" echo Backup done: %BackupDir%

注意这里注册表路径里含Embarcadero\BDS\20.0,不同版本的数字不同,Delphi 10.3 对应 20.0,X 系列其他版本要按实际目录改。备份的重点是Known IDE Packages这一项,它就是 IDE 组件面板里所有已注册包列表。以后装新版本翻车了,重装 IDE 后直接双击这个.reg文件就能恢复包注册状态,不用从零开始逐包添加。源码和 BPL 的备份则保证你可以随时回退到“验收通过”的那个版本。

第三步,把回退脚本和版本号写在源码包根目录的README里。我吃过亏:装了新版本补丁后某个第三方控件不兼容,想回退旧版,却发现旧版已经被我删了,只能重新下载整个包再编译一遍。从那以后,我每次装 DevExpress VCL 这种带完整源码的大包,都会强制走一遍“备份 → 安装 → 验收 → 写回退记录”的流程,宁可多花十分钟。脚本本身不复杂,但关键时候它是你的后悔药,希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进