简介:这份资源是面向Delphi 12 Athens开发者的EhLib VCL 10.2.42控件库安装包,适合需要构建数据库应用、报表系统与图形化界面的中高级开发者使用。EhLib VCL提供EhDBGrid、EhDBNavigator等数据库组件,EhReport、EhPrintPreview等报表组件,以及EhGantt、EhDiagram等图形组件,并涵盖日期时间处理、文件与颜色对话框、树形视图等实用控件,可显著提升界面定制能力与运行性能。压缩包共1490个文件,约25.56MB,以dfm窗体、pas源码、dcu编译单元、hpp头文件、res资源、dpr与dproj工程文件为主,另含doc、docx、chm、hlp等文档及示例数据库文件,便于直接编译与查阅。目前已有348人学习下载。通过该组件库,读者可获得完整的源码、示例工程与帮助文档,快速掌握各控件的集成方式,并借助开放API进行深度定制,满足企业级项目的开发需求。
1. EhLib 10.2.42 在 Delphi 12 Athens 里到底能省多少事
上周帮朋友改一个老 ERP 的报表模块,Grid 里要显示分组小计、冻结列、导出 Excel,还要支持多行表头。他原来用 Delphi 自带 TDBGrid 硬扛,代码写了八百多行,滚动时还闪屏。我让他换成 EhLib 10.2.42,同样的需求,配置加少量事件代码,半天收工。这就是 EhLib 这类 VCL 控件包存在的意义——它不改变你的数据访问层,只是在 TStringGrid/TDBGrid 之上补了一层“企业级表格”的能力。
EhLib 是 Delphi 生态里做数据网格和报表输出的老牌控件库,VCL 版本主要包含 TDBGridEh、TDBSumList、TPrintDBGridEh、TDBGridEhImport、TDBGridEhExport 等组件。10.2.42 这个版本对应 Delphi 12 Athens 的编译环境,安装后你会得到源码、设计期包和运行时包。它解决的核心问题很具体:原生 Grid 做不了的分组统计、多级表头、列冻结、条件着色、打印预览、Excel/HTML/PDF 导出,它都有现成实现。适合谁?正在维护 Delphi 12 项目、需要快速交付报表和台账界面的开发者,尤其是从 Delphi 7 升上来、不想重写 UI 层的那批人。
2. 安装与包结构:从 7z 解压到 IDE 里出现 TDBGridEh
2.1 先看清压缩包里有什么
拿到EhLib VCL 10.2.42 for Delphi 12 Athens.7z之后,别急着双击安装。先解压到一个路径不含中文和空格的目录,比如D:\Components\EhLib10。路径带空格是后面编译期报“找不到文件”的头号原因,血泪经验。
解压后典型结构如下(不同打包方式可能略有差异,以实际为准):
| 目录/文件 | 作用 |
|---|---|
Source | 控件全部源码,含.pas和.dfm |
Packages | 设计期与运行时包工程,按 Delphi 版本分目录 |
Demos | 示例工程,验证安装是否成功 |
Help | 帮助文档 |
Readme | 版本说明与安装顺序 |
关键点:EhLib 是源码交付,意味着你可以直接改它的绘制逻辑,也可以只编译需要的包。这和只给.bpl的控件包完全不同,调试时能单步进源码,排查显示异常方便很多。
2.2 安装顺序不能乱
Delphi 12 的包管理对依赖顺序敏感。正确顺序是:先编译运行时包,再编译设计期包,最后安装设计期包。
# 以命令行编译为例,实际多数人在 IDE 里操作 # 1. 打开运行时包工程(路径按实际解压位置调整) D:\Components\EhLib10\Packages\Delphi12\EhLibRun.dproj # 2. Build(不是 Compile),确保生成 bpl # 3. 再打开设计期包 D:\Components\EhLib10\Packages\Delphi12\EhLibDesign.dproj # 4. Build 后右键 Install逻辑说明:运行时包(Run)提供控件本体,设计期包(Design)依赖运行时包,负责把控件注册到工具面板。如果先装设计期包,IDE 会提示找不到EhLibRun.bpl。参数上,Delphi 12 默认输出路径是C:\Users\Public\Documents\Embarcadero\Studio\23.0\Bpl,确认这个目录在系统 PATH 里,否则设计期加载会失败。
2.3 验证安装是否真的成功
装完别只看工具面板有没有图标。新建一个 VCL Application,放一个TDBGridEh,连上任意TDataSource,编译运行。如果能在设计期看到列编辑器、能设置FooterRowCount,说明注册正常。再打开Demos里任意一个工程编译,能跑起来才算完整。我一般还会检查Tools > Options > Delphi Options > Library里的搜索路径有没有自动加上Source目录,没有就手动加,否则新建工程引用时会报找不到单元。
3. TDBGridEh 核心配置:分组、冻结列与多级表头怎么落地
3.1 分组小计:不用写循环,靠 Footer 和 SumList
原生 TDBGrid 做分组小计,你得在OnCalcFields里自己累加。EhLib 的思路是把统计交给TDBSumList和 Grid 的 Footer 机制。
// 假设 DBGridEh1 已连接 DataSource1 procedure TForm1.FormCreate(Sender: TObject); begin // 开启脚部行,用于显示合计 DBGridEh1.FooterRowCount := 1; // 指定哪一列参与求和 DBGridEh1.Columns[2].Footer.ValueType := fvtSum; DBGridEh1.Columns[2].Footer.DisplayFormat := '#,##0.00'; // 按“部门”列分组,分组头显示在数据行上方 DBGridEh1.SortLocal := True; DBGridEh1.Columns[0].Title.Caption := '部门'; end;逻辑说明:FooterRowCount决定脚部占几行,fvtSum是内置统计类型,还支持fvtCount、fvtAvg。SortLocal := True让 Grid 在本地排序,配合STFilter可以做即时筛选。参数上,DisplayFormat用标准 Format 字符串,别写错成#,##0.00;带分号结尾,会显示异常。分组本身需要数据按分组列排序,否则小计会串行——这是最常见的翻车点。
3.2 冻结列与多级表头
冻结列在 EhLib 里叫FrozenCols,多级表头靠Title的层级和Columns的嵌套。
// 冻结前两列 DBGridEh1.FrozenCols := 2; // 多级表头:先建一个父标题,再挂子列 with DBGridEh1.Columns.Add do begin Title.Caption := '销售信息'; Title.Font.Style := [fsBold]; // 子列通过 Columns 属性继续添加 end;逻辑说明:FrozenCols是整数,表示左侧冻结几列,滚动时这几列不动。多级表头在 Delphi 12 里通过TDBGridEh的列嵌套实现,父列不绑定字段,只做视觉分组。注意冻结列和分组同时用时,分组头不会冻结,这是控件本身的边界,别指望它像 Excel 那样全冻结。
3.3 条件着色与行高
台账界面经常要“库存低于阈值标红”。EhLib 提供OnGetCellParams事件,比原生OnDrawColumnCell更直接。
procedure TForm1.DBGridEh1GetCellParams(Sender: TObject; Column: TColumnEh; AFont: TFont; var Background: TColor); begin if (Column.FieldName = 'Stock') and (Column.Field.AsInteger < 10) then begin AFont.Color := clRed; Background := clYellow; end; end;逻辑说明:OnGetCellParams在每格绘制前触发,直接改AFont和Background即可。参数上,Column.FieldName判断字段,Field.AsInteger取值。性能提示:这个事件触发频繁,别在里面做数据库查询,否则滚动会卡成幻灯片。
4. 导出与打印:Excel、HTML、PDF 的实操路径
4.1 导出 Excel 的两种方式
EhLib 自带TDBGridEhExport系列,但导出 Excel 有两条路:一是用内置的SaveToXLS,二是走 OLE 调 Excel。内置方式不依赖 Office,推荐。
uses EhLibXls; procedure TForm1.ExportToExcel; var Xls: TDBGridEhExportToXLS; begin Xls := TDBGridEhExportToXLS.Create(nil); try Xls.FileName := 'D:\Report\sales.xls'; Xls.Grid := DBGridEh1; Xls.Execute; finally Xls.Free; end; end;逻辑说明:TDBGridEhExportToXLS直接读 Grid 的显示内容,包括表头、脚部合计。参数上,FileName扩展名用.xls,它生成的是 BIFF 格式,Excel 能开但新版会提示格式不符,点“是”即可。如果要.xlsx,常见做法是导出后用第三方库转换,或者直接用 OLE 方式,但 OLE 要求机器装了 Excel,部署时容易翻车。
4.2 打印预览:TPrintDBGridEh
打印是 EhLib 的强项,TPrintDBGridEh支持预览、缩放、页眉页脚。
procedure TForm1.PrintGrid; begin PrintDBGridEh1.DBGridEh := DBGridEh1; PrintDBGridEh1.PageHeader := '销售台账'; PrintDBGridEh1.PageFooter := '第 &[Page] 页 / 共 &[Pages] 页'; PrintDBGridEh1.Preview; end;逻辑说明:PageHeader和PageFooter支持占位符,&[Page]是当前页,&[Pages]是总页数。Preview弹预览窗口,Print直接打印。参数上,如果列太多超出纸张,设置PrintDBGridEh1.Options := [pghFitGridToPageWidth]自动缩放到页宽。注意这个选项会牺牲字号,列特别多时字会小到看不清,得权衡。
4.3 导出 HTML 与 PDF 的边界
EhLib 能导出 HTML,但 PDF 不是它的原生能力。热词里有人搜“delphi rbuilder 导出成 pdf”,那是另一条路线。EhLib 的定位是 Grid 导出,PDF 一般靠TPrintDBGridEh打印到 PDF 虚拟打印机,或者用TDBGridEhExportToHTML出 HTML 再转。别指望 EhLib 直接给你一个SaveToPDF方法,它没有。这是选型时必须清楚的边界。
5. 避坑与排查:安装、编译、运行时的五条血泪记录
5.1 现象:编译报“Unit EhLib was compiled with a different version”
原因:机器上装了多个 Delphi 版本,或者之前装过旧版 EhLib,搜索路径里残留了旧单元。解决:在Tools > Options > Library里删掉所有指向旧 EhLib 的路径,只保留当前 10.2.42 的Source目录,然后 Rebuild 整个工程,别只 Compile。
5.2 现象:设计期能看到控件,运行时报“Class TDBGridEh not found”
原因:运行时包没部署到可执行文件能找到的位置,或者工程没勾选“Link with runtime packages”。解决:要么在工程选项里把 EhLib 的运行时包加进Runtime Packages列表,要么改成静态链接(不勾 runtime packages),让编译器把源码编进 exe。部署到客户机时,前者要带 bpl,后者不用,按交付方式选。
5.3 现象:分组小计数字对不上,合计比实际多
原因:TDBSumList或 Footer 统计的是当前数据集全部记录,而你的 Grid 做了本地筛选,显示的和统计的不是同一批。解决:筛选后调用DBGridEh1.SumList.RecalcAll,或者改用OnCalcFields手动按可见行累加。这个坑在带筛选的台账里几乎必踩。
5.4 现象:导出 Excel 后中文乱码
原因:TDBGridEhExportToXLS默认字符集和系统区域设置不匹配,或者 Grid 列用了非 Unicode 字体。解决:确认 Delphi 12 工程默认 Unicode,导出前把Xls.Options里的字符集相关项设为csUTF8(若版本支持),或者改用 HTML 导出再让 Excel 打开,HTML 的编码声明更可控。
5.5 现象:滚动时闪屏严重
原因:OnGetCellParams里做了耗时操作,或者 Grid 的DoubleBuffered没开。解决:把DBGridEh1.DoubleBuffered := True,事件里只做内存判断,别查库。如果还闪,检查父容器的DoubleBuffered是否被设成 False,VCL 的双缓冲是逐层生效的。
6. 进阶技巧:用 EhLib 做台账界面的三个提速习惯
第一个习惯是先配 Footer 再绑数据。很多人先连 DataSource 再调 Footer,结果列索引变了,Columns[2]指向的字段已经不是想统计的那个。我一般先把列建好、Footer 配好,最后才设DataSource,这样列顺序稳定,统计不会错位。
第二个习惯是导出前先克隆一个 Grid。直接导出当前 Grid 会把用户的列宽、排序、筛选状态一起带出去,有时候不是想要的结果。常见做法是动态创建一个TDBGridEh,复制必要列,设好固定列宽再导出,保证每次导出的格式一致。
// 导出专用 Grid 的简化思路 var ExportGrid: TDBGridEh; begin ExportGrid := TDBGridEh.Create(nil); try ExportGrid.DataSource := DBGridEh1.DataSource; // 只复制需要的列,固定宽度 ExportGrid.Columns.Clear; // ... 逐列添加 Xls.Grid := ExportGrid; Xls.Execute; finally ExportGrid.Free; end; end;逻辑说明:克隆 Grid 隔离了用户界面状态和导出状态,参数上只复制字段绑定和标题,不复制宽度和排序。代价是多一点内存,但导出结果可预期。
第三个习惯是打印前强制走一遍预览。TPrintDBGridEh直接Print有时会因为默认打印机驱动差异导致分页错乱,先Preview看一眼分页,确认没问题再打。从那以后我每次交付打印功能,都强制自己先预览再连打印机,省得客户现场尴尬。
EhLib 10.2.42 在 Delphi 12 上算是一个稳的选择,源码在手,遇到显示问题能自己改。安装时注意路径和包顺序,用的时候分清哪些是它擅长的(Grid、打印、导出 Excel/HTML),哪些不是(PDF 原生导出)。把这几步走通,报表模块的交付速度能提一大截。希望帮到你。
本文还有配套的精品资源,点击获取