尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Delphi 12.3 下 DevExpress VCL 23.2.6 全源码编译安装与排坑指南

Delphi 12.3 下 DevExpress VCL 23.2.6 全源码编译安装与排坑指南 简介本资源是面向Delphi 12.3开发者的DevExpress VCL组件完整源码包版本23.2.6适用于Windows桌面应用界面增强与高效率UI开发尤其适合中高级Delphi工程师构建企业级富客户端程序。压缩包含2000个文件总计523.45MB其中C源文件642个与头文件443个支撑底层跨平台兼容逻辑PNG资源432个提供高清图标与皮肤素材TXT文档383个涵盖组件说明与配置范例PAS单元25个及DFM窗体4个直接支持VCL核心功能调用与可视化设计另有CHM帮助手册与PDF技术文档辅助集成。目前已有122人学习下载开发者可直接编译调试、深度定制控件行为、分析渲染机制并基于Ribbon、RichEdit、TableView、CloudStorage等典型Demo模块快速复用交互逻辑与样式方案。 看到这个压缩包名字我第一反应是Delphi 12.3 配上 DevExpress VCL 23.2.6 Full Source又是桌面开发里那种绕不开的组合。这个包全称很长翻译过来就是 DevExpress 的 VCL 控件库完整源码版版本号 23.2.6目标环境是 Delphi 12.3RAD Studio 12.x 的用户也习惯把这一代统称为 12.3。对老 Delphi 玩家来说DevExpress 的 VCL 控件基本是公司项目里的标配Grid、TreeList、Ribbon、Docking、报表这些日常开发百分之七八十的需求它都覆盖了。而 Full Source 这几个词意味着你拿到的不是只有一堆编译好的 bpl 和 dcp而是能打开、能下断点、能改、能重新编译的全部 pas 源码。这篇东西就是把我在拿到这个包之后做的事完整讲一遍从解压、目录规划、Library 路径配置、按依赖顺序编译运行时包、安装设计时包到验证组件面板、处理各种编译期和运行期的坑最后聊聊拿到源码之后还能怎么玩。适合 Delphi 桌面开发、VCL 生态的老手看也适合刚进公司接手老项目、发现 IDE 里装了一整套 DevExpress 却不知道怎么维护的新人。说实话网上翻来翻去都是安装向导的教程但真正拿到 Full Source 包、需要手工编译的人遇到的问题比那要复杂得多。1. 拿到 Full Source 包之后先想清楚要拿它做什么1.1 源码版和试用版差距有多大很多朋友一开始用的是 DevExpress 官网下载的试用版安装包一路 Next 点完IDE 里组件就能拖了开发起来也没什么明显问题。但试用版和 Full Source 的差别在平时写业务代码时看不出来一旦要排查问题或者做深度定制差距就出来了。试用版安装后你拿到的是编译好的二进制文件bpl运行时包、dcp编译单元索引、dcu单元文件。你在 IDE 里能拖组件、能写事件但双击进去只能看到接口声明看不到函数体的实现。遇到某些诡异行为比如 Grid 某行绘制不出来、某个皮肤切换后界面卡死你就只能在 OnCustomDraw 这类事件里打日志、下断点靠猜去定位。运气好能猜中运气不好折腾一两天。Full Source 版解决的就是这个问题。所有 pas 源文件都在IDE 里 Ctrl 点击任何一个方法直接跳进源码运行时按 F7 可以单步跟踪到控件的内部绘制流程、事件分发机制、数据绑定逻辑。你不但知道它“做了什么”还知道它“怎么做到的”。更重要的是你可以直接改源码——改完之后重新编译对应的运行时包整个项目就都用上了你定制过的版本。这在做统一 UI 规范、性能优化、兼容性修补时非常有用。当然源码版也有代价。它不会像安装向导那样帮你把一切配好需要你自己理解包的依赖关系、自己配路径、自己编译、自己装设计时包。第一次搞的人很容易在“找不到 dcu”“装完组件不显示”这些环节卡住。所以这篇东西才值得写。1.2 一份 rar 里面到底装了哪些东西把压缩包解开之后你看到的不是一个单一工程而是一整套按功能拆开的子库集合。按我拿到的包来看目录结构大致是每个子库平铺开来常见的包括ExpressLibrary一切的基础很多子库都依赖它。ExpressDataController数据控制器Grid、TreeList、VerticalGrid 的底层数据引擎都靠它。ExpressQuantumGrid就是大家熟悉的 cxGrid。ExpressBars工具栏和菜单dxBar 的底层。dxRibbonRibbon 风格的界面框架内部依赖 Bar。dxLayoutControl布局容器做表单界面非常好用。dxSpreadSheet电子表格类组件。dxGantt、dxFlowChart甘特图和流程图。dxDocking停靠窗口系统。dxSkins皮肤系统里面有大量皮肤包。dxRichEdit富文本编辑器。dxPrinting、dxPdfViewer 之类打印和 PDF 预览。每个子库下面又分成两类包一类是运行时包文件名通常没有特殊前缀或者以 dx 开头另一类是设计时包几乎都以 dcl 开头Design-time Component Library。运行时包是程序运行时要加载的设计时包是 IDE 在开发阶段用来把组件注册到面板上的——这个区分非常重要很多人装完发现组件面板没有东西就是只编译了运行时包没装设计时包。单看目录会觉得庞大得吓人但你日常真正会直接用的其实也就是四五个核心子库。其他子库可以按需编译并不需要全量编译。1.3 版本匹配Delphi 12.3 和 23.2.6 为什么是一对DevExpress 每个版本的 VCL 库都会在发布时声明支持哪些 Delphi/CBuilder 版本。23.2.6 属于 2023 年的第二个发布分支官方支持范围覆盖 RAD Studio 10.3 一直到 12.x。你如果打开源码包的 Library 目录会发现有 RS21、RS22、RS23 之类的子目录这个 RS 后面的数字对应的是 IDE 内部的版本号跟界面上的“12.3”不是一回事。以 Delphi 12.3 为例IDE 内部 BDS 版本号是 23.0所以它会去加载Library\RS23下的文件。你在配 Library 路径、编译产物输出目录时就要认准 RS23 这个子目录而不是看着 12.3 这个界面数字去猜。这一点很容易搞错——我见过有人照着网上的旧教程把路径填成了 RS21对应 Delphi 10.4或者 RS22对应 Delphi 11.x/12.0 早期结果 IDE 提示找不到一堆单元还以为是包坏了。另外如果你后来拿到的是更新的 25.2 之类版本这套步骤完全通用无非是 Library 目录下的 RS 编号变了。关键是先认清楚自己的 IDE 内部版本号再决定填哪个路径。搞错这个后面每一步都会踩坑。2. 动手之前的环境准备和目录规划2.1 三步检查你的 Delphi 环境在解压、编译之前先把环境确认好省得后面来回返工。第一步确认 IDE 版本。打开 Delphi 12.3Help About确认你装的是 12.3 而不是 12.2 或 12.1。不同小版本之间 Library 路径、支持的平台略有差异虽然 DevExpress 的兼容性一般没问题但版本认准了排错才有的放矢。第二步确认你用的是 Delphi 而不是 CBuilder 启动的 IDE。如果你机器上同时装了 Delphi 和 CBuilder注意启动时选择的工作区。VCL 组件库在两个语言下都能用但编译包、安装设计时是绑定到当前 IDE 环境的。用 CBuilder 的 IDE 去装 Delphi 的设计时包很容易出现加载混乱。第三步检查有没有旧版本 DevExpress。如果机器上装过 22.x 或者更早的版本建议先卸载掉或者至少在包管理层面把旧注册信息清干净。多个大版本的 DevExpress 混在同一个 IDE 里轻则组件面板重复出现多个页面重则 IDE 启动时报包冲突甚至直接崩掉。这个我在后面“控件反复丢失”一节会专门讲。还有一条容易被忽视杀毒软件。编译时会生成大量 bpl、dcu、dcp 文件某些杀毒软件会一个接一个地扫描或者直接隔离误报。我遇到过编译到一半某个 bpl 被删掉然后 IDE 报“无法创建输出文件”。所以编译前最好把源码目录和 IDE 缓存目录加入杀毒白名单或者临时关闭实时防护。2.2 解压目录规划别用中文路径也别放 Program Files解压这个步骤看着简单其实不少人在这里就埋了雷。首先是路径。我强烈建议把源码包解压到一个纯英文、无空格的路径下比如D:\Components\DevExpressVCL。不要放在C:\Program Files (x86)\...下面那种带空格和系统权限保护的路径会让后面编译时经常遇到“Access denied”或者路径解析错误。中文路径更是大忌Delphi 对 Unicode 路径支持虽然比早期好很多但 DevExpress 这套源码的编译脚本、批处理文件很多是英文环境写的碰到中文路径就可能解析出问题。然后是解压后的文件检查。从 DevExpress 官方订阅下载的源码包有时候是分卷压缩的解压前先确认所有分卷都下载完整。解压后用文件管理器看看关键文件是否齐全比如根目录下有没有.groupproj、各个子库下有没有.dpk文件。如果发现有文件损坏在编译阶段会报出“cannot open file”之类莫名其妙的错误那时再回头找压缩包就浪费时间了。还有一个 Windows 特有的坑从网络上下载的压缩包解压出来的文件可能带有“来自其他计算机”的标记也就是文件的Zone.Identifier数据流。遇到这种情况编译时某些文件会被系统拦截报权限相关错误。解决方法是全选解压出来的文件右键 属性如果有“解除锁定”选项就勾选或者用 PowerShell 执行Unblock-File -Recurse批量解除。这个坑很隐蔽看着跟路径权限有关实际上根本不是 ACL 的问题。2.3 理解包的编译依赖关系DevExpress 这套源码不是平级的一堆独立包它们之间有一条清晰的依赖链。搞懂这条链比背任何命令都重要。最底层的是 ExpressLibrary几乎其他所有子库都会引用它。如果它没编译好后面编译任何包都会报“找不到 dxCore.dcu”“找不到 cxClasses.dcu”这类错误。再往上是 ExpressDataController它被 Grid、TreeList、VerticalGrid 共同依赖这几个表格类组件的数据来源都走它。然后是 dxBar 和 dxRibbonRibbon 看起来像个独立组件实际上底层大量复用了 Bar 的实现。皮肤系统 dxSkins 又依赖 ExpressLibrary 和 dxCommon 之类的公共单元。所以推荐的编译顺序是先编译最底层的 ExpressLibrary确认它能出包然后编译 ExpressDataController、dxCommon 这类被广泛引用的中间层最后再编译 Grid、Ribbon 这类业务组件。如果某个包编译时提示找不到单元先别急着问“为什么缺文件”回到依赖链上想想它依赖了哪个包那个包编译了吗编译产物在 IDE 找得到吗。有人说那我用 Project Manager 把所有 dpk 加进去批量 Build不也能按字母序编译吗实测下来字母序并不等于依赖序。字母序里 ExpressLibrary 排得靠前还好但有些中间层包会排在 Grid 后面就会报错。所以第一遍最好按依赖顺序手工编译多花二十分钟换来踏实。2.4 编译前要不要先装其他依赖组件DevExpress 不少子库做了第三方集成比如 ExpressSpreadSheet 可以跟 FastReport 联动dxServer 依赖数据库驱动ExpressPrinting 可以跟多种报表引擎集成。这些集成不是强制性的你如果是基础 UI 使用不装第三方组件也能正常编译核心子库。但如果你需要用某个子库而它引用了你没装的第三方单元编译时会报“找不到 xxx.pas 或 xxx.dcu”。这时候先分清楚这个被引用的东西是你真的需要的吗如果只是某个可选集成的分支代码可以直接跳过对应的子库不编译它如果你明确需要这个功能那就先把依赖的第三方组件装好再回头编译 DevExpress。举个例子项目里要用 DevExpress 的 Grid 显示 Excel 表格数据一般用 cxGrid dxSpreadSheet 就够了不会强制要求你装 Office 的 OLE 单元。但如果你要引入 ODAC 那种数据库组件和 DevExpress 的 DataSource 联动那 ODAC 就要提前装好。总的原则是按需安装不要一上来就想着把所有可选集成都补齐那只是给自己增加排错难度。3. 从零开始编译安装的完整流程3.1 先把 Library 路径配好少了这一步后面全是报错编译前第一件事不是打开 dpk而是把 Library 路径配置好。这个路径是 IDE 在编译时搜索单元用的相当于告诉编译器“这些目录下有代码找不到单元时来这里翻一翻”。在 Delphi 12.3 里打开 Tools Options Environment Options Delphi Options Library然后在页面里找到各个平台的 Library pathWin32 和 Win64 是分别配置的别只配了一个。把源码包解压后的根目录、以及Library\RS23这类子库路径加进去。这里有个小经验DevExpress 的源码包通常把运行时源码放在各子库自己的目录里而编译时产生的 dcu 默认也会散落在各个子库目录中。如果你希望后续查找文件方便可以在编译前把每个 dpk 的输出目录统一设置到一个 bin 目录下比如D:\Components\DevExpressVCL\Bin\Win32。这样 Library path 只需要加一个输出目录不用把几十个子库路径全加进去。不过这个设置需要在每个 dpk 的 Project Options 里改操作量大一点但一次配置后面重编译省心很多。配完路径后重启一次 IDE 让配置生效。这个细节很多人忽略结果在 IDE 里改了路径直接编译还是报找不到单元就以为是配错了其实只是 IDE 没刷新。3.2 按依赖顺序编译运行时包接下来进入核心操作编译运行时包。打开包含源码包的工程组文件通常扩展名是.groupproj如果压缩包里没有现成的工程组也可以手动逐个打开 dpk 文件。建议先把 ExpressLibrary 的 dpk 在 IDE 里打开然后在 Project Manager 里右键这个工程选 Build而不是 Compile。Build 会强制检查所有依赖引用并生成最终的 dcp 和 bplCompile 有时候只增量编译当前单元容易留下旧文件。编译成功后检查一下输出目录里有没有生成dxLibrary_RSPackage.bpl具体文件名看你拿到的包版本、对应的.dcp和.dcu。然后按照依赖顺序依次编译 ExpressDataController、dxCommon、dxBar 这些中间层再编译 Grid、Ribbon 这类上层组件。如果你把多个运行时包都加到了同一个工程组里可以右键工程组选“Build All”。这个操作会按工程组里添加的顺序逐个编译省去手工切换的麻烦。但前提是工程组里包的顺序是对的——依赖它的排后面被依赖的排前面。编译过程中如果弹出错误对话框不要急着关。最有效的做法是双击错误信息IDE 会跳到对应的源码位置。看是缺单元、缺类型还是变量名冲突。绝大多数缺单元问题都是 Library 路径没配好或者前导包没编译只有极少数情况才是包本身缺陷。3.3 编译并安装设计时包运行时包编译好之后组件还不会出现在面板上。要注册到 IDE得安装设计时包。在 Project Manager 里找到以 dcl 开头的 dpk 文件比如dcldxBar.dpk、dclcxGrid.dpk等双击打开。然后在 Project Manager 里右键该工程选择 Install。IDE 会弹出一个确认对话框显示“Package xxx will be installed”点 OK。如果一切正常组件面板上会出现新页面DevExpress 的组件就可以拖了。如果你同时编译了很多子库挨个右键 Install 很累。另一个办法是打开 Component Install Packages点 Add然后选择编译好的 bpl 文件。这个对话框里能直接看到当前已安装的所有设计时包以及它们对应的 bpl 路径。如果后面遇到“装完组件又消失”的问题第一个检查点就在这里——看看是不是根本没装进来或者装的 bpl 路径不对。安装设计时包有个硬性前提对应的运行时包必须先编译好、并且能被 IDE 找到。如果运行时包没装或者路径不对点 Install 的时候会直接报“Cannot load package xxx. The specified module could not be found.”。这种情况就先回去补运行时包的编译和路径配置不用在设计时包上反复折腾。3.4 新建项目验证组件面板所有包装完之后别急着拿老项目试水先新建一个干净的 VCL Application 验证环境是否正常。新建工程后默认是空 Form。从组件面板上找 DevExpress 相关的页面拖一个 TcxGrid 到 Form 上。这时候 IDE 会在 Uses 里自动加入对应的单元比如cxGrid、cxGridDBTableView、cxGridLevel之类。然后找个按钮的 OnClick 事件里写一句最简单的代码比如给 Form 的 Caption 赋值再编译运行。F9 能跑起来、Form 能正常显示说明运行时包和路径都没问题。如果你连着数据库也可以顺手拖一个 ADO 连接和数据集做一条简单的 select 查询把数据绑定到 cxGrid 上显示出来——这一步能同时验证 DevExpress 的数据控制链路是否正常。我平时测试时最常用的是连一个 Access 的示例数据库或者直接连 Excel 文件用TADOConnectionTADOQuery执行一条 select 语句然后 Set 给TcxGridDBTableView的 DataController 的数据源。实测下来这套链路能跑通就说明 Grid 系列的核心功能没被编译掉。还有一个检查点项目 Options 里的 Runtime Packages。如果你希望在开发机调试时直接加载 DevExpress 的 bpl那项目要把“使用运行时包”勾选上并把对应的 bpl 名称加到列表里。如果不想用运行时包而选择静态链接那编译时间会变长而且需要链接的 dcu 必须在 Library path 里能找到。两种方式各有取舍开发阶段我一般选运行时包模式因为编译快、改动源码重编译后立即生效交付阶段再根据情况决定是否改成静态链接。3.5 进阶用命令行批量编译的替代方案如果你只是偶尔装一次IDE 里的右键 Build 完全够用。但如果你的团队要统一维护组件库、每次升级都要重编几十个包那手工点击就太痛苦了。这时候可以写一个批处理或者 PowerShell 脚本用命令行来编译。Delphi 提供了命令行编译接口核心是 MSBuild。一个简化的思路是写一个循环按依赖顺序依次执行类似这样的命令用你实际的工程文件名替换msbuild D:\Components\DevExpressVCL\ExpressLibrary\dxLibrary.groupproj /t:Build /p:ConfigRelease /p:PlatformWin32这里的关键参数是/t:Build构建、/p:ConfigRelease按发布版配置、/p:PlatformWin32目标平台。实际跑之前先确认你本机的 MSBuild 路径和 Delphi 的编译环境变量已初始化——通常要从“RAD Studio Command Prompt”里启动才能找到环境变量。但这种方案不适合新手。脚本报错的排查成本比手工点击高得多因为你看不到 IDE 的图形化错误定位了。我的建议是先手工编译完一遍确认整个链路是通的再考虑用脚本固化下来。之后每次升级你只需要改版本号变量跑一遍脚本然后检查几个关键 bpl 是否生成了。4. 高频问题与排查思路实录4.1 编译期报错找不到 dxCore.dcu 这类问题这是 Full Source 安装里最典型的报错几乎每个第一次手动编译的人都会遇到一次。报错信息长得像这样[dcc32 Fatal Error] xxx.pas(10): F1026 File not found: dxCore.dcu。排查思路很简单先确认这个 dcu 是不是真的存在。在 IDE 里用 Search Find in Files在源码包根目录下搜dxCore.dcu看它能搜到什么位置。搜到了说明文件存在但不在 IDE 的 Library path 里——那就回 Tools Options 把对应目录加进去。搜不到说明 ExpressLibrary 还没有编译或者编译产物输出到了别的目录那就回头编译一次 ExpressLibrary确认输出目录。这里还有一个容易被忽略的情况你同时装了多个版本的 DevExpress或者以前编译过残留的旧版 dcu 散落在机器里。IDE 在 Library path 里找文件时是按顺序搜的如果旧版目录排在新版前面它可能加载了旧版的 dxCore.dcu然后各种符号对不上。处理方法是把新版目录提到最前面或者干脆把旧版的 Library path 移除掉。4.2 设计期报错组件面板上找不到 DevExpress 页面编译完之后组件面板没有新页面我见过好几种原因。最常见的是只编译了运行时包忘了安装设计时包。检查方法很简单Component Install Packages看列表里有没有 dcl 开头的 DevExpress 包。没有的话回到源码包目录找 dcl*.dpk逐个 Install。第二种情况是设计时包装了但 IDE 加载时出错被自动禁用了。Install Packages 列表里如果某个包前面有感叹号或者加载失败提示通常是运行时 bpl 找不对。这时候看错误描述一般会精确告诉你缺哪个 bpl。补上对应的运行时包路径重启 IDE再重新勾选这个包。第三种情况是杀毒软件或者权限问题导致 bpl 注册失败。解决方法前面说过把编译目录加入白名单或者以管理员身份启动 IDE 再装一次。4.3 运行时报错程序启动后提示缺少 bpl开发机上一个典型场景程序在 IDE 里按 F9 跑得好好的双击 exe 运行时报“找不到 dxBar_BDE24.bpl”之类的错误。这是因为你在开发时使用运行时包模式exe 本身只包含业务代码DevExpress 的实现都放在 bpl 里。F9 启动时 IDE 会自动把 DevExpress 的 bpl 目录加进搜索路径所以没问题直接双击 exe系统找不到这些 bpl就报错了。解决办法有两个方向。一是把开发机上的 bpl 目录加到系统 PATH 环境变量里或者把需要的 bpl 文件复制到 exe 同目录这样双击也能找到二是项目改成静态链接关掉 Runtime Packages让 DevExpress 的代码直接编进 exe。开发阶段我推荐方案一把 bpl 放 exe 同目录发布时再把要分发的一组 bpl 挑出来按 exe 目录结构打好包如果嫌依赖文件太多再考虑静态链接。顺带提一句判断一个 exe 到底依赖哪些 bpl可以在 IDE 里看项目 Options Runtime Packages 的列表也可以用 Dependency Walker 之类的工具去扫描。装上新手更容易理解的思路是报错提示哪个 bpl 找不到就把哪个 bpl 拷过去环境报齐为止。4.4 IDE 里控件反复丢失、需要重新放置的问题“delphi 控件版本问题导致每次进入 IDE 都丢失控件需要重新放置保存后还是那样”——这个热搜词背后的现象我太熟悉了。它描述的场景一般是项目里用了一堆 DevExpress 控件保存后重开 IDEForm 上某些控件变成灰色或者直接报“Class TcxGrid not found”设计器里没法正常显示要重新放置才能用。这个问题的根源十有八九是“设计期找不到对应的类”。IDE 在打开 Form 时要反序列化 DFM 文件里的类名然后到已安装的设计时包里找这个类。如果设计时包没有正确加载或者加载的是另一个版本、另一个命名空间下的同名类就会失败。几个具体原因你装了 23.2.6但项目里还残留着旧版本 22.x 的 dcu/bpl 引用IDE 加载了旧包或者新旧包互相覆盖注册信息IDE 缓存里存了错误的包信息需要清理缓存后重启Form 的 Uses 里被手动删除了一些单元导致 DFM 反序列化时找不到类。处理路径先卸载旧版本 DevExpress清理干净后再装新版本然后关闭 IDE备份后删除 Delphi 12.3 的缓存目录位置在%AppData%\Embarcadero\BDS\23.0\AppData之类的目录下具体以实际为准再重启 IDE 重新加载包。如果是单文件被删了 Uses那就把缺失的单元名补回来。这里最重要的经验是版本混装是大忌。别图省事在一个 IDE 里同时保留 DevExpress 22.x 和 23.2.6虽然某些场景下能共存但只要设计时包注册信息冲突你就会被这个“控件消失”问题反复折磨。4.5 常见问题速查表错误现象常见原因处理方式编译报 File not found: dxCore.dcuExpressLibrary 未编译或 Library 路径未配置先编译 ExpressLibrary再检查 Tools Options 里的 Library path组件面板没有 DevExpress 页面设计时包未安装Component Install Packages 或右键 dcl*.dpk 点 Install安装设计时包报 Cannot load package缺少对应运行时 bpl先编译并配置运行时包路径再重装设计时包F9 正常但双击 exe 报缺 bplexe 找不到运行时包把 bpl 复制到 exe 同目录或加入 PATHForm 打开时控件显示为灰色“Class not found”设计时包未加载或多版本冲突卸载旧版检查 Install Packages清理 IDE 缓存后重启编译时提示 Access denied输出目录被权限限制或杀毒拦截换无权限限制目录杀毒软件加白名单检查文件“解除锁定”改完源码重编译程序行为没变化dcu 缓存了旧版本删除旧的 dcu重新 Build确认使用的输出目录是最新路径这张表不完整但覆盖了我这些年遇到的高频问题至少八成。剩下的偏门问题按“报错信息本身指向哪一行代码”去追基本都能解。5. 源码版带来的进阶价值5.1 用源码调试看 GridView 内部到底怎么重绘的源码版最大的魅力就是能进入控件内部调试。之前用试用版遇到一个 Grid 的绘制问题只能在事件里猜现在可以直接在控件源码里下断点看它每行每列到底走了哪个分支。具体操作在 IDE 里打开项目设置 Tools Options Debugger Options Symbols 里的源码路径把 DevExpress 源码目录加进去。然后在代码里写一个事件比如cxGridDBTableView1.OnCustomDrawCell断点进去之后按 F7就会跳进 DevExpress 的绘制方法里。你看它调用了Canvas.FillRect还是Canvas.TextOut看它在设置前景色之前有没有被某个样式覆盖问题往往一眼就清楚了。这种方法不仅解决 bug还能帮你理解控件架构。比如你研究过TcxCustomGridTableView的DataController相关源码就会明白为什么 Grid 的刷新有那么多模式也就会知道数据量大的时候选哪种刷新方式性能最优。这种功力用黑盒 bpl 是练不出来的。5.2 定制自己的控件变体以小修改为例拿到源码之后有一种很爽的玩法给控件加“原厂没有”的默认行为。举一个实际例子我接手过一个项目全团队规定所有 cxGrid 的奇偶行必须默认开启不同的背景色且默认禁止用户调整列宽。如果每建一个 Grid 都要在事件里写一遍代码很烦且容易漏。我的做法是直接改 DevExpress 的源码找到TcxGridTableView的构造方法或者初始化逻辑把OptionsView.AlternateRow默认改成 True把OptionsCustomize.ColumnMoving默认改成 False然后重新编译运行时包。之后全团队新建的 Grid 就天然符合规范不用再写重复代码。但这里有一个严重警告你改的是第三方源码升级时官方不会带着你的改动走。所以强烈建议在源码目录下建一个 Git 仓库把 DevExpress 原始版本留一个标签每次改动都提交并写清楚改了什么、为什么改。拿到了新版本源码包先 diff 再看要不要把老改动迁移过去。不然你辛辛苦苦改了几十个文件升级时全被覆盖那才是灾难。5.3 裁剪和瘦身按需编译需要的子库Full Source 包全量编译的话bpl 体积并不小。如果你的程序只是用到 Grid 和 Ribbon却把所有子库都装了、都自动加载了那启动时 Delphi 会把一堆用不到的设计时包也注册进去IDE 启动变慢、项目编译也变慢。建议做法只编译你项目真正需要的子库。核心依赖我重新梳理一遍只要 cxGrid需要 ExpressLibrary、ExpressDataController、ExpressQuantumGrid以及它们依赖的公共单元。还要 Ribbon加上 ExpressBarsdxBar和 dxRibbon。还要表单布局加 dxLayoutControl。还要皮肤加 dxSkins 体系。编译时就把这些子库加进工程组其他如 Gantt、FlowChart、SpreadSheet 这些用不到的先不编译。这样 IDE 加载的设计时包数量从几十个降到十几个启动速度明显改善项目编译时也不用为用不到的单元建立索引。等以后某个功能真的用到了再回头编译对应子库补上即可。这比一开始就全量装维护成本低很多。5.4 升级换代的注意事项DevExpress 一年两个大版本加上若干 hotfix升级速度相当快。你不可能永久停留在 23.2.6迟早要面对 25.2 或者其他更新的版本。升级时最忌直接覆盖安装我的流程是这样的先把当前版本的源码目录整体改名备份比如DevExpressVCL_23.2.6_backup。然后把新版本的包解压到原来的路径。用 IDE 打开新版的工程组先按依赖顺序全量编译一遍看看有没有接口变化导致的编译错误。如果你的项目里用到自定义修改的源码拿 git diff 比较新旧版本的差异把官方改动和你自己的改动分别列出来再决定怎么合并。升级之后还要重点验证设计时包关闭 IDE把新版的设计时包重新 Install确认组件面板里的页面是新的没有残留旧版包。最后用老项目打开测试重点看 Grid 的样式、Ribbon 的布局有没有因为版本差异而变化。DevExpress 官方对向后兼容做得算好的但皮肤文件、默认属性这类细节偶尔还是会有变化。说到底升级这件事准备工作做得越仔细真正切换时就越丝滑。也就是“升级花了十分钟准备花了两小时”但这两小时非常值得。我个人现在的习惯是拿到新版本先不急着一股脑全编译而是先看一眼官方 changelog列出跟我项目相关的改动然后打开以前维护的源码副本核对有没有接口变化。编译源码这件事头几次确实痛苦但等你理顺了依赖链、目录规划、输出路径管理后面每次升级都能控制在半小时以内。多试几次你就再也不想回到那个只能看黑盒 bpl 的时期了。本文还有配套的精品资源点击获取
返回列表