简介面向 Delphi 13.1 开发者的 DevExpress VCL Controls 26.1.3 英文版组件库安装包适合构建专业 Windows 桌面应用、数据管理系统或报表工具的中高级 Delphi 工程师。包内完整收录运行时与设计时源代码、CHM 帮助文档、应用程序接口参考及 1800 多个官方可运行示例工程涵盖网格、图表、调度、停靠窗口、Ribbon 等 200 余个组件。全部组件基于纯 Object Pascal 编写无外部 DLL 依赖支持高 DPI、Windows 11 视觉样式与 Direct2D 渲染。资源共 2000 个文件以 cpp 示例工程源码、h 头文件、png 界面截图与图标、txt 说明文档为主另有 xml/json 配置、pas 单元、pdf/docx 文档、dfm 窗体及 chm 帮助文件压缩包约 458.89 MB。示例覆盖 Win32/Win64 架构附带迁移指南、性能调优白皮书及多语言本地化资源包。已有 134 人学习/下载适合需要为 Delphi 13.1 环境补充高质量界面组件、快速上手 DevExpress 开发、开展组件选型评估或研究其实现细节的开发者使用。1. 拿到 Delphi 13.1 配套的 DevExpress VCL Controls 26.1.3 EN.7z先想清楚三件事上个月接了个老 Delphi 项目改造里面还是 TButton 加 TTreeView 的原始组合登录页丑到客户投诉。同事甩给我一个 7z 压缩包文件名写着“Delphi 13.1控件之DevExpress VCL Controls 26.1.3 EN.7z”嘱咐装好它界面问题就解决了一半。DevExpress VCL Controls 是 Delphi/CBuilder 生态里最常见的商业控件集26.1.3 是它的版本号EN 代表英文资源7z 只是传输容器。这个东西能不能用、怎么装、装完遇到“组件面板空白”“编译找不到 dcu”怎么排是每个 Delphi 桌面开发者在换环境时都要撞一遍的流程。这篇文章不聊泛泛的 UI 设计只讲一口气把它跑通的关键路径。2. 拆包之前先看懂版本配套26.1.3 的目录结构、编译器代号和 EN 版的取舍2.1 控件版本与 IDE 版本的对应关系26.1.3 到底配什么环境DevExpress VCL 的版本号有自己的节奏26.1 表示今年上半年的大版本后面 .3 是第三个补丁版。它和 Delphi 13.1 的配套关系不是看压缩包名而是看解压后的packages和lib目录里的编译器代号。我一般先看packages下有没有Delphi13.1这个子目录再确认lib\Win32和lib\Win64里的 dcu 厂商名才敢决定往哪个 IDE 里挂。这里有个容易被忽略的点VCL 控件是跟着编译器版本走的不是跟着 IDE 皮肤版本走的。一个 Delphi 13.1 IDE 可以同时维护 32 位和 64 位编译目标但 DevExpress 的bpl和dcu是分平台产出的。如果你的老项目还挂在Win32目标上那安装时就别贪心把Win64目录全加进去加错了会出现“编译通过、链接报错”这类两头难查的问题。真正的选择逻辑是老项目优先 32 位新项目或需要大内存的数据库桌面端优先 64 位。DevExpress 的部件在两种目标下表现几乎一致真正影响选择的是第三方依赖比如某些旧版 ODBC 驱动只有 32 位版本这一步要在拆包前先想清楚。2.2 解开 7z 后你该认识的目录packages、source、lib、demos 的装载顺序把压缩包解开后不要急着双击任何.bpl先把目录结构从头到尾过一遍。标准 DevExpress VCL 包里这几个目录的用途和装载顺序如下目录存放内容在安装流程中的位置packages\Delphi13.1编译工程文件.groupproj、.dpk是安装的入口最先打开source控件源码与少量补丁文件编译时加入 Library Pathlib\Win32、lib\Win64编译产出的.dcu、.bpl、.dll编译后加入 Library Pathdemos官方示例工程验证环境是否正常Tools皮肤设计器、部署工具、转换工具按需使用需要注意source里是.pas文件它不能直接替代lib下的.dcu。很多新手把source一股脑加进 Library Path结果编译时 Delphi 现场编译所有源码十几分钟才能出一次包。正确顺序是先让 IDE 用lib里现成的 dcu只有当调试控件源码时才临时把source加进搜索路径。2.3 EN 版意味着什么别指望里面带中文也别急着换多语言版压缩包名字里的 EN 表示这套资源文件的界面文本是英文的。在 DevExpress VCL 里按钮 Caption、对话框按钮、内置提示文本这些 UI 文案由资源文件提供EN 版和中文版在功能上没有任何差异差异只在运行时显示的语言。给内部管理系统做选型时我一般会建议团队直接用 EN 版。原因有两个一是英文资源文件是源头发行的基础资源不会出现翻译漏字或者占位符串位二是如果项目里已经有自己封装的多语言机制控件层用英文反而避免了两套语言资源在运行时打架。等 UI 框架稳定了再让 DevExpress 的dxGetString这类钩子去对接自己的翻译表这样比较稳妥。反过来如果你的客户现场必须全中文那就得找带完整中文字符版本的地发布包。但那个体积通常比 EN 版大不少而且安装时要注意覆盖顺序先装英文版再把中文资源覆盖进去顺序反了会出现窗体上英文中文混杂的奇怪情况。3. 从 7z 解压到 IDE 装配最小安装命令与路径注册细节3.1 用 7z 命令行解压为什么等待进度条不如看退出码拿到“Delphi 13.1控件之DevExpress VCL Controls 26.1.3 EN.7z”后我第一次不会用右键菜单解压而是打开命令行工具直接操作。右键解压在长文件名和中文路径下容易静默失败解到一半说“未知错误”还没有任何日志。用命令行会输出每条文件的处理状态也方便脚本化重跑。Windows 下的最小命令是这样7z x Delphi 13.1控件之DevExpress VCL Controls 26.1.3 EN.7z -oD:\DevLibs\DevExpressVCL -y这个命令里x表示完整解压并保留目录结构不是把文件拍平到一个目录-o指定输出路径注意-o和路径之间不要加空格这是 7z 独有的参数写法-y表示解压时遇到同名文件直接覆盖。如果压缩包带了密码在后面补一个-p密码即可不过记着先确认密码里的字符有没有被输入法改成中文全角。Linux 构建机上解压 7z 文件是另一个常见场景。很多团队会拿这个包在 CI 机器上统一编译这时要用p7zip-full提供的命令行工具sudo apt-get install p7zip-full 7z t Delphi 13.1控件之DevExpress VCL Controls 26.1.3 EN.7z 7z x Delphi 13.1控件之DevExpress VCL Controls 26.1.3 EN.7z -o/home/build/devx7z t是测试模式不实际解压只从头到尾读一遍压缩流校验完整性。这个参数在解压前跑一次最省时间尤其是这份文件可能经过 U 盘、网盘、微信传输多轮拷来拷去很容易在某个环节丢字节。3.2 解压完成后先做三件事再继续第一件事再跑一次7z t确认压缩包本身没有损坏。前面x已经解压过这里主要是确认退出码是0。第二件事打开解压目录下的ReadMe.txt或Install.txt看官方对 Delphi 13.1 的安装顺序有没有特殊说明。第三件事看有没有patches或Hotfix目录如果有先读里面的说明把补丁内容复制到source目录里再开始编译。这三件事看着简单但能拦住后面一半的报错。我碰到过一整个半月都正常的环境重装后突然所有弹出窗体中文变乱码排查到最后才发现是某次解压漏了一个补丁目录里的.res文件。补丁文件通常只是覆盖同名文件不改变安装入口所以容易被人忽略。3.3 挂库与注册包Library Path、Install Packages 和 bpl 的关系DevExpress 的安装在流程上分两步第一步让 IDE 能找到单元第二步注册设计时包。让 IDE 找到单元走 Tools Options Environment Options Delphi Options Library Library Path把source目录、lib\Win32\Release或lib\Win64\Release按需加进去。这个顺序决定 Delphi 在多个目录命重名时先用哪一个一般我会把lib\Win64\Release放在前面省得 IDE 跑去找源码重新编译。注册设计时包走 Component Install Packages Add选中packages\Delphi13.1下编译好的dcl*.bpl。文件名带dcl前缀的是设计时包不带前缀的是运行时包两者区别在于设计时包只给 IDE 开发环境用运行时包给最终用户程序用。这一步如果只装了运行时包组件面板永远不会出现 DevExpress 页签。如果想要命令行一次性把运行时包编译出来可以这样做cd D:\DevLibs\DevExpressVCL\packages\Delphi13.1 msbuild dx.groupproj /t:Build /p:ConfigRelease /maxcpucount:8/t:Build表示按工程文件里的构建配置走/p:ConfigRelease指定产出 Release 版/maxcpucount参数让多核机器并行编译能省不少时间。编译全部完成后重启 IDE组件面板里应该能看到一排DevExpress页签。这里不建议在没编译完时就急着注册 bpl半成品文件会造成 IDE 加载报错之后还得一个个手动清理。4. 用它落地两个高频场景登录界面以及 Delphi 通过数据库实现的 TreeView4.1 先看一眼 DevExpress 控件的命名层次Tcx 前缀和 Express 系列的关系DevExpress VCL 控件的组件名前缀是Tcx比如TcxTextEdit、TcxButton、TcxTreeList。这个前缀下所有组件共享一套绘制引擎外观由cxLookAndFeelController统一控制所以不需要给每个按钮单独设置颜色。和原生 VCL 控件相比区别不是“能不能用”而是“有多少细节要配置”。数据访问层仍然沿用 Delphi 传统的TDataSourceTFDQueryDevExpress 控件只管显示和交互。这一点对上手很重要不要以为装了 DevExpress 就得把所有数据访问组件换掉它只是把视图层替换了。下面两个例子都按这个思路来写先保证原理简单再谈美化。4.2 用 DevExpress 开发一个登录界面TcxTextEdit、TcxButton 的校验与查询登录界面是最容易体现控件库价值的场景因为它是用户对系统的第一印象。用TcxTextEdit替换原生TEdit用TcxButton替换TButton改动量不大视觉效果立刻不一样。下面这段代码处理登录按钮的点击事件procedure TfrmLogin.btnLoginClick(Sender: TObject); var qry: TFDQuery; begin // 先做空值校验让输入框直接变黄提醒 if Trim(edtUser.Text) then begin edtUser.Style.Color : $00CCFFFF; // 浅黄色背景 edtUser.SetFocus; Exit; end; qry : TFDQuery.Create(nil); try qry.Connection : DM.FDConn; qry.SQL.Text : SELECT COUNT(*) FROM sys_user WHERE username :u AND password :p AND locked 0; qry.ParamByName(u).AsString : edtUser.Text; qry.ParamByName(p).AsString : edtPwd.Text; qry.Open; if qry.Fields[0].AsInteger 0 then ModalResult : mrOk else MessageDlg(账号、密码或锁定状态不正确, mtError, [mbOK], 0); finally qry.Free; end; end;这段代码的逻辑是先处理空值再用参数化 SQL 做校验最后按查询结果返回模态框结果给主窗体。参数说明上有三点值得留意第一edtUser.Style.Color是 DevExpress 控件独有的样式属性原生TEdit没有这个属性第二SQL 里用了参数:u和:p避免字符串拼接造成注入风险这在内部系统同样重要第三locked 0是常用的员工状态过滤能拦住“密码对但已被禁用”的账号。另外TcxButton支持在OptionsDialog里配置确认按钮样式但那个是给对话框组件用的普通窗体按钮不需要。想让回车键直接触发登录在edtPwd的OnKeyDown事件里判断Key VK_RETURN时调用btnLoginClick(Self)即可。4.3 用 TcxTreeList 做数据库驱动的 TreeView动态建树和父节点寻址Delphi 通过数据库实现 TreeView 是老需求最原始的写法是递归查询parent_id数据一多就慢。用TcxTreeList时我通常一次把菜单或部门数据查出来在内存里用字典做父节点寻址然后一次性挂到树上去。procedure TfrmMain.BuildMenuTree(ATree: TcxTreeList; AConn: TFDConnection); var qry: TFDQuery; nodeMap: TDictionaryInteger, TcxTreeListNode; id, pid: Integer; node: TcxTreeListNode; begin ATree.Clear; nodeMap : TDictionaryInteger, TcxTreeListNode.Create; try qry : TFDQuery.Create(nil); try qry.Connection : AConn; qry.SQL.Text : SELECT menu_id, parent_id, menu_name FROM sys_menu ORDER BY sort_no; qry.Open; while not qry.Eof do begin id : qry.FieldByName(menu_id).AsInteger; pid : qry.FieldByName(parent_id).AsInteger; // 先创建孤立节点再通过 Parent 属性挂到正确位置 node : ATree.Nodes.AddChild(nil); node.Values[0] : qry.FieldByName(menu_name).AsString; node.Tag : id; nodeMap.Add(id, node); if (pid 0) and nodeMap.ContainsKey(pid) then node.Parent : nodeMap[pid]; qry.Next; end; finally qry.Free; end; finally nodeMap.Free; end; // 数据量大时不要 FullExpand只展开根节点即可 ATree.Root.Expanded : True; end;这里关键点在nodeMap。先用AddChild(nil)创建独立节点再通过node.Parent : nodeMap[pid]重新挂载避免使用递归查找父节点复杂度从 O(n²) 降到 O(n)。node.Values[0]负责把菜单名写入第一列node.Tag存menu_id供点击事件里跳转页面用。最后只展开根节点几万条菜单也不会卡界面。如果数据量确实大到几千、几万考虑把while not qry.Eof整个循环放到后台线程里执行但要注意TcxTreeList的更新必须回到主线程循环里每隔几百条调一次ATree.BeginUpdate和ATree.EndUpdate防止界面闪烁。5. 避坑装完 26.1.3 之后项目里最常见的五个翻车现场5.1 7z 压缩文件密码正确却一直报错问题往往不在密码现象双击压缩包输入密码提示“密码正确”但点解压时立刻报CRC Failed或Data Error换各种解压软件都一样。原因多数情况下压缩包本身在传输过程中已经损坏少数情况是文件名的中文编码在 Windows 和 Linux 之间转换后解压工具找不到目标路径。密码对不对是另一码事报错信息里的CRC Failed已经说明问题在数据完整性上。解决先跑7z t测试压缩包如果输出有错误码回去找原始文件重新拷贝最好通过本地网络共享传别走即时通讯软件。如果测试全部通过把压缩包文件名改成纯英文比如DevExpressVCL.7z再解压到纯英文路径。这一步能同时排除编码和路径两层隐患。5.2 组件面板里找不到 DevExpress 页签装的是运行时包还是设计时包现象Component Install Packages 里能看到勾选项重启 IDE 后工具栏却没有任何 DevExpress 组件。原因大多数情况是包里只注册了不带dcl前缀的运行时 bpl。运行时包只提供功能不向 IDE 注册控件图标设计时包dcl*.bpl才负责把组件放到面板上。解决去packages\Delphi13.1目录里找所有dcl开头的 bpl 文件逐个 Add 到 Install Packages。装完再看组件面板。如果已经有dcl但还是不显示检查 IDE 的缓存目录是不是被清理工具误删过把%APPDATA%\Embarcadero\BDS\13.1下的*.identcache清一遍再重启。5.3 编译报错“Cannot find dcu”Library Path 的搜索顺序和输出目录问题现象代码里uses了cxTreeList编译时提示找不到cxTreeList.dcu。原因Library Path 里加的是source目录里面只有.pas而 DevExpress 编译好的.dcu在lib\Win64\Release或lib\Win32\Release。Delphi 默认在 Library Path 里找.dcu找不到会尝试编译.pas但source目录本身有工程文件依赖很难独立编译成功。解决把lib\Win64\Release或 32 位对应目录加入 Library Path并把它排在 Delphi 自带库路径之后、source目录之前。注意 Win32 和 Win64 的目标文件不能混用换编译目标时去 Tools Options 里确认当前选的是哪个平台。5.4 换机运行时报“无法定位程序输入点”运行时包和位宽不匹配现象开发机运行正常把 exe 考到客户机后启动时报内存地址访问错误或提示找不到某个.bpl/.dll。原因两个常见原因叠在一起。一是只拷贝了 exe没有带 DevExpress 的运行时 bpl二是带的 bpl 位宽和 exe 不一致比如客户机是 64 位系统但拷进去的是 32 位运行时包。解决在项目配置里开启运行时包支持把用到的dx*、cx*运行时 bpl 和 exe 放同一目录。更省事的做法是把需要的包静态链接进 exe在 Project Options Packages 里取消勾选 “Build with runtime packages”然后把单元加入 uses。代价是 exe 体积变大但客户现场再也不缺文件。5.5 安装后 IDE 启动慢、打开窗体卡死全量注册了设计时包现象装完 26.1.3 后Delphi 13.1 启动需要两分钟打开一个有 TcxGrid 的窗体就假死。原因安装时图省事把packages\Delphi13.1下所有dcl*.bpl全部 Add 了。DevExpress 的每个产品线都对应一个设计时包全量注册会让 IDE 一次性加载组件包包括你用不到的图表、报表、富文本编辑器等资源。解决只注册当前项目用到的包。我的最小集合是dcldxTileControl、dclTreeList、dclEditors、dclSkins、dclGrid。有数据库表格再加dclDBTables这类包。如果已经全量注册过打开 Install Packages 逐个取消掉灰色勾选项重启 IDE 即可恢复。6. 进阶玩法皮肤引擎与部署精简一起配好6.1 用 TcxSkins 在运行时切换皮肤一处全局注册DevExpress 的皮肤引擎和部署精简经常放在一起考虑前者影响观感后者影响交付体积。全局注册皮肤是最常见的做法代码放在主窗体的OnCreate里uses cxLookAndFeelController, dxSkinsCore, dxSkinsDefaultPainters; procedure TfrmMain.FormCreate(Sender: TObject); begin cxLookAndFeelController.SkinName : Office2019Colorful; end;cxLookAndFeelController是全局控制组件SkinName一设整个应用所有Tcx控件同步换肤不用逐个设置。注册皮肤包时告诉 IDE 只注册用到的皮肤引擎单元不要贪多把皮肤全部静态编译进去。6.2 部署精简清单发布现场时用下面这个表检查文件是否齐全文件类型说明缺少时的表现exe主程序无法启动cx*.bpl核心控件运行时包提示找不到模块dx*.bpl基础工具运行时包启动即报错*.rxl皮肤资源文件皮肤闪退或恢复默认数据库驱动 dll如fbclient.dll、libmysql.dll连接数据库失败一个我踩过的坑只带了cx系列 bpl没带dx后缀的基础包客户现场双击 exe 毫无反应事件查看器里也看不到有效信息最后逐个补 bpl 才定位到dxCore.bpl。从那以后我养成了习惯每个版本发布前用依赖探测器扫一遍启动 exe 的加载项。把皮肤引擎和部署精简一起配置能省掉现场三分之一的排错时间。希望这部分内容对你跑通 Del本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?