☰
Delphi 12下EhLib 10.2.42源码包安装编译与DBGrid增强实战指南
2026/10/15 12:52:58 网站建设 项目流程

简介:EhLib 是一套功能全面的 Delphi 表格控件增强库,v10.2.42 源码版覆盖 Delphi 5 至 Delphi 12 的完整版本跨度,既方便控件二次开发者阅读修改,也适合把网格、树形列表、打印输出整合进进销存或 ERP 等数据库桌面应用。压缩包约 28.53MB,含 1877 个文件,以 479 个 pas 源码、466 个 dfm 窗体设计文件为主线,配套 dpk/dproj 工程文件、res 资源及图标素材,不同 Delphi 版本对应各自的源码与工程配置,可按需引入编译。已有 238 人下载学习。原始代码可直接编译调试,开发者能沿着绘制逻辑调整视觉细节、补充交互行为,还能将常用改造沉淀为自有组件库;资源包自带的演示工程与 EhLibHelp.chm 帮助手册覆盖常用属性、事件和典型用法,配合 dpr/bpr/cfg 工程配置及 ico/bmp/png 等界面素材,既能快速上手属性设置,也能深入组件内部按业务定制,从而明显降低后续项目的集成与维护成本。

1. 拿到 EhLib.v10.2.42.src.zip 之后,先别急着双击安装包

一个常见的场景:你在 Delphi 12 里新建了一个项目,拖了一个 DBGrid 上去,联上数据库,数据一多就开始转圈,拖动列宽掉帧,筛选更是想都别想。这时候你开始后悔当初没有早点认识到「表格控件」是桌面端开发里最值得花钱(或花时间)的组件之一,于是你翻出了 EhLib.v10.2.42 for Delphi 5-12.src.zip。这个包的名字虽然长,但信息量很足:它支持从 Delphi 5 一路用到 Delphi 12,而且给的是源码(src),不是编译好的黑匣子。这意味着你可以在自己的 IDE 版本上重新编译、定制、甚至修复局部 bug。这篇文章就是照着这个压缩包,把「这是什么、怎么装、怎么用、哪里会翻车」一次讲透,适合刚拿到包还没动手的开发者,也适合装过但总在某个环节卡住的老手。

2. 为什么是 EhLib,为什么是 src 包:选型与风险预判

2.1 EhLib 解决的是哪一类问题:从 DBGrid 的原生短板说起

Delphi 自带的 DBGrid 不是不能用,而是当你面对真实业务数据时,它的短板非常具体:大数据集下滚动卡顿、合并单元格要自己写、统计脚注要自己拼、打印和导出基本没有体系化的支持。而 EhLib 的核心定位就是把这些「表格增强能力」集中到一个组件族里,它不是一个单一控件,而是一套从 DBGridEh、DBTreeViewEh 到 PrintDBGridEh、MemTableEh 的成套方案。装上之后,你的数据网格能支持多表头、合计行、分组、排序、筛选、单元格合并、下拉选择、Excel 导出、打印预览,这些功能在原生控件里要么不存在,要么需要你用大量自绘代码去实现。

所以回到标题里的版本号 10.2.42:这个版本仍然以「增强 VCL 表格」为主线,没有引入激进的新架构,这对存量项目是好事。它的兼容性目标很明确:老项目从 Delphi 5 迁移到 Delphi 12 时,代码改动量被压缩到最低,而新项目直接用 Delphi 12 也不会遇到编译器版本不识别的问题。

2.2 src.zip 为什么比编译好的 BPL 更适合落地

很多控件商给的是编译好的安装程序,双击就完事。但 EhLib 的这个包给的是源码,这意味着你拿到的是三样东西:第一,一组后缀为 .dpk 的包工程文件,它们是设计期包和运行期包的入口;第二,大量 .pas 单元文件,它们是控件的真实实现;第三,示例项目(Demos)目录,里面通常有几十个分场景的 demo,覆盖了从简单表格到复杂报表的用法。

从工程实践的角度看,源码包最大的价值不是「开源」,而是「可控」。你可以在编译前改掉一些默认行为,比如日期显示格式、空值默认文案;也可以在升级 Delphi 大版本时,自己动手重新编译一份适配当前 IDE 的包,而不是等作者发布新版本。缺点是:安装过程比双击 setup.exe 多几步,而且如果你对 Delphi 包机制不熟,容易把 dcu 和 bpl 路径搞乱,导致编译环境互相污染。这个风险不是玄学,后续章节会专门展开。

2.3 安装前必须做的三件准备:路径、IDE 版本、备份

我一般会按下面的顺序做安装前检查,避免装到一半发现目录不对或者 IDE 环境被破坏。

第一,解压路径一定不要带中文和空格,比如不要放在「D:\我的控件\源码包」这种路径下。Delphi 的编译器和 IDE 对这种情况的容忍度很低,后续 build 报错时你很难判断是路径问题还是包依赖问题。

第二,确认你当前用的 Delphi 12 的具体版本号。打开 IDE 菜单 Help -> About,看一下是 12.0 还是 12.1、12.2。虽然 EhLib 10.2.42 声明支持 Delphi 12,但大版本内部的小版本差异,偶尔会影响某个包文件的编译。这一步能帮你快速定位兼容性报错。

第三,备份你现在 IDE 的 Library 配置。在 Windows 下,注册表里存着一份 BPL 路径列表;更稳的做法是记下 Tools -> Options -> Library -> Library path 里的内容,写到文本文件里。这样如果安装失败导致 IDE 起不来,你可以用命令行重置配置。

做完这三件事,安装流程才算有了一个安全的底盘。接下来进入实际操作。

3. 在 Delphi 12 里编译安装 EhLib.v10.2.42.src:包顺序与路径规划

3.1 先找对入口:从 Install.txt 开始,而不是直接打开 .dpk

压缩包解压后,根目录通常会有读我类文档,名字可能是 Install.txt 或 ReadMe.txt。第一步不是双击任何 .dpk,而是先打开这个文档,把里面的安装顺序看明白。EhLib 的包分两类:运行期包(RunTime)在设计期包(DesignTime)之前编译并安装。这个顺序是硬性的,因为设计期包里的组件注册代码依赖运行期包的单元,如果先装设计期包,Delphi 会报找不到某些 .dcu 或 .dcp 的错误。

打开 Delphi 12 后,我建议在 Project Manager 里新建一个空包组(Package Group)概念上的编译流程,但实际操作里,我们通常是一个一个打开 .dpk 文件编译。用 File -> Open 打开运行期包文件,它的命名一般是 EhLib 前缀加版本标识,编译时目标平台按你当前项目需要选择 Win32 或 Win64。如果你想装一套,就先把 32 位和 64 位分别编译一遍;只编 32 位会导致后续切换平台时莫名报错,这一点在避坑章节会再提。

3.2 编译运行期包的三个关键动作

运行期包的编译是整个安装流程里最容易被误解的一环。很多人以为「编译通过」就是安装完成,其实不是。编译通过只代表生成了 .bpl 和 .dcp,如果你没有把 .bpl 输出到 Delphi 的 IDE 能识别的目录,IDE 根本加载不了这个包。

我通常会把编译输出目录显式指定到 Delphi 12 的 BPL 输出目录。具体操作是:在 Project Manager 里右键运行期包,进入 Options -> Delphi Compiler -> Output 设置,把 Package output directory 改到 IDE 的 BPL 目录(一般可以在 Tools -> Options -> IDE -> Existing packages 里看到当前的 BPL 路径),同时把 DCP output directory 和 DCU output directory 也统一规划。

下面是 Delphi 12 里编译运行期包的典型命令序列,手动编译时用 IDE 操作即可,但如果是命令行批量处理,可以这样执行:

# 假设已经解压到 D:\Components\EhLib_10.2.42 # 先编译 32 位运行期包,再编译 64 位运行期包 # 编译完成后检查输出目录下的 .bpl 文件是否存在 cd /d D:\Components\EhLib_10.2.42\Delphi12 msbuild EhLib120.dproj /t:Build /p:Platform=Win32 /p:Config=Release msbuild EhLib120.dproj /t:Build /p:Platform=Win64 /p:Config=Release

命令行编译的优势是可反复执行,缺点是报错信息不如 IDE 直观。头一回安装最好还是在 IDE 里做,看到红色波浪线提示时能直接跳转到出错单元。编译期间如果报缺失某些文件,多半是源码目录没有完整解压,检查一下是不是杀毒软件把部分文件隔离了。编译通过后不要急着开新项目,先在 Windows 资源管理器里确认 .bpl 文件已经出现在 IDE 的 BPL 目录中,这一步是后面所有功能能用的物理前提。

参数说明:msbuild 里的 /p:Platform 用于指定目标平台,Release 配置会让编译器不产生调试信息,生成的包体积更小;如果你后面要跟源码调试,改用 Debug 配置即可。注意,同一份源码编译 32 位和 64 位时,DCU 输出目录会自动区分(一般 IDE 会自动加 Win32/Win64 子目录),不要手动把它们强行合并,否则两个平台的文件会互相覆盖,产生极其隐蔽的编译错误。

3.3 安装设计期包:让 EhLib 图标出现在组件面板上

运行期包编译完了,接下来是设计期包。设计期包一般叫 DclEhLib 之类的前缀,功能是把组件注册到 IDE 的组件面板,让你能在界面上拖拽 DBGridEh。这个包的编译流程跟运行期包一样,但最后多了一步:安装。在 Project Manager 里,右键设计期包,选择 Install 或 Build with install——这个操作会通知 IDE 把 BPL 加载进当前 IDE 会话,并且写进注册表,下次启动时自动加载。

安装成功之后,组件面板上会新增一个 EhLib 相关的页签。点开就能看到 DBGridEh、DBTreeViewEh、DBComboBoxEh 等一系列组件。注意,如果你安装设计期包时提示「Cannot load package ... 因为它已被另一个包使用」,这通常是因为同一个 dcu/bpl 被重复编译进了多个包,或者不同版本混装。处理方式是先把之前装的旧版本在 Options -> Packages 里移除,再重编译新包。

3.4 编译路径规划的玄学:为什么很多人装完一启动项目就报错

有一个非常常见的安装后现象:包明明装好了,IDE 重启也正常,但一编译自己的项目就报错「File not found: EhLib80.dcu」之类的。原因只有一个——IDE 的 Library path 里没有加入 EhLib 的源码输出目录。包的加载路径是针对 IDE 自身的,而项目编译时使用的搜索路径是另一套环境,两者独立。你必须把 EhLib 的输出目录(也就是存放 .dcu 的目录)追加到 Tools -> Options -> Library -> Library path 里,这样项目才能引用到这些单元。这一步漏掉,前面所有工作全部白做。

Library path 的配置我一般按下面的顺序处理:

// 这里是配置项示例,不是实际代码 // 打开 Tools -> Options -> Library -> Library path // 追加一行: // D:\Components\EhLib_10.2.42\Delphi12\Win32\Release // 再把 Win64 的输出目录也加进去: // D:\Components\EhLib_10.2.42\Delphi12\Win64\Release

添加之后点 OK 保存,然后重启 IDE 再编译项目。如果还报错,就去检查是不是路径里写了相对目录,绝对路径是最稳的。这一步做完,编译运行期包时选择包含 EhLib 的单元,IDE 就能正确找到它们了。

4. 把 EhLib 用起来:从最小表格到典型功能的代码与参数

4.1 三分钟搭出一个可运行的 EhLib 表格

环境就绪后,直接在窗体上放一个 TDBGridEh、一个 TDataSource 和一个数据集组件(比如 TFDQuery 或 TClientDataSet)。EH 表格的数据连接逻辑和原生 DBGrid 一致——DBGridEh.DataSource 指向 DataSource,DataSource.DataSet 指向实际的查询结果集。不需要额外的适配层,这是它迁移成本低的最直接原因。

我给你的最小可复现示例用的是 TFDQuery 加 SQLite,你换成任何数据库只需要改连接字符串。下面这段代码展示的是「连接 -> 查询 -> 显示」三个核心动作:

// 窗体创建时初始化数据集 procedure TForm1.FormCreate(Sender: TObject); begin // FDConnection 指向本机 SQLite 文件,无需额外安装数据库服务 FDConnection1.DriverName := 'SQLite'; FDConnection1.Params.Values['Database'] := 'C:\Data\demo.db'; // 打开连接,执行查询,把结果交给网格显示 FDConnection1.Open; FDQuery1.Connection := FDConnection1; FDQuery1.SQL.Text := 'SELECT id, name, amount, created_at FROM orders ORDER BY id DESC'; FDQuery1.Open; // DBGridEh 通过 DataSource 间接绑定到查询结果 DBGridEh1.DataSource := DataSource1; DataSource1.DataSet := FDQuery1; end;

代码逻辑上分三层:连接层(FDConnection)、数据访问层(FDQuery)、展示层(DBGridEh + DataSource)。中间加一个 DataSource 是为了解耦——如果后面要切换数据集组件,网格不需要改动。参数说明里最容易被忽略的点是 DriverName 和 Params 的配对:如果你用的是 Oracle、MySQL、PostgreSQL,连接参数完全不同,但网格绑定代码可以原封不动复用。

表格拉出来后,DBGridEh 默认就会显示列名。如果你想控制列显示顺序、列宽、对齐方式,可以直接在设计期通过 Columns 编辑器调整;运行时动态改列的典型写法是:

// 动态调整列宽与对齐 DBGridEh1.Columns[0].Width := 80; DBGridEh1.Columns[1].Alignment := taCenter; DBGridEh1.Columns[2].Footer.ValueType := fvtSum; // 合计行显示金额总和

参数说明:Footer.ValueType 设为 fvtSum 后,DBGridEh 会自动为该列计算并显示合计,前提是列的数据类型是数值型。如果显示不出来,检查列的 FieldName 是否对应数据集里的数值字段,以及该字段是否被数据库返回为字符串类型——字符串类型不会参与求和,这是最容易踩的一个逻辑坑。

4.2 常用增强功能的参数面板:排序、筛选与多表头

EhLib 最让人觉得「用了就回不去」的功能,是它把排序、筛选这类操作直接内置到了网格交互里。排序的开启方式在列级别,设置列的 SortEnabled 属性为 True,用户在运行时点击列标题即可排序;这个排序默认只对当前数据集有效的字段排序,如果你用的是 TFDQuery 这种直连数据库的组件,EhLib 还会生成 ORDER BY 子句并重新执行查询。

筛选功能需要设置 DBGridEh 的 STFilter 属性。启用后,在列头下方会出现一个筛选行(可以理解为过滤输入框),用户输入文字后自动过滤数据。关键的参数有两个:LocateByFilter 控制是否在输入时提前定位,dctStaticFilter 控制是否打开可视化筛选列。如果觉得默认筛选性能差,可以先开缓存数据集,或者改用 SQL 级别的 WHERE 过滤,把条件拼到查询语句里再刷新数据。

多表头是另一个高频需求。它通过 DBGridEh 的 Columns 里增加分组列来实现:把若干列归到一个 Footers/Header 分组下,运行时会渲染成两行表头。下面这段设置展示了运行时构建一个「订单信息」分组:

// 运行时创建多表头分组 var LHeader: TColumnEh; begin // 给已有的列新增一个父级表头 LHeader := DBGridEh1.Columns.Add; LHeader.Title.Caption := '订单信息'; LHeader.ParentColumn := nil; // 把 id 和 amount 的标题挪到新分组下面 DBGridEh1.Columns[0].ParentColumn := LHeader; DBGridEh1.Columns[2].ParentColumn := LHeader; end;

参数说明:ParentColumn 的赋值顺序有讲究,必须先把父列加入网格,再让子列指向它;反过来会报错或者出现悬空列。多表头的意义不只是美观——在财务、进销存这类报表里,它能让信息层级一眼可见,减少用户问「这一列是什么意思」的频率。

4.3 打印与导出:不要自己造轮子

原生 DBGrid 没有打印能力,而业务方对「把当前屏幕表格导出成 Excel」的需求几乎是必然的。EhLib 的 PrintDBGridEh 组件把打印和预览做成了独立组件,拖到窗体上,指定它的 DBGridEh 属性指向目标网格,调用 Print 方法即可完成打印。它内部会按照当前表格列宽自动分页,支持横向打印,也支持缩放比例调整。

导出 Excel 则更简单,DBGridEh 自带 SaveToExcel 方法:

// 把网格当前内容导出为 Excel 文件 DBGridEh1.SaveToExcel('D:\Reports\orders_' + FormatDateTime('yyyymmdd', Now) + '.xls');

这个方法的坑在于:SaveToExcel 默认导出的是网格当前显示的数据,不是数据库里的全部数据。如果网格只加载了前 100 行,导出文件里也只有 100 行。要导全量,请先扩大数据集的取数范围,或者改用 SaveToExport 配合自定义导出选项。参数说明里还有一个细节:文件名后缀写 .xls 时,它生成的是旧版 Excel 格式;如果你写 .xlsx,部分旧版本会直接报格式错误。稳妥的做法是先导成 .xls,再用 Excel 打开另存为新格式。

5. EhLib 安装与使用中的 5 个常见问题排查

5.1 编译报错「File not found: 'DCL.EhLib120.dcp'」

现象:在 IDE 里打开设计期包文件并编译时,弹窗提示找不到某个 .dcp 文件,编译终止。

原因:.dcp 是 Delphi 包的接口描述文件,通常由运行期包编译生成。设计期包需要调用运行期包里的单元,所以编译器得先知道运行期包的 .dcp 位置。如果你先编译了设计期包,或者运行期包输出目录没被 IDE 的 Library path 包含,就会出现这个错误。

解决:在编译设计期包之前,先编译好运行期包,确认 .dcp 文件已生成。然后在 Tools -> Options -> Library 里,把运行期包的输出目录加到 Library path 里,再重新编译设计期包。

5.2 安装成功后组件面板里找不到 EhLib 页签

现象:明明编译安装都显示成功,重启 IDE 后组件面板里却没有 EhLib。

原因:设计期包没有真正注册,或者注册的是另一个目录下的同名包。最常见的错误是安装时用 Run 而不是 Install——Run 只是加载当前包,不写系统注册表;下次 IDE 启动时不会自动加载。

解决:回到 Project Manager,右键设计期包,选择 Install。等提示「Package installed successfully」后,再去组件面板刷新确认。如果依然没有,检查该 BPL 文件是否在 IDE 的已安装包列表里:Tools -> Options -> IDE -> Packages。

5.3 编译项目时提示「重复定义」或「Unit not found」

现象:自己的项目里引用了一个 EhLib 单元,编译时要么报节选重复,要么直接找不到文件。

原因:一种是 IDE 的 Library path 里同时存在两个不同版本的 EhLib 输出目录,编译器会优先搜索靠前的目录,导致单元版本混乱。另一种是根本没有把 EhLib 的 dcu 输出目录加进 Library path,导致搜索不到。

解决:先清理重复路径,只保留当前版本对应的输出目录。然后检查 Library path 拼写——务必用绝对路径,不要用相对路径。改完后关掉 IDE 里所有打开的包工程,重新编译项目。重复定义问题如果还在,就在搜索路径里删除旧版本目录。

5.4 64 位目标平台编译报错,32 位正常

现象:默认编译生成正常,但切到 Win64 平台后,报找不到部分 .dcu 或无法定位某些包文件。

原因:EhLib 在安装时,32 位和 64 位平台的 .bpl、.dcu 是各自独立编译的。如果你只编译了 32 位包,切换到 64 位时,IDE 找不到对应的 64 位 .bpl,于是报错。

解决:回到包工程里,把目标平台切换到 Win64,重新编译一次运行期包和设计期包。安装后再次确认两个平台都能通过编译。以后每次升级 Delphi 或安装补丁,都要重复做一次双平台编译。

5.5 网格里中文显示成乱码或变成问号

现象:数据源里的中文字段在 DBGridEh 里显示为问号或乱码,但同样的字段在原生 DBGrid 里显示正常。

原因:EhLib 有些版本的排版引擎会默认用当前线程的 Locale 决定字体字符集。如果 IDE 或系统区域设置偏向英文或 Unicode(UTF-8),而数据源返回的是 GBK/GB2312 编码,就会出现显示异常。

解决:强制设置网格字体字符集,在代码里给 DBGridEh1.Font.Charset 赋值,或者在设计期把 Font.Charset 改为 DEFAULT_CHARSET 或 GB2312_CHARSET。如果你的数据库连接层做了编码转换,这一步通常能直接修复。修改后记得重新编译项目,因为设计期修改的属性会被 IDE 序列化进 .dfm 文件。

6. 安装完成后的验证清单:如何确定这次安装真的彻底成功

安装完 EhLib 不是「能拖控件」就算完。按我固定的验证流程,至少在三个层面做检查:Packages 加载状态、双平台编译能力、Demo 运行结果。

先在 Tools -> Options -> Packages 里确认 EhLib 相关项处于勾选状态。再看 IDE 右下角的状态栏,如果出现组件包加载失败的提示,立刻去 Windows 事件查看器里查应用程序日志,定位到底是哪个 bpl 加载失败。这一步能看到比 IDE 弹窗更详细的异常信息,能节省很多盲试的时间。

然后是编译验证:新建一个空 VCL 项目,拖入 DBGridEh,先用 Win32 编译一次,再切 Win64 编译一次。两个平台都通过,才算环境真正的可用。这个动作只需一分钟,但能把 32/64 位包缺失这类隐藏问题提前暴露出来,别等交付时再翻车。

最后,运行源码包里自带的一个数据表格 Demo,让用户交互一下:点击列排序、输入筛选条件、导出一次 Excel。这三个操作覆盖了 EhLib 最核心的运行路径。如果 Demo 都正常,说明控件内部的运行期资源和 IDE 环境是匹配的。

我还留了一个习惯:安装成功后,把 Library path 记录、平台编译顺序、踩过的坑写成一个 NOTES.md 放在源码包根目录。下次换电脑升级环境时照着做,能少花一整天的时间去重新排错——这种后悔药先给自己备好,比任何自动安装工具都可靠。

希望这些步骤和教训能帮到正在折腾 EhLib 的你;把环境做扎实了,后续做表格增强功能才会有底气。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询