ARTICLE DETAIL

资讯详情

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

DevExpress VCL 14.1.3在Delphi老项目中的安装与集成实践

DevExpress VCL 14.1.3在Delphi老项目中的安装与集成实践 简介这份DevExpress 14.1.3 for D7-XE7组件包面向使用Delphi 7及XE7的桌面与移动端开发者是一套包含数据网格、图表、报表、菜单、工具栏、对话框等常见VCL控件的成熟第三方组件库能显著提升界面开发效率与数据展示效果。Delphi 7是经典的Windows可视化开发工具XE7则加入iOS/Android跨平台支持该版本同时兼容两者适用范围广。压缩包为7z格式整体约190MB内含主安装程序以及附送的DEV汉化Demo便于中文用户对照理解控件属性和事件用法目前文件分类明细未额外提供但安装后即可在IDE中集成使用。已有134人学习下载适合为老版本Delphi项目引入成熟控件体系或借助汉化示例快速上手的中高级开发者。该组件基于原生代码实现运行高效支持数据绑定和多种预设主题可帮助开发者减少重复设计构建外观统一、交互流畅的专业应用。1. 版本选型与适用场景分析1.1 为什么今天还要聊14.1.3说起DevExpress VCLDelphi圈子里应该没人陌生而14.1.3这个版本对不少老工程师来说既是一道坎也是一个宝。我手上维护的几个老系统业务逻辑全跑在Delphi 7上界面却年年要升级——工具栏要换肤、表格要有筛选、列表要支持拖拽客户还总拿它跟各种新软件比。DevExpress VCL 14.1.3就是在这种处境下被我反复选中的版本。它能在D7到XE7之间无缝衔接整个工程迁移过去不用重写控件层这在组件界相当难得。为什么不用更新的版本原因很直接DevExpress从15.x开始逐步收紧对老IDE的支持15.2虽然还能勉强装进D7但已经出现设计器不稳定、编译出来的DCU体积异常等问题到16.x干脆正式移除了D7和2007的支持。所以只要是还坚持留在D7的老项目14.1.3基本就是最合理的落点。它覆盖Delphi 7、2005、2009、2010、XE、XE2、XE3、XE4、XE5、XE6、XE7整条产品线恰恰横跨了从AnsiString到UnicodeString的完整过渡期这在选型时是个非常重要的加分项。1.2 D7到XE7的兼容矩阵不同IDE版本编译出的DCU文件是互不兼容的DevExpress的做法是每个版本单独出一套DCU和BPL。下面这张表是我实际整理过的兼容情况方便你判断自己该用哪个安装模式IDE版本字符串类型Win32/Win6414.1.3支持度建议DCU目录Delphi 7AnsiStringWin32完整支持Sources\D7\Delphi 2007AnsiStringWin32完整支持Sources\D2007\Delphi 2009UnicodeStringWin32完整支持Sources\D2009\Delphi XE2UnicodeStringWin32/Win64完整支持Sources\DXE2\Delphi XE7UnicodeStringWin32/Win64完整支持Sources\DXE7\如果一台机器上同时装了D7和XE7安装器会分别检测并注册各自的设计期包两个IDE互不干扰。但要注意工程文件里的搜索路径必须跟IDE版本一一对应不能图省事让D7去用XE7的DCU否则编译时报的“F2613 DCU版本不匹配”会让你怀疑人生这一点在后面的排查章节我会专门展开。2. 安装部署全流程2.1 安装前的系统检查装DevExpress VCL之前一定先确认三件事。第一把正在运行的Delphi IDE全部关掉包括BDS、bds.exe的进程设计期包注册时要往IDE里写注册表IDE占用着文件会导致注册失败。第二杀毒软件最好暂时退出或者至少把安装目录加入白名单14.1.3的安装器会大量编译生成BPL和DCU实时防护扫描会拖慢速度极端情况下还会误删未注册的临时文件。第三右键选择“以管理员身份运行”。安装包本身建议从官网下载完整的离线安装包体积通常在几百MB包含了所有子产品。如果你只需要其中的ExpressQuantumGrid和ExpressSkins安装时选择自定义组件即可不必全部安装。我自己的经验是先装全家桶装完再根据发布需求裁剪因为后面换肤、打印、报表说不定哪一天就用上了省得返工。2.2 安装器自动编译与IDE注册安装器跑起来后会先解压组件源码到默认目录通常是C:\Program Files\DevExpress 14.1\VCL然后自动检测所有已安装的Delphi版本并为每个版本编译对应的DCU、BPL再注册到IDE里。整个安装过程最长的是编译环节十几分钟到半小时都正常期间不要切出去乱点。安装完成后首次打开Delphi组件面板会多出ExpressQuantumGrid、ExpressBars、ExpressSkins、ExpressEditors等页签。如果打开IDE后组件面板没有变化先别急着重装检查IDE的Component Install Packages列表里是否出现了DevExpress相关的设计期包。如果包已经列出但控件没显示常见的坑是IDE缓存把%APPDATA%\Embarcadero\BDS\7.0\Closed Tools\或对应版本目录下的临时文件清掉再重启。安装器在D7上的表现通常不如在新版XE系列上顺滑因为D7的注册表项和路径规则比较古老安装器偶尔会漏写Library路径。这时不用慌用手工编译的方式补上就行这正是老Delphi工程师的基本功。2.3 手工编译的兜底方案安装器失败或者内网环境无法用安装器的场景我遇到过不止一次。兜底方案是手动打开包文件编译路径在C:\Program Files\DevExpress 14.1\VCL\Sources\下每个子产品都有一个或多个.dpk文件。打开一个工程组.dpg后逐个右键选择Compile和Install。对于D7建议先编译运行时包再编译设计期包。运行时包的名字一般是cxLibrary.dpk、cxGrid.dpk、dxSkins.dpk这类设计期包以dcl开头比如dclcxLibrary.dpk、dclcxGrid.dpk。编译顺序很重要先底层库后高层控件否则会出现找不到cxClasses.dcu的错误。手工编译时还要确认输出目录。在D7的Project Options Directories/Conditionals里把Package output directory指向一个统一的Bin目录比如C:\DevExpress14\Bin然后把该目录同时加入系统PATH。设计期包注册成功后Delphi会提示“Package installed successfully”组件面板随即刷新这一步走通后面就顺畅多了。3. 工程集成与运行时配置3.1 搜索路径与DCU管理组件装好只是第一步真正让工程能编译还得把DCU和源文件路径配好。在D7中打开Tools Environment Options Library Library Path把DevExpress的Sources目录加进去。注意这里加的是Sources根目录因为组件内部有大量uses引用DevExpress把公共单元都放在Sources层按子目录组织IDE在编译时能自动递归查找。我习惯把路径按明确顺序排列先写Sources根目录再写Lib目录避免多个版本源文件互相干扰。DCU的管理是另一个容易翻车的点。DevExpress 14.1.3安装器会为每个IDE版本生成对应的Lib\D7、Lib\DXE7这类目录编译输出默认也指向对应分支。如果你手工编译过一定要保证IDE搜索路径里的DCU和当前编译器版本一致千万别手滑把D7的DCU目录放在了XE7工程前面否则一连串“Unit cxGrid was compiled with a different version of cxClasses”会彻底打断你的节奏。强烈建议在每个IDE的Library Path里只保留当前版本的输出目录并且把其他版本目录从路径中删除。3.2 运行时包的分发策略开发期用设计期包发布时则要决定用运行时包还是静态链接。运行时包模式下exe体积小但客户机器上必须安装对应的BPL和DLLDevExpress 14.1.3的运行时包依赖关系比较复杂比如cxGrid依赖cxLibrarycxLibrary又依赖dxTheme。我踩过的坑是只拷贝了cxGrid的BPL结果客户机器上一运行就报“无法找到cxLibrary.bpl”。解决方法是写一个小工具遍历工程引用的BPL名称然后把DevExpress Bin目录下所有同名BPL一次性复制到程序目录或系统目录。如果不想管BPL也可以选择静态链接。在Project Options Packages中取消勾选“Build with runtime packages”编译后所有控件代码打进exe体积增加十几MB但部署简单U盘拷走就能跑。对于老旧的D7项目我的经验是尽量用静态链接因为D7程序在客户那边的运行环境五花八门少一个外部依赖就少一个故障点。4. 客户端事件与常用开发场景4.1 客户端事件模型的理解搜索“DevExpress clientside event”经常能看到这个词但在VCL体系里它并不是Web开发中那种浏览器端事件而是指控件在应用客户端进程内触发的事件处理机制。换句话说所有界面交互响应都在用户桌面端的程序里直接完成不需要请求服务器也不涉及网络往返。对习惯了Web开发的人来说这个概念要注意区分别在Delphi里找什么“客户端脚本”那是不存在的。真正重点掌握的是DevExpress控件的事件分类。以cxGrid为例最常用的是OnCellClick、OnCellDblClick、OnCustomDrawCell、OnCustomDrawColumnHeader以及Styles.OnGetContentStyle。这些事件的运行机制和标准VCL事件类似但提供了更细粒度的机会比如在OnCustomDrawCell里你可以拿到ACanvas、AViewInfo直接画底色、画图标实现“条件高亮”这类在标准TDBGrid里要写一堆代码的效果。4.2 cxGrid实现条件高亮示例下面这段代码是我项目里用了很久的条件高亮处理它会在数量小于安全库存时把对应行的单元格背景刷成浅红色procedure TForm1.cxGrid1DBTableView1StylesGetContentStyle( Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out AStyle: TcxStyle); begin AStyle : nil; if ARecord nil then Exit; if AItem cxGrid1DBTableView1Qty then if ARecord.Values[cxGrid1DBTableView1Qty.Index] 10 then AStyle : cxStyleRed; // 在cxStyleRepository中预定义 end;这里的ARecord.Values[索引]是直接取单元格值无需访问数据集效率比通过DataSet字段反查高得多。cxStyleRed可以预先放在cxStyleRepository里设好颜色和字体运行后整行的内容样式都能统一应用。这就是DevExpress相对标准控件的核心优势数据和表现分离事件钩子多定制能力强。4.3 与老数据库工程联动老工程最典型的形态是ADO连接SQLServer或Access窗体上放一个TADOTable加TDataSource再挂cxGrid。这个组合下DevExpress的DB-Aware模式依然好用把View的DataController.DataSource指向DataSource即可。一个容易忽略的点是当TADOTable在D7下使用AnsiString时中文显示容易乱码而DevExpress已经做了内部Unicode转换所以界面显示反而比原生DBGrid更稳定。数据刷新时建议使用cxGrid1DBTableView1.DataController.DataSource.DataSet.Refresh或者用DataController.Refresh不要直接调用GridView.Refresh后者在某些版本下会触发设计期绘制异常。这个区别我是在一次现场演示时踩出来的客户数据量大直接刷新界面闪白换成DataController刷之后就丝滑了。5. 踩坑实录与问题排查5.1 安装期问题速查我把这些年遇到的高频问题整理成一张速查表方便大家直接对照报错或现象根本原因解决方案安装器检测不到Delphi 7注册表IDE路径损坏或安装器权限不足手动打开.dpk编译或用管理员身份安装组件面板无DevExpress页签设计期包未注册或IDE缓存异常检查Install Packages列表清理IDE缓存打开窗体报“Class TCxGrid not found”发布机或同事机器缺少设计期包重新安装组件确保dcl开头的包已注册编译报“无法找到cxClasses.dcu”Library Path未配置或配错版本目录添加Sources根目录核对IDE版本安装期的问题大多数不是安装包损坏而是路径和权限。曾经有一台64位Windows Server上的D7安装器一直无法把BPL写到系统目录后来发现是UAC把重定向到了虚拟存储。解决办法是把DevExpress Bin目录单独建在D盘并且给D7的快捷方式设置“以管理员身份运行”。5.2 编译期问题排查编译期最让人头疼的是“Unit was compiled with a different version of”这类错误。这个错误的本质是工程里混用了不同版本编译出的DCU比如引用路径中D7和XE7的DCU目录同时存在或者旧的DCU没有清理干净。排查步骤可以按顺序来先看Library Path里是否有多个DevExpress目录再看工程文件里是否有绝对路径指向旧的Lib目录最后把整个工程里所有.dcu临时文件删掉重新编译一次90%的问题能在这个环节解决。还有个隐蔽问题是在D7里用到了XPStyleManifest或者WinXP主题相关单元时如果顺序不对会报F2048错误。DevExpress的控件在主题支持上依赖uxtheme.dllD7下需要把Themes单元放在uses列表的最前面。老程序员通常写成uses Windows, Messages, ...没注意顺序编译就挂了。调整之后问题立消这个细节写进很多项目的注释里新手往往不知道。5.3 运行期问题记录运行期最经典的问题有两个。第一个是换肤后程序界面所有字体变小这是因为ExpressSkins的默认字体设置跟老工程不一致。解决方法是在程序启动时设置dxSkinsUserSkinPath并显式指定GetCurrentSkin同时覆盖每个窗体的Font.Name和Font.Size。第二个问题是网格在滚动时闪烁老显卡机器上特别明显可以在cxGrid1DBTableView1.OptionsView里开启OptimizedDraw性能提升立竿见影。另外提醒一句D7工程的字符串处理一定要谨慎。如果你在D7和XE7之间共享代码event handler里用String(0)或直接操作PChar的地方都要标注出来DevExpress 14.1.3完美兼容两套字符串体系但这些边界处理如果没有做好在XE7下运行时会悄悄产生乱码等到客户发现再来排查往往已经过去很久。根据我个人经验把这套14.1.3用顺之后最值得投资的时间是仔细读一遍cxGrid的事件说明。它值得不是安装时看而是真正做业务时逐个验证明白了事件触发顺序和DataController的关系后面处理大数据量、排序、筛选、分组这些需求都会从容很多。最后再分享一个小技巧编译发布版之前记得在Project Options Compiler里把Optimization打开老版本控件配合优化开关在某些数据密集型界面上能有20%左右的性能提升这个收益几乎白捡。本文还有配套的精品资源点击获取
返回列表