简介:EhLib VCL 10.2.42 for Delphi 12 Athens 控件包是一套面向 Delphi 开发者的高级界面组件库,覆盖数据网格、报表、图形、日期时间、对话框、树形视图等模块,适用于企业管理、报表中心和可视化工具等场景。压缩包共包含 1490 个文件,核心文件类型有 dfm 窗体布局、pas 源代码、dcu 编译单元、hpp 头文件,另有 dpr/dproj 工程示例、res 资源以及 chm 帮助文档,整体约 25.56MB,可直接对照编译学习。其中 EhDBGrid 网格支持分组、排序、过滤等复杂数据展示,EhReport 与 EhPrintPreview 可完成专业报表设计并保证打印预览一致,EhGantt 和 EhDiagram 便于绘制甘特图、流程图和组织结构图,EhShellBrowser、EhTreeView 等组件则适合搭建资源管理器风格界面。资源深度集成 Delphi 12 Athens,同时兼容其他 Delphi 版本,开放 API 便于二次定制。目前已有 346 人学习下载,搭配完整源码、帮助手册和示例工程,能帮助开发者快速在真实项目中集成数据库网格、报表与可视化控件,有效降低开发门槛,提升桌面应用交付效率。 从 2003 年第一次在 Delphi 5 里拖 TDBGridEh 算起,我用了差不多二十年控件库,EhLib 在项目里的地位从来没被替代过。Delphi 12 Athens 发布之后,我最关心的不是 IDE 本身多了几个新特性,而是手头这套老伙计能不能跟上新版本。看到 EhLib VCL 10.2.42 for Delphi 12 Athens 这个包的时候,我第一时间就下了,实测安装、编译、跑业务 Demo 都通了。这篇就把完整安装过程、使用配置和我在真实项目里踩过的坑整理出来,给正在用或者准备迁移到 Delphi 12 的朋友做个参考。
先说结论:如果你是做传统 VCL 桌面应用、离不开数据感知控件、又不想把整套界面框架换成 DevExpress 那种重量级方案,EhLib 在 Delphi 12 下依然是性价比很高的选择。它的 TDBGridEh 提供排序、过滤、搜索、统计栏、导出 Excel 等一堆开箱即用的功能,省掉大量重复代码。而且 EhLib 一直是源码开放的,出现问题可以直接跟库的源代码,排查起来比黑盒控件舒服太多。
1. 为什么 Delphi 12 项目里我依然首选 EhLib
1.1 一套库解决数据展示的 80% 需求
很多人一提到 Delphi 的控件,第一反应是“拖个 DBGrid 就完事了”。但原生 TDBGrid 能做的东西实在太少:排序要手动写 SQL,过滤要自己拼条件,列头想带个小箭头都得继承重绘。TDBGridEh 把这些全部做成了属性,勾选一下就生效,开发效率完全不在一个量级。
我在项目里用得最核心的几个控件:
- TDBGridEh:增强型数据网格,支持表头排序、自动过滤、汇总栏、树形展示、合并单元格、多选下拉过滤;
- TDBLookupComboboxEh:下拉框可以同时显示多个字段,比如“编号 + 名称”一起展示,日常开发非常顺手;
- TDBDateTimeEditEh:日期时间编辑,配合格式掩码,数据处理干净很多;
- TDBComboBoxEh、TDBNumberEditEh、TDBCheckBoxEh:一系列数据感知输入控件,基本覆盖常见表单场景;
- TMemTableEh:内存数据表,在临时数据集、报表数据集这类特殊场景下很好用。
1.2 10.2.42 for Athens 这个版本解决的核心问题
版本号里带 Athens,说明它专门针对 Delphi 12 Athens 做过适配。新版本 Delphi 的编译器版本、RTL 接口、IDE 包加载机制都有调整,控件库如果不跟着更新,最常见的症状是:安装时提示包不兼容、编译时报找不到某个 RTL 符号、运行时控件注册不了。
10.2.42 这个版本解决了我在 Delphi 12 下遇到的几个实际问题:
- 全面适配 Unicode 和长字符串,中文数据不会出现截断或乱码;
- 兼容高 DPI 显示场景,网格文字、图标在 4K 屏上不再发虚;
- 更新了包的项目版本号,IDE 可以正确识别和加载;
- 修正了部分导出、打印相关的边界问题。
提示:如果是从旧版本(比如 10.2.20 以前的版本)直接升 Delphi 12,建议先把 EhLib 升到这个版本再做项目迁移,否则很容易在编译阶段耗费大量排查时间。
2. 压缩包解压到 IDE 出现控件:安装过程全记录
2.1 解压后先看目录结构
拿到EhLib VCL 10.2.42 for Delphi 12 Athens.7z之后,先别急着双击安装,把文件解压出来看一眼目录。这个版本的压缩包内通常包含:
SetupEh.exe:图形化安装程序;Source/Common目录:全部源代码;Docs目录:帮助文档和版本说明;- 对应各版本 Delphi 的运行时包和设计时包源文件。
我习惯先把压缩包解压到一个干净目录,比如D:\Components\EhLib。这样做的好处有两个:一是安装程序能找到明确的路径,二是后面手动配置 Library Path 时不容易把路径搞乱。
2.2 用 SetupEh 完成编译注册
运行SetupEh.exe后,界面中间会列出当前机器上安装的 Delphi 版本。勾选 Delphi 12 Athens,选择好安装路径,然后点击编译。这步会做两件重要的事:
- 编译生成运行时包(运行时 BPL);
- 编译生成设计时包(设计时 BPL),设计时包会被 IDE 加载并注册到组件面板。
编译过程出现几个提示窗口时,注意看描述内容。如果是“Package DclEhLibXX.bpl will be installed into IDE”这类提示,直接同意。如果弹出找不到某个源文件的错误,优先检查是不是路径里有中文或空格,EhLib 在带空格的长路径下偶尔会有脚本解析问题。
2.3 IDE 里找不到控件时的替代注册方式
如果图形安装程序在某些精简版 Delphi 环境跑不起来,或者装完之后工具面板里没有出现 EhLib 标签页,可以手工注册。步骤是:
- 打开 Delphi 12,选择
Component > Install Packages; - 点击
Add,找到编译输出目录下的DclEhLib开头、后缀为.bpl的文件; - 选中并确认加载;
- 重启 IDE。
设计时包的作用是把组件注册到 IDE 的工具面板。如果只装运行时包,程序能编译但组件面板里不会显示控件,这个区别要记清楚。
2.4 库路径检查清单
编译安装完成后,还有一步很容易被忽略:Library Path。如果不加,新建项目引用 EhLib 单元时,Delphi 会提示找不到EhLibXX.dcu。
打开Tools > Options > Environment Options > Delphi Options > Library,在 Library Path 中加入:
D:\Components\EhLib\Build\Lib\$(Platform)\$(Config)具体路径以你编译输出目录为准。安装程序在部分环境下会自动配置,但如果发现不生效,手工补就行了。
2.5 验证是否注册成功
正确的验证姿势是:新建一个 VCL Forms Application,在组件面板上找是否有“EhLib”分类,然后拖一个TDBGridEh到窗体。能拖出来、能在对象监视器里看到它的属性、编译能通过,才算真正装好。别只看到.bpl加载成功就认为完事了。
3. 跑通第一个智能数据网格:从数据绑定到排序过滤
3.1 最小 Demo 搭建
我先用一个 TFDConnection + TFDQuery + TDataSource 的组合演示。如果你习惯用 ADO,步骤完全一样,只是连接组件的名字不同。
操作顺序:
- 放一个
TFDConnection,设置好数据库连接串; - 放一个
TFDQuery,写一条SELECT * FROM 订单表; - 放一个
TDataSource,把DataSet指向FDQuery1; - 放一个
TDBGridEh,把DataSource指向DataSource1; - 激活
FDQuery1。
到这个步骤,网格里已经能看到数据。但这时候它跟原生 DBGrid 的区别还不大,接下来才是 TDBGridEh 显本事的地方。
3.2 让网格具备排序和过滤能力
开启排序只需要一行属性设置:
DBGridEh1.SortLocal := True;开启后,用户点击列标题就能本地排序。注意SortLocal是内存排序,适合数据量不大的场景。如果是几十万行的数据,建议还是走数据库排序,用SortMarkedColumns事件拼 SQL。
过滤功能在 TDBGridEh 里叫 STFilter,启用方式也是属性级别的:
DBGridEh1.STFilter.Visible := True;设置完后,每个列的标题下方会多出一个过滤小行,用户输入关键字就能过滤当前列。它是按控件维护的过滤条件执行的,不会直接改 SQL,所以数据量太大的时候性能会下降,这点要有心理准备。
3.3 开启搜索面板和统计栏
搜索面板是这个控件库另外一个我离不开的功能。它默认自带一个类似 Excel 的搜索框,禁用代码就一句话:
DBGridEh1.SearchPanel.Enabled := True;统计栏(底部汇总)也很好用,把FooterRowCount设为 1,然后指定列的Footer.Value类型:
DBGridEh1.Columns[3].Footer.ValueType := fvtSum; DBGridEh1.Columns[3].Footer.Alignment := taCenter;这样最后一列就会自动显示合计值,不用写任何循环代码。我一直觉得,如果只是做内部管理系统的数据展示,上面这几个功能加起来,已经完全够业务部门用了。
4. 项目中真正提效的几个高级用法
4.1 下拉多列选择和自动补全
用TDBLookupComboboxEh的时候,有个属性很关键:DropDownBox.ListSource对应的查询可以返回多个字段,但值和显示字段单独设置。比如人员选择下拉框,我想把“工号”“姓名”“部门”同时显示出来,设置DropDownBox.ListField为“工号;姓名;部门”,然后KeyField为“工号”就行。
补全功能在 TDBGridEh 的列里也有入口。选中列的DropDownBox,配置一个数据集之后,编辑单元格时就能弹出下拉列表,既能减少输入错误,体验也好很多。
4.2 导出 Excel:两条路线我都走过
TDBGridEh 提供了原生导出功能。代码示例:
DBGridEh1.SaveToExcel('导出结果.xls');这是最简单的方式,适合中小数据量。它会调用内置的导出模块,保留列标题、列宽、合计栏,一般客户要看的数据表格都能胜任。
如果遇到更复杂的导出要求,比如要多格式导出、要求操作某个单元格的样式,我的做法是干脆循环数据集,直接调用 Excel 组件或者输出 CSV。别在这里硬撑用网格自带的导出,边界情况多,调试起来很耗时间。
4.3 打印和预览要注意的事项
打印功能用PrintDBGridEh组件,选中网格、设置标题,调用预览即可。但有个细节非常容易踩坑:打印列宽和屏幕列宽不一致。
建议在打印之前单独维护一套打印列宽配置,或者设置PrintDBGridEh1.DBGridEh := DBGridEh1之后,在OnGetPrintCellHeight等事件里动态调整。这事说起来简单,真遇到客户要求“打印出来后表格别挤成一团”的时候,才知道它的分量。
5. 安装和使用中的坑,我提前帮你踩平
5.1 编译报“找不到 dcu”的排查链路
装好了控件,新建项目时如果出现File not found: 'EhLibXX.dcu'这种错误,不要慌,按下面的链路排查:
- 确认 EhLib 的编译输出目录里真的生成了
.dcu文件; - 打开 IDE 的 Library Path,看有没有包含这个输出目录;
- 确认
$(Platform)和当前项目平台一致(Win32 / Win64 会输出到不同目录); - 确认当前项目还在使用 Debug 配置时,Library Path 中是否把对应的 Debug 输出目录也加进去了。
大多数情况下都是第 3 步的问题。EhLib 在安装时会在路径里写$(Platform)\$(Config)变量,如果你用的是自定义的编译输出目录,就要手动对齐。
5.2 “无效的授权说明”弹窗的处理思路
这个提示我在迁移到 Delphi 12 的头一个礼拜就遇到好几次。既有我自己的机器,也有同事新装的开发机。
通常情况下,这个弹窗代表 EhLib 的授权注册信息没有被正确识别。几种常见原因:
- 试用版本地标记过期;
- 注册密钥对应的版本和当前 EhLib 版本不匹配;
- 旧版本的注册信息残留在注册表里,和新版本检查逻辑冲突;
- 同时安装了多个版本的 Delphi,注册信息被写到了别的版本目录下。
处理思路是:先卸载干净旧版 EhLib,清理源码目录、BPL 目录和注册表中的 EhLib 相关项,再重新安装当前版本。
需要特别提醒一句:EhLib 是商业控件,正式商用请务必购买授权。网上流传的所谓“注册机”和“破解版”,且不说法律风险和对自己的职业声誉影响,控件更新一次就可能失效,项目交付高压期出这类幺蛾子,代价远大于省下的那点授权费。
5.3 运行时找不到包的经典原因
运行编译好的程序,突然弹“无法加载包 xxx.bpl,系统找不到指定的模块”,优先怀疑两点:
- 目标程序是 64 位,但 BPL 编译的是 32 位版本。Delphi IDE 本身是 32 位,IDE 能加载不代表 64 位程序能加载;
- 动态加载包的路径不对。正式发布时,把 EhLib 相关的 BPL/DLL 放到和主程序同一目录,或者手动指定环境变量路径。
这个坑在 Debug 环境不容易暴露,因为 IDE 会自动把 BPL 目录加到 PATH 里。部署到别的机器上就露馅了。
5.4 高 DPI 和界面字体错乱
Delphi 12 对高 DPI 的支持已经比以前好很多,但控件库不配合还是会出问题。EhLib 10.2.42 在 4K 屏上的表现已经比较稳,如果你的界面还是出现文字模糊、行高不对,建议检查:
- 窗体是否开启
PerMonitorV2支持; - 开发机系统字体缩放比例;
- 是否在运行前调用了
TDBGridEh的ApplyFontSettings方法。
另外网格行高的问题,很多时候跟在表单设计阶段和运行时 DPI 不一致有关。最简单可靠的方案是统一用相对 DPI 的单位来设置,别写死 Pixel。
5.5 关于旧项目升级迁移多出的一个动作
升级到 Delphi 12 时,因为 VCL 内部接口有变化,旧项目中如果直接引用 EhLib 的第三方扩展模块,比如自定义列类或自定义编辑器,编译可能会挂。我的建议是:先屏蔽第三方扩展、只用标准 EhLib 组件编译通过,再逐个打开扩展模块排查。
再补一个经验:升级之前一定跑一遍全代码搜索,看有没有直接调用 EhLib 内部实现细节的代码,比如GetCellParams内部方法。控件源码更新之后,这类方法名和签名经常调整,属于最容易在升级中炸掉的部分。
6. 写在最后的个人经验
每次 Delphi 大版本升级,控件兼容性都是绕不开的一道坎。EhLib 这波跟 Delphi 12 Athens 的适配做得算是跟得比较快的,装完后我直接投入了一个订单管理项目的改造,网格排序、筛选、导出这套流程在真实业务数据下运行了两周,没有发现明显异常。
我的体会是:越是有历史包袱的项目,越要在控件选型上谨慎。EhLib 的优势不在于某个单一功能多惊艳,而在于它在 VCL 数据感知这条老路上积累得很深,细节比原生组件丰富,文档和社区案例也足够多。很多看似要写一整天代码的表格功能,配置几个属性就能跑起来,这种效率提升对于交付驱动的开发团队来说是很实际的。
如果你也准备在 Delphi 12 Athens 下继续用 EhLib,照着上面的流程走一遍,应该能少走不少弯路。最后再分享一个小技巧:团队多人开发时,把 EhLib 的源码目录放进公共代码库统一管理,配合 Delphi 的 Library 共享设置,新同事拉下代码后只需要编译一次就能跟上节奏,比各人自己装一份要省心得多。
本文还有配套的精品资源,点击获取