ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DevExpress VCL 20.2.4 + RAD Studio 10.4 桌面开发实践指南

DevExpress VCL 20.2.4 + RAD Studio 10.4 桌面开发实践指南 简介DevExpress VCL 20.2.4 for RAD Studio 10.4 是官方预编译的 VCL 组件发行包专为在 RAD Studio 10.4 下使用 Delphi/C Builder 开发桌面程序的开发者准备适合希望快速获得稳定控件版本、又不愿自行编译源码的团队或个人。压缩包采用 7z 格式整体大小约 362MB核心内容包括预编译组件安装文件、运行时 BPL 包以及 RuntimePackages.txt 配置清单解压后即可按说明使用。由于此版本未附带 DCU 文件构建时需要先在项目 Options 中启用 Link with runtime并将 RuntimePackages.txt 列出的包名加入运行时包列表应用即可正常编译和分发。目前已吸引 1957 人学习或下载验证了其实际可用性。如果你需要深度定制或希望用源码自行编译资源作者还提供了关联的 DevExpress VCL 19.1.2 源码与 DxAutoInstaller 编译方案可作进阶参考。 做RAD Studio 10.4下的桌面开发如果你还没碰过DevExpress VCL那真的是错过了一套能节省大量时间的组件库。最近我把项目从老的RAD Studio版本升级到10.4同时把DevExpress VCL组件也升到了20.2.4整个过程踩了不少坑也整理出了一些实用经验今天一次性分享出来。这套组合DevExpress VCL 20.2.4 RAD Studio 10.4目前是很多存量桌面项目的主流搭配尤其适合做数据密集型业务系统进销存、ERP客户端、医疗管理系统、财税软件等等。我自己的项目就是一套进销存系统界面复杂度高、表格交互多、报表要求严苛用上这一套组件之后开发效率确实提升了一大截。如果你正在规划新项目或者准备把手头的老项目升级到10.4这篇文章基本能覆盖你会遇到的大部分问题。1. 版本匹配与选型思路1.1 为什么选择20.2.4这个版本先说结论DevExpress VCL 20.2.4是官方明确支持RAD Studio 10.4的版本系列之一两者配合在稳定性、编译速度和运行时表现上都比较成熟。开发工具最怕的就是版本代差RAD Studio 10.4发布后DevExpress很快就推出了适配的20.2.x系列其中20.2.4作为该系列的维护更新版修复了大量早期反馈的bug属于“可以放心用于生产环境”的版本。选版本不能只看新不新得看兼容性和社区反馈。DevExpress的版本迭代速度很快每隔几个月就会出一个新小版本。但过于新的版本往往会引入一些需要时间沉淀的改动对于正在维护老项目的团队来说20.2.4这种已经经过几轮修复的稳定版反而是最优选择。我在升级前专门去查过官方社区和第三方论坛的讨论20.2.4在10.4上的运行报告普遍是正面的。还有一点值得注意DevExpress安装包会针对不同版本的RAD Studio分别提供对应的编译单元。20.2.4支持从Delphi 10.3到10.4的多个IDE版本所以如果你还没升级到10.4但这个版本安装时也能识别你当前的IDE环境并安装对应的编译组件有一定前瞻性。1.2 常见误区Delphi 7 DCU问题的来龙去脉很多老Delphi开发者问过我类似的问题“我还在用Delphi 7能不能直接安装DevExpress VCL 20.2.4”说实话每次听到这个问题我都很理解因为存量Delphi 7项目确实还有不少。但答案是明确的不行。Delphi 7是2002年发布的它的编译器、RTL和运行时模型和现代RAD Studio差异巨大。DevExpress VCL 20.2.4源码中使用了大量现代Delphi语法特性比如泛型、匿名方法、新式记录类型等Delphi 7根本无法编译。而且安装包内提供的.dcu文件是根据新版本编译器生成的拿到Delphi 7里直接报“DCU版本不匹配”错误。如果你真被Delphi 7项目绑住了我给两条建议一是考虑逐步迁移先把项目拆分成框架层和业务层再用RAD Studio 10.4重新编译最后再引入DevExpress组件二是如果实在没法升级IDE那就继续用老版本的DevExpress VCL比如6.x系列别强行用新版本。没有任何正规渠道能让20.2.4在Delphi 7里跑起来网上讨论的“转换DCU”路子我也试过最终都以各种编译错误告终不值得浪费时间。1.3 与.NET版、其他VCL组件库的差异化定位DevExpress有两条产品线WinForms/ASP.NET.NET平台和VCL原生Windows平台。很多从.NET转过来的朋友容易混淆以为VCL版只是一个“换皮”实际上两者差异非常大。VCL版完全建立在Delphi/CBuilder的原生运行时之上没有.NET运行时依赖生成的可执行文件在启动速度和内存占用上都有明显优势这对于需要部署到老机器、或对性能敏感的业务场景很关键。和另外几套VCL组件库相比DevExpress VCL的特点在于控件覆盖面和样式系统。TcxGrid网格组件几乎能实现你能想到的所有表格交互场景而自带的皮肤系统Skin可以让界面在视觉上直接对标现代WinForms应用。我见过不少团队为了追求现代感用第三方皮肤库配合基础VCL控件结果光是对齐和重绘就耗掉大量工时。用DevExpress直接一套搞定省下来的精力可以放在业务逻辑上。2. 安装部署与项目迁移实战2.1 安装前必须做的事先别急着双击安装包有几步准备工作没做的话后面各种诡异问题会源源不断。首先是关闭RAD Studio IDE。这不算什么高深技巧但真的有人忽略。如果IDE还在运行安装程序注册新组件包.bpl时可能会失败而且IDE的缓存状态会导致安装后控件面板刷不出来。我习惯在安装前彻底重启一次系统确保没有残留的IDE进程和内存锁。其次是备份现有的项目配置。如果你要在一个已经装了旧版DevExpress的环境上升级强烈建议先把旧版本的安装完全卸载干净。我遇到过因为新旧组件包共存导致编译时找到重复的类定义报出一大堆“Duplicate class”错误的案例。卸载干净后最好再手动检查一下系统盘的Embarcadero目录和DevExpress安装目录确认没有残留文件。最后确认你的RAD Studio 10.4已经打上了最新的官方补丁。DevExpress的安装程序在检测IDE版本时有时候会因IDE自身的补丁状态而出现兼容性提示。保持IDE处于最新状态能减少不少莫名其妙的问题。2.2 安装过程中的组件选择策略安装程序会让你选择要安装到哪些IDE版本下这一步要格外仔细。如果你的机器上同时装着RAD Studio 10.3和10.4务必只勾选你实际要使用的那个版本。两个版本都勾选也不是不行但会额外增加编译时间而且在IDE的Component菜单中会出现重复项极容易混淆。组件选择界面里有一堆按功能划分的组件组默认是全选的。针对一般业务开发我建议保持默认全选因为DevExpress VCL的组件之间本身有耦合关系比如cxGrid依赖cxCustomData、cxLibrary等基础单元。如果你为了省空间只选了部分组件编译时常常会报找不到某个.dcu文件这时候再回头补装反而麻烦。安装时间一般需要十几分钟到半小时不等取决于机器性能和是否全选。装完以后打开RAD Studio你会看到工具箱里多出了几十个新的控件图标到这里安装这一关就算过了。2.3 从旧版本迁移项目的关键步骤把老项目的.dproj文件用新版IDE打开如果你是从DevExpress VCL旧版本迁移到20.2.4大概率会碰到编译错误。常见的错误包括某个组件的属性或方法签名变了、某个事件处理器的参数类型变了甚至某个控件被移除或被合并。我处理这类迁移问题的经验是先编译再逐条处理错误不要一开始就大面积重写代码。编译器的错误信息会清楚地告诉你“找不到成员”还是“类型不匹配”针对每一条搜索DevExpress官方文档里的兼容性说明。大部分情况下改动都是局部的比如某些事件处理器参数从Integer换成了NativeInt或者某个集合属性的默认值变了。一个比较实用的技巧是迁移前先记录旧的DevExpress版本号然后去官网查看两个版本之间的升级指南Migration Notes。这些文档里会专门列出所有破坏性变更Breaking Changes提前知道了你能少走很多弯路。3. 核心控件实操与核心事件机制3.1 cxGrid表格组件的性能与交互调优cxGrid是DevExpress VCL里最核心、也是用得最多的控件没有之一。它完全取代了传统的TDBGrid但这也意味着你不能用老思路去用它。最明显的变化是“数据感知”的层次结构cxGrid由几个独立的层次组成Level每个Level承载一个ViewView在绑定数据集之后才能正常工作。我强烈建议把cxGrid的数据源用DataSource组件来连接而不是直接给View绑定一个DataSet。这样做的优势在于多个View可以共享同一个数据源且View的视图状态如排序、过滤与数据源解耦便于你为不同场景配置不同的显示方案。处理大数据量比如几万行的业务流水时有两个关键设置View的OptionsData里开启Controller模式并把Customizing的行高缓存打开还有OptionsView里的ColumnAutoWidth不要滥用否则每列会被强迫拉伸到相同宽度。实测下来最影响性能的是滚动时的重绘如果开启了“据行绘制”的自定义绘制事件OnCustomDrawCell注意绘制代码里不要做太重的计算否则滚动会明显卡顿。3.2 客户端事件机制的正确理解与使用关于DevExpress VCL的“客户端事件”很多人会联想到Web开发中的客户端事件。事实上VCL版没有浏览器环境但它的事件模型里有一些事件是发生在控件内部“缓冲区状态”变化时的比如单元格编辑开始前、校验失败后、下拉框弹出时等。这些事件虽然名字不叫“客户端事件”但从触发时机上看非常类似于前端开发中的客户端交互事件。举几个我经常用的事件TcxGrid里的OnEditValueChanged、OnBeforePost、OnAfterPostTcxLookupComboBox的OnCloseUp和OnInitPopupTcxDateEdit的OnChange。它们的共同特点是不依赖数据库操作而是在控件交互层面即时响应非常适合做动态联动、输入校验和界面上即时计算。实际开发中的典型场景是在一个单据录入界面上用户选择客户之后自动带出客户对应的默认税率和结算方式填完数量之后金额合计立即刷新。这些都是通过控件的交互事件实现的效率和用户体验都要远好于“每次修改都提交数据库再回填”。3.3 数据录入控件的联动技巧与格式化DevExpress VCL的编辑器TcxTextEdit、TcxLookupComboBox、TcxCalcEdit等统一放在“Common Controls”分类下它们都实现了IcxEdit接口。这个接口是联动和校验的关键。举个例子你要实现“当用户在备注框里输入特定字符时状态栏显示提示信息”用IcxEdit接口遍历窗体上的所有编辑器不需要逐个控件写事件。用代码块呈现这个思路procedure TForm1.HandleEditorsFocused; var i: Integer; AEdit: TcxCustomEdit; begin for i : 0 to ComponentCount - 1 do begin if Components[i] is TcxCustomEdit then begin AEdit : TcxCustomEdit(Components[i]); if Supports(AEdit, IcxEdit) and AEdit.Focused then AEdit.Properties.OnChange : MyGlobalChangeHandler; end; end; end;这种全局处理方式在多个编辑器需要统一联动逻辑时特别好使能省下大量重复代码。此外关于数据格式化TcxCalcEdit的DisplayFormat和EditFormat有着不同的职责DisplayFormat决定显示效果比如千分位、货币符号EditFormat决定输入时的格式提示。很多人只设置了DisplayFormat结果在编辑时看到一堆乱七八糟的原始数字就是因为不明白这两个属性的分工。4. 常见问题与排查技巧实录4.1 安装后组件面板找不到控件这是升级后最频繁遇到的问题处理思路要分两步走先确认组件包有没有被正确安装再检查IDE的缓存。打开RAD Studio后点击“Component”菜单下的“Install Packages”在列表里找到DevExpress相关的运行时包bpl和设计时包dcp确认它们是勾选状态。如果列表里根本找不到DevExpress相关包说明安装程序没有正确执行注册需要回到安装程序选择“Repair”模式重新安装。如果包已经勾选但工具箱没有控件可以试试关闭IDE删除用户目录下的组件缓存文件通常是“.dsk”或“.identcache”文件然后再重新打开IDE。这两个文件的损坏会导致IDE无法加载新组件删除后IDE会自动重新生成不影响项目代码。4.2 编译时找不到DCU文件这个错误十有八九是搜索路径没配好。打开你的项目选项找到“Delphi Compiler”下的“Search path”确认已经包含了DevExpress VCL的源码路径或编译好的.dcu路径。安装包默认会在公共文档目录如“C:\Users\Public\Documents\DevExpress VCL\Library\RS104”下生成对应IDE版本的库文件路径中的RS104是RAD Studio 10.4的代号。注意一点如果同一台机器装了多个RAD Studio版本路径里的RS编号会不一样千万别把10.3的路径填到10.4的项目里。4.3 运行时皮肤不显示或界面错乱皮肤系统是DevExpress VCL的一大卖点但也是问题高发区。最常见的状况是界面跑起来了但看起来还是Windows经典样式皮肤完全没生效。处理方式很直接确认在执行代码中调用了TdxSkinController控件并把其NativeStyle设置为False再把ActiveSkin设置为目标皮肤名称。如果皮肤生效但部分控件显示异常比如字体偏大、间距错位十有八九是DPI兼容问题。在RAD Studio 10.4的项目选项里把“High DPI Support”相关选项打开并在代码中设置Application的DPI感知模式。DevExpress VCL从20.2版本开始对高DPI做了很多适配如果你没打开项目的高DPI选项控件在高分辨率屏幕上就会出现缩放错乱。为了快速定位问题你可以用下面的代码在程序启动时主动设置DPI感知procedure TForm1.FormCreate(Sender: TObject); begin if CheckWin32Version(6, 0) then SetProcessDPIAware; end;但注意这是标准VCL环境的兼容做法如果用了DevExpress皮肤推荐在项目文件里调用TdxSkinController的DPI相关属性这样适配更彻底。这里只是一条基础保底代码标准Win32环境完全够用。4.4 常见问题速查表现象可能原因解决方法组件面板空白组件包未正确安装重装/修复检查Install Packages编译报“找不到dxCore.dcu”库搜索路径缺失在Project Options中添加DevExpress Library路径界面无皮肤效果未配置TdxSkinController设置NativeStyleFalse指定ActiveSkin高分辨率下字体错乱DPI感知未开启开启项目高DPI选项设置DPI感知表格滚动卡顿自定义绘制代码过重优化事件代码避免频繁复杂计算编辑器显示格式不对DisplayFormat与EditFormat混淆分别设置显示与编辑格式5. 性能优化与部署注意事项5.1 编译产物体积与运行时依赖DevExpress VCL的组件包在静态链接的情况下会让你的可执行文件体积明显增大这是正常的。一个包含了cxGrid、皮肤系统、报表模块的程序生成出来的exe很容易达到几十MB甚至更大。如果你对体积敏感可以考虑在发布时采用运行时包Runtime Packages的方式把DevExpress的bpl文件作为动态链接库随程序一并发布这样主exe会小很多但需要额外注意版本一致性和分发配置。个人建议一般业务系统没必要过分追求exe瘦身静态链接反而是最省心的部署方式省去了一堆dll/bpl版本不匹配的麻烦。如果你的项目对体积特别敏感比如需要通过安装包分发且安装包本身有大小限制那再考虑动态包方案。5.2 部署时的可再发行组件和授权注意把编译好的程序复制到一台没装过RAD Studio的干净机器上如果用的是静态链接通常直接就能跑。但如果用了运行时包则必须把对应的bpl文件一起复制过去。这里有一个容易遗漏的点即使你的主程序是静态链接的如果程序中动态加载了某些第三方dll比如利用DevExpress的报表导出功能时可能需要特定的dll也要一并带上。DevExpress VCL的授权机制是基于开发环境的也就是说你在开发环境下编译的程序分发到用户机器上不需要额外的激活过程这部分是合法的、正规的授权方式。但注意不要在你的项目中非授权传播那些设计时组件包这涉及到商业授权问题。分销软件开发时务必确认你持有的DevExpress授权许可覆盖了目标分发场景。5.3 升级到更高版本RAD Studio的衔接问题如果你计划未来进一步升级RAD Studio版本比如升到12或更新的版本现在就要保持一个习惯不要直接修改DevExpress默认的组件包配置也不要把项目文件里写死具体的IDE路径。尽量用环境变量或相对路径来管理库搜索路径这样升级后只需要重新编译安装一遍DevExpress项目本身的改动成本会非常低。我自己的项目在10.4上用了一段时间后试过迁移到更高版本做预研唯一让我庆幸的就是项目代码没有过度依赖老版本的私有API迁移过程只花了半天时间就编译通过这个习惯帮了大忙。6. 总结与经验说了这么多最后谈谈个人的真实体会。用DevExpress VCL开发桌面业务系统最大的收益不是“酷炫”而是稳定高效。它把表格、输入、皮肤这些最耗费精力的边界处理帮你封装好了你能把时间用在真正的业务逻辑上。但同时它也强迫你重新审视你的代码习惯。以前写TDBGrid时直接关联数据集就完事换成cxGrid后你必须理解View、DataSource、DataController之间的关系否则连显示一列数据都会出问题。这种“不适感”恰恰是进步的契机。我的实用建议是新项目可以放心大胆地用这套组合老项目迁移则要提前做好规划特别关注版本间的破坏性变更。对于打算用DevExpress VCL 20.2.4 RAD Studio 10.4的朋友我的建议是先拿一个小模块做试点跑通一遍安装、编译、运行、部署的完整流程再逐步铺开。另外遇到问题务必先去查官方文档里的兼容性说明和升级指南那里面的信息比任何论坛都可靠。最后再分享一个小技巧在做DevExpress相关开发时用IDE的调试功能配合运行时诊断能大幅提升排查效率。比如在一个事件处理器里临时加一个OutputDebugString调用可以清晰看到这个事件在什么时机被触发各参数的实际值是多少。这个办法在处理复杂联动逻辑时特别有用比单纯断点调试更直观。希望这篇文章能帮大家少踩一些坑用这套组合开发出高效稳定的业务系统。本文还有配套的精品资源点击获取
返回列表