尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

EhLib 11.0.21在Delphi 12中的安装实战与常见问题排查

EhLib 11.0.21在Delphi 12中的安装实战与常见问题排查 简介EhLib 11.0.21 - D12是一套专为Delphi 12开发者调优的高性能VCL界面控件库聚焦数据网格、多类型图表、数据库绑定、打印与导出等高频需求适合快速构建报表系统、MIS管理界面和数据密集型桌面应用。控件支持设计期高度定制可调整网格行列、图表配色与报表布局运行时提供排序、过滤、分页、批量导出等交互能力减少重复开发工作量。资源包共收录2000个文件压缩包大小67.79MB文件类型覆盖519个dfm窗体布局、293个pas核心源码、196个dproj工程定义、170个dpk包描述以及chm帮助、docx文档、ico图标、png图片等素材既可直接安装组件也可对照示例代码与帮助文档快速上手。目前已有1407人学习下载适合有一定Delphi基础、希望减少界面开发量并提升用户体验的开发者在实际项目中直接复用。 老Delphi玩家的工具箱里控件库这东西从来不是“装上一个包然后一直用到老”那么简单。尤其是做数据库应用的人提到第三方表格控件几乎绕不开EhLib这个名字。前阵子我把项目迁到RAD Studio 12上第一件事就是把EhLib升到11.0.21这个专门标注D12兼容的版本中间踩了不少坑也把安装顺序、路径配置、运行期报错都摸了一遍。这篇文章就当一份安装与实战备忘给正准备升级IDE、或者还在纠结要不要用第三方网格控件的朋友做个参考。1. 为什么在Delphi 12还值得配置EhLib1.1 原生DBGrid做不到的那些事Delphi自带的TDBGrid够轻够快但真到做业务系统时你会很快发现它太“素”了。客户要的表格通常长这样点列头能下拉筛选、底部有合计行、某些列是关联下拉选择、导出成Excel时不能乱码甚至还要多行表头、单元格合并、分组统计。这些东西用原生DBGrid做不是说做不出来而是要自己写一堆事件、画布绘制和临时组件维护成本极高。EhLib 11.0.21给VCL开发者提供的就是一套开箱即用的解决方案。它的核心组件TDBGridEh在原生网格基础上做了大量增强自动筛选行、字段汇总脚、多级表头、下拉过滤、排序指示、树形结构展示、导入导出接口全都有。换句话说它把Excel里常用的那些表格交互搬进了Delphi而且是纯VCL组件不额外引入重框架这对老项目迁移特别友好。1.2 版本号里的门道为什么认准D12EhLib的版本号和Delphi版本绑定得很紧。11.0.21这个版本标的D12意思是官方已经针对RAD Studio 12的RTL、编译器特性和包格式做过适配。这里有个容易踩的坑拿旧版EhLib硬装到新IDE上虽然解压、加路径都顺利但编译时往往直接报“Unit not found”或者一连串的HPPEMIT错误。为什么第三方控件必须跟着IDE版本走因为Delphi的RTL头文件、System单元、Winapi声明在不同版本间有差异控件源码如果调用了被废弃的API或者引用了旧的结构体在新编译器下就过不去。EhLib这种大型控件库内部对Windows API的封装很多官方不做适配自己改起来非常痛苦。所以我个人的建议是既然官方打了D12的适配包就老老实实用11.0.21别为了“省事”沿用老版本。1.3 安装成本其实不高但顺序错了很折腾很多人一听第三方控件就头大觉得要改一堆环境变量、编译半天。实际上EhLib 11.0.21安装不复杂核心就三步解压源码包、编译运行时包、安装设计时包。真正烦人的是顺序问题——先装哪个包、后装哪个包、路径加不加对直接影响后续使用体验。我把安装前后需要确认的事项整理成了表格照着检查一遍基本不会翻车阶段要确认的事项安装前IDE已关闭旧版EhLib路径已从Library路径移除项目源码有备份安装中运行时包先编译设计时包后InstallWin32和Win64都Build安装后组件面板出现EhLib页签Library路径优先级正确新建项目拖一个TDBGridEh测试2. 上手安装从解压到组件面板出现2.1 环境准备与备份开始前先把RAD Studio 12完全关掉一个实例都不要留。接着建议把当前项目里所有引用EhLib旧版本的搜索路径删干净否则后面编译新项目时编译器可能优先找到旧目录里的DCU产生一堆莫名其妙的类型不匹配。然后是备份。因为EhLib类组件分布在很多单元里万一你项目里同时用了旧版升级后可能会出现属性变化、方法签名不同这类问题。我曾经因为没有备份升级后有个自定义排序事件编译不过改了半天才想起来OldGrid是旧版专属写法。所以别嫌麻烦先把整个项目目录压缩一份放旁边出问题能随时回退。源码解压路径也有讲究。建议放到一个纯英文、无空格的固定目录下比如D:\Components\EhLib。放在包含空格或中文的路径里虽然现代IDE大多能处理但个别第三方构建工具、脚本会在路径解析上出幺蛾子。我见过一个同行把控件装到桌面结果每次打开项目都要重新查找源文件就是因为路径里带着特殊字符。2.2 包编译的正确顺序EhLib 11.0.21安装包里通常会配套好按Delphi版本区分的子目录进入对应D12的目录后你会看到两类包一类是运行时包不带设计时注册逻辑一类是设计时包带Dcl前缀或者Install标识。我的编译习惯是这样的先打开运行时包项目在Project Manager里切到Win32平台执行Build。注意是Build不是CompileBuild会把所有引用的源码重新编译一遍确保当前IDE环境下的DCU是最新的。然后再切到Win64平台同样Build一次。之后打开设计时包右键执行Install。顺序为什么不能反因为设计时包要引用运行时包导出的符号。如果运行时包还没编译好Install时就会报“Cant load package”或者找不到类名更奇怪的是组件面板上可能会显示一个灰色不可用的条目。最稳妥的办法就是严格执行先运行时后设计时。2.3 路径配置这步别偷懒很多人在这一步偷懒结果新建项目时从组件面板拖控件没问题一编译就报找不到单元“DBGridEh.pas”。这是因为拖控件时IDE加载的是BPL包里已经编译好的类但项目编译时需要根据源文件重新定位这些单元。所以必须在Tools Options Language Delphi Library Library paths里把EhLib的关键源码目录加进去具体包括Common目录、DBGridEh目录这类包含核心单元的文件路径。这里我强烈建议用环境变量或IDE别名的方式配置路径而不是写死绝对路径。比如设置一个EHLIB_ROOT环境变量然后路径写成%EHLIB_ROOT%\Common。这样以后换目录或者升级版本只需要改环境变量不用全局搜索替换。2.4 64位项目的附加操作Delphi 12默认支持64位编译但很多人在装了控件后会发现32位编译正常切换Win64后直接编译失败。原因很简单控件的运行时包没有编译64位版本。虽然设计时组件是在32位IDE里运行的但你的程序在64位平台下需要对应64位的DCU和BPL。解决办法就是上面说的在包项目里切到Win64平台重新Build一遍。有的人为了方便直接让项目只编译32位眼不见心不烦。但现代业务系统连接第三方库、调用系统API64位几乎是大势所趋。所以建议从安装起就把两个平台都编译好省得以后项目切平台时被控件卡住。3. 高频使用场景与细节拆解3.1 自动筛选让表格自带Excel式过滤TDBGridEh最吸引人的功能之一就是自动筛选。开启方式很简单在设计期把OptionsEh属性中加上dghAutoFilterRow或者运行时通过代码操作DBGridEh1.OptionsEh : DBGridEh1.OptionsEh [dghAutoFilterRow];开启后表格列头下方会出现一个筛选行用户可以按键值精确筛选也可以通过下拉列表选择唯一值。对于带日期的列还能配置成区间筛选配合STFilter相关属性体验非常接近Excel。但这里有个坑必须提醒EhLib的自动筛选默认是基于当前数据集的过滤机制。如果数据库端已经有大量数据被加载到客户端筛选时会有明显卡顿。所以做筛选设计时最好提前在SQL层把范围缩小或者只在必要时启用自动筛选别每个窗体都无脑打开。3.2 多表头、汇总行与下拉列表业务系统里经常需要“产品名称”、“产品编号”这类分组表头。原生TDBGrid实现起来要重绘而TDBGridEh直接支持父子列结构。在设计器里右键Columns创建父列后把子列拖到父列下方即可。父列作为分组标题子列绑定字段运行时还能和普通列一样排序筛选。汇总行是我觉得最实用的功能之一。把DBGridEh1.FooterRowCount设为1然后找到对应列的Footer属性设置ValueType为fvtSum、fvtCount、fvtAvg底部就会自动显示统计值。这一步操作比在SQL里写ROLLUP灵活尤其是需要同时显示明细和统计的时候。下拉列表对应的是列属性里的PickList或LookupParams。PickList适合静态选项比如“启用/禁用”LookupParams适合关联主表比如从部门表中选择部门名称显示名称同时可以把部门ID回写到字段里。这在录入界面里非常常用等于给表格加了数据验证避免脏数据。3.3 导出Excel时的中文和格式坑导出Excel是项目里无法回避的需求。EhLib 11.x在这块做得很成熟TDBGridEh自带SaveToXLSX方法一行代码就能生成真正的xlsx文件不再依赖OLE和Excel进程DBGridEh1.SaveToXLSX(D:\temp\员工列表.xlsx);老版本里常用的TDBGridEhExportToExcel方式还可以用但新方法更简洁而且不会出现“电脑没装Excel就导出失败”的问题。不过导出Excel时有两个细节要留意。第一个是中文文件名和内容乱码。虽然新版的XLSX格式默认走UTF-8基本不会乱码但如果你在旧项目里沿用老导出组件一定要检查字符集设置。第二个是格式。ExportExportExcel默认导出的格式是比较朴素的不会带上你在网格里设置的列宽、字体和背景色。所以我的经验是先通过代码临时设置列宽和标题样式导出完成后再还原或者在导出对象上设置对应的样式属性。3.4 大数据量下的两种优化思路很多团队在数据量上来之后抱怨EhLib卡其实网格渲染本身并不慢瓶颈多半在数据加载和筛选逻辑上。这里分享两个思路。第一种是用VirtualMode。如果数据不需要编辑只是展示可以直接开启VirtualMode配合OnGetCellParams等事件按需提供数据。这样网格不会一次性创建大量行数据内存占用显著下降。第二种是使用SearchPanel替代自动筛选。SearchPanel是EhLib提供的搜索面板通过输入关键词快速定位不会触发数据集全量扫描比自动筛选在大数据量下表现更好。实测下来几十万行的场景普通方式加载可能要两三秒而用VirtualMode配合分页查询首屏呈现几乎无感知。当然这两个方案都需要调整数据获取方式不是纯靠控件一个属性就能解决。4. 报错实录我踩过的坑和排查方法4.1 cannot perform this operation on an open dataset这个报错我在论坛上见过无数次自己也踩过。它本身是数据集组件报的但经常在EhLib相关窗体里出现原因是数据集已经打开却又执行了Open操作。最常见的场景设计期在数据模块里把FDQuery或ADOQuery的Active设为True然后在FormShow里又写了一次Query.Open。设计期数据集已经处于打开状态运行时代码再Open一次就会触发这个异常。排查方法很简单全局搜索.Open关键字逐个检查是否有重复打开再看数据模块里所有数据集的Active属性运行期的打开操作统一交给代码。如果确实需要重复执行某个查询先判断状态if not FDQuery1.Active then FDQuery1.Open;这个错误和EhLib本身关系不大但当页面里有多个DbAware控件时数据集状态变化连锁触发网格重绘报错时机看起来就特别像控件问题。4.2 无效的授权说明这个问题大多出现在使用非官方渠道下载、或者从旧版机械复制文件到新环境的场景。表现是编译时提示授权无效或者运行时控件进入演示模式功能受限。处理思路一般分三步第一步彻底清理旧版残留包括项目搜索路径、IDE Packages列表和BPL、DCP文件。第二步重新从官方完整包解压安装时确认使用的是对应D12的目录。第三步核对License文件是否存在于正确位置以及环境变量里有没有指向旧版授权目录的配置。这里要多说一句正规商业授权在官网购买后下载到的安装包里已经包含有效许可不需要额外破解。遇到授权问题优先检查自己的路径和残留不要绕过正规渠道。4.3 安装了但组件面板找不到安装过程没报错但打开组件面板就是看不到EhLib页签。出现这种情况先别急着重装。首先确认设计时包真的Install成功在Component Install Packages里能查到并且勾选状态正常。然后关闭IDE删除AppData下对应版本的IDE缓存目录重启后再看。如果还是没有检查是否装到了错误的平台比如IDE以管理员权限运行时组件的用户级路径和系统级路径不一致。还有一个容易被忽略的点如果电脑上装有多个Delphi版本安装包默认路径可能指向了旧版本目录导致新IDE没加载到。安装时留意路径选择别让它默认到上一个Delphi版本的组件库里。4.4 编译报错与版本混用错误提示类似“E2201 Need imported data”或者“Unit was compiled with a different version of...”十有八九是DCU和当前IDE版本不匹配。这通常是因为Library path里残留了旧EhLib目录编译器优先索引了旧DCU。解决办法是把新增的EhLib源码目录放在Library路径列表的前面同时删除旧目录引用。项目级别的Search Path也要检查一遍有些老项目会在DPR里写死绝对路径这个最容易漏。我的做法是全局搜索项目中所有包含“EhLib”字样的路径逐项确认版本确保整个项目只引用一套控件源码。5. 一点个人心得在我最近的项目里最满意的组合是FDQuery关联TDBGridEh打开自动筛选配上Footer合计和SaveToXLSX导出。这套搭配在录入、查询、统计、导出几个核心场景都不需要额外造轮子业务代码可以专注于数据逻辑而不是表格交互细节。最后顺便分享一个小习惯如果是长期维护的项目建议把TDBGridEh封装到一个基础Frame里公共属性统一在Frame初始化时设置。比如自动筛选、汇总行这些默认开启个别页面再按需调整。这样做能减少重复配置也能避免不同窗体之间表格行为不一致后面对接新需求时改一处就能全局生效。本文还有配套的精品资源点击获取
返回列表