☰
EhLib VCL 11.0.021在Delphi 12中的安装配置与实战指南
2026/9/29 8:43:21 网站建设 项目流程

简介:EhLib VCL 11.0.021 是专为 Delphi 12 Athens 设计的一套数据库组件库,面向 Delphi 12.3 环境下的应用开发者,用于快速构建数据网格、报表与录入界面。它基于 VCL 架构,可直接嵌入 Delphi IDE,支持分组、排序、过滤、Unicode 与 FireDAC,能简化数据库开发流程。压缩包共 1686 个文件,约 34.95 MB,主要包含 599 个 dfm 窗体布局、335 个 pas 单元源码、270 个 dcu 编译单元,以及 res、png、ico 等资源和示例工程文件,并附有 EhLibHelp.chm 帮助文档,便于查阅与二次开发。目前已有 323 人学习下载,适合有一定 VCL 经验的 Delphi 开发者。通过这份资源可获得完整组件源码、演示工程和离线帮助,直接参考集成方法,快速为项目补充分组统计、报表打印和交互式数据编辑功能,减少封装工作量,提升开发效率。

1. 拿到 EhLib VCL 11.0.021 先别急着解压:这版控件到底能改变什么

做过 Delphi 12 Athens 项目升级的人都知道,原生 TDBGrid 在合计、排序、筛选和导出这几个高频需求上基本是半成品。你要么自己写一套列排序逻辑,要么在 FormResize 里手工摆合计行,要么为了导 Excel 引一堆 Office 组件进来把发布目录搞得像垃圾场。EhLib VCL 就是奔着这个痛点来的,它的核心组件 TDBGridEh 把 Footer 合计、标题栏排序、下拉筛选、导出 Excel 这些功能做成了属性开关,属于那种“装上后立刻少写两千行代码”的控件包。

这篇文章按我实际部署 EhLib VCL 11.0.021 到 Delphi 12 Athens 的路径来讲——从解压 rar 开始,到组件面板里出现 TDBGridEh,再到把网格合计和筛选配置落到具体代码里。版本对应关系很明确:EhLib 11.x 系列对应 Delphi 12,11.0.021 是个补丁级别的小版本,Delphi 12.0 和 12.1 都能用。如果你是刚把项目从 Delphi 10.4 或 11 迁过来的,这篇文章里的坑你大概率也会踩一遍。

2. 安装 EhLib VCL 到 Delphi 12:先解决 Library Path 和设计期包

2.1 解压 rar 与检查安装包的文件结构

拿到EhLib VCL 11.0.021 for Delphi 12 Athens.rar这种命名规则的压缩包,我一般是先解压到一个纯英文路径,比如D:\Components\EhLib_110021,然后再去看里面的目录结构。不要在压缩包内直接双击 dpk 文件拖到 IDE,也不要解压到带中文或空格的路径,Delphi 12 的包管理器对路径里的特殊字符依然敏感,Windows 的路径长度限制在深目录结构下也会冒出来。

常见的做法是装 7-Zip 后用命令行解压,方便以后做批量部署或写安装脚本:

7z x "D:\Downloads\EhLib VCL 11.0.021 for Delphi 12 Athens.rar" -o"D:\Components\EhLib_110021" -y

参数说明:x表示解压并保留目录结构,-o指定输出目录且后面不能有空格,-y表示覆盖已存在文件不弹确认框。解压完成后重点看三个目录:Source(运行期源码,要加进 Library Path)、Packages(分版本存放的 dpk 工程文件)、Demos(官方示例,排错时对照用)。如果解压后发现没有Delphi12或Athens字样的子目录,只有Delphi11和Delphi10,那大概率是压缩包命名和内部结构不一致,先别装,打开Readme.txt看它支持哪个版本。

2.2 配置 Library Path:这一条错了后面全崩

Delphi 12 Athens 的库路径配置入口在Tools > Options > Language > Delphi > Library,右侧Library path编辑框里维护的是全局搜索路径。EhLib 安装时最容易犯的错误是把Source下的所有子目录全部加进去,其实只用加顶层源码目录即可,因为 EhLib 的源文件引用是相对路径,包含子目录的引用已经在 pas 文件里写好了。

我习惯的配置顺序是先把 EhLib 的源码目录追加到 Library Path:

D:\Components\EhLib_110021\Source

然后点击右侧的...按钮,在弹窗里点Add,确认路径出现在列表最上方,再点 OK 保存。这里有两个细节:一是路径顺序很重要,如果机器上装了旧版 EhLib(比如/Source下还残留着 9.x 的 dcu),把新版的路径放在最前可以避免 IDE 优先解析到旧包;二是增加完路径后,IDE 不会立即重建包缓存,如果你马上打开 dpk 会提示找不到EhLibVCL.dcp,需要先执行一次Project > Build。

Delphi 12 在库路径的生效机制上和之前版本有个差异:IDE 会缓存已解析的.dcu和.dcp索引,改了 Library Path 后建议直接重启一次 IDE 再装包,否则可能出现“路径已经加了但编译仍然报错”的假象。这一点我踩过两次,属于那种看起来像配置错误实际是缓存没刷新的玄学问题。

2.3 设计期包安装:把控件放进组件面板的完整操作

Library Path 配好后,打开Packages目录,找到 Delphi 12 对应的子目录。常见的包工程名是EhLibVCL.dpk(运行期包)和EhLibDesign.dpk(设计期包),具体名称以解压出来的文件为准。先打开运行期包,在 IDE 里执行Project > Build,确认编译输出窗口没有 error;再打开设计期包,执行Project > Build后点击右键菜单里的Install,IDE 会弹窗提示 “Package ... installed”,组件面板新增一个EhLib页签。

如果不先编译运行期包直接安装设计期包,常见的报错是找不到EhLibVCL.bpl或Can't load package ... 找不到指定的模块。安装完成后,新建一个 VCL Application,展开组件面板的EhLib页,看到TDBGridEh、TDBComboBoxEh等组件就算装成功了。

有一类安装场景需要注意:如果你用的是 Delphi 12 Community Edition,安装包时可能提示缺少构建工具链。这是因为社区版默认不安装 C++ Builder 组件,而 EhLib 的某些设计期包在编译时需要对应的工具链支持。解决办法不是去装整个 C++ Builder,而是回到 IDE 的Tools > GetIt Package Manager里补装 Delphi 12 的Delphi Compiler组件包,或者改用项目级的运行时引用方式绕开设计期包。这个坑在 12 Athens 上比之前版本更容易触发,因为 Athens 对编译器组件做了更细的拆分。

3. 把 TDBGridEh 用起来:合计、排序、筛选和导出的最小配置

3.1 Footer 合计:不再手工拼合计行

TDBGridEh 对比原生 DBGrid 最直观的改进是 Footer 行。设置FooterRow = True后,网格底部会出现一条合计行,配合SumList属性可以按列做加总、计数、平均值。这里面有一个关键点:FooterRow只是显示开关,真正决定合计行为的是每一列的Footer.Value属性和Footer.FieldName映射。

下面是最小配置的代码,放在 FormCreate 或数据集打开之后执行:

// 启用 Footer 行 DBGridEh1.FooterRow := True; // 配置合计字段 DBGridEh1.Columns[2].Footer.Value := '合计:'; DBGridEh1.Columns[2].Footer.FieldName := 'OrderAmount'; DBGridEh1.Columns[2].Footer.ValueType := fvtSum; // 让合计随数据集刷新 DBGridEh1.SumList.Active := True; DBGridEh1.SumList.UpdateFooter;

代码说明:Footer.Value是合计行左侧显示的文字标签,FieldName指定要对哪个字段做聚合,ValueType支持fvtSum(求和)、fvtCount(计数)、fvtAvg(平均)三种。SumList.Active必须设为 True,否则合计值不计算;UpdateFooter是手动刷新,如果你在数据集AfterScroll事件里改了过滤条件,要记得调用它。另一个容易忽略的参数是Footer.Font.Color,默认颜色和正文一致,深色背景下容易看不清,建议在对象检查器里显式设置成clNavy或系统高亮色。

3.2 点击标题栏排序:一行属性搞定本地排序

原生 DBGrid 要点击列标题排序,需要自己在OnTitleClick里拼 SQL 或写排序逻辑。TDBGridEh 把这个过程压缩成了两个属性:SortLocal := True走本地内存排序,适合几千行的数据;SortLocal为 False 时则依赖IndexFieldNames触发索引排序,适合 ClientDataSet 或 UniDAC 等支持索引的数据集。

运行时配置代码如下:

DBGridEh1.SortLocal := True; DBGridEh1.IndicatorTitle.ShowSortMarker := True; DBGridEh1.IndicatorTitle.SortMarker := smUpEh;

代码说明:SortLocal开启后,点击列标题会在升序和降序间轮换,无需任何事件代码。IndicatorTitle.ShowSortMarker会在行指示器列显示箭头图标,这个属性属于视觉反馈,建议打开,否则用户不知道当前排序列是哪一列。SortMarker可以设置箭头样式,smUpEh是上箭头、smDownEh是下箭头、smBothEh显示双向斜箭头。如果发现点击标题排序没有反应,先检查SortLocal是否被后续代码重新设为 False,再检查这列绑定的字段是否在 SQL 查询里被计算过(比如CASE WHEN生成的虚拟字段),内存排序对虚拟字段也能工作,但数据集刷新后排序状态会丢失,需要在AfterOpen里重新指定DBGridEh1.SortMarkedColumns。

3.3 下拉筛选:STFilter 属性组合

筛选是 TDBGridEh 另一个值得换控件的理由。把STFilter.Visible设为 True 后,网格标题行下方会多出一排筛选单元格,针对每一列生成下拉列表或文本输入框,用户直接选择或输入内容就能过滤数据。

组合配置方式如下:

DBGridEh1.STFilter.Visible := True; DBGridEh1.STFilter.Local := True; DBGridEh1.STFilter.Location := stflInTitleEh;

代码说明:STFilter.Visible是总开关,控制筛选行是否显示。STFilter.Local决定过滤方式是本地过滤还是远端过滤:True表示在内存中过滤当前已加载的数据,适合 ClientDataSet;False表示触发OnFilterRecord事件让你自己写过滤逻辑,适合要从数据库重新查询的场景。Location有三个值,stflInTitleEh把筛选控件嵌入标题行下方,stflUnderTitleEh在标题行下面单独占一行,stflInTitleEh更紧凑但列头空间会被压缩。中文环境下建议把STFilter.InstantFilter设为 True,这样用户输入关键字时实时过滤,不需要敲回车,体验上接近 Web 端的表格筛选。

筛选功能真正比较耗时的不是配置,而是数据集的过滤能力。如果你用的是 TADOQuery,本地筛选默认走Filtered := True,但字段类型是 ftString 时中文筛选可能出现乱码或不匹配,解决方法是把STFilter.Local改为 False,在OnFilterRecord里用Pos(LowerCase(FilterText), LowerCase(Field.AsString)) > 0做包含匹配,这样至少能做到“所见即所得”。

3.4 导出 Excel:内置导出单元与中文乱码处理

EhLib 的导出能力不依赖 Office COM,它把数据按文本格式写入文件,因此发布机器上不需要安装 Excel。导出操作最常踩的坑是提示“导出功能不可用”或“ExportToExcel 方法未找到”,原因是没有引用对应的导出单元。

推荐做法是在项目引用的 uses 中加入导出单元,然后调用方法:

uses EhLibVCL, DBGridEhImpExp; // 导出当前网格数据到 Excel 可打开的文件 SaveDBGridEhToExportFile(DBGridEh1, 'D:\report.xlsx', True);

参数说明:SaveDBGridEhToExportFile第二个参数是文件名,后缀名决定导出格式,.xlsx输出办公表格文件、.csv输出纯文本、.htm输出网页格式。第三个参数True表示包含 Footer 合计行,False则忽略。如果你调用这个函数时 IDE 提示未声明,第一步不是改代码,而是检查DBGridEhImpExp是否已经加入 uses。另外,导出文件如果中文变成了乱码,通常是因为导出的 .csv 文件默认使用系统 ANSI 编码,Excel 打开时会按本地代码页猜编码。解决办法是改用.xlsx后缀,EhLib 内部会做编码转换;如果业务上必须导出 csv,就在导出后手动追加一行separator=,并用 UTF-8 BOM 写文件头。

3.5 组件面板里的其他高频组件:TDBComboBoxEh 和 TDBLookupComboboxEh

EhLib 不止一个网格控件。TDBComboBoxEh解决的是下拉框里既要能选择又允许输入新值的需求,这在做基础资料界面时非常实用,原生 TDBComboBox 在Style := csDropDown下的下拉列表刷新逻辑很绕。TDBLookupComboboxEh则是对原生 TDBLookupComboBox 的强化,DropDownBox.Columns可以配置多列下拉列表,比如下拉显示编码和名称两列,回填到字段里的只有编码。这两个组件安装后就在同一个 EhLib 面板页里,不需要额外安装包,属于一次安装全量可用的那一类。

常用属性对照表如下:

组件核心属性作用坑位提醒
TDBGridEhFooterRow / SumList底部合计行SumList.Active 忘记设 True 则合计不显示
TDBGridEhSortLocal点击标题排序数据集刷新后排序状态丢失
TDBGridEhSTFilter.Visible标题下拉筛选中文筛选要调整 Local 和 OnFilterRecord
TDBComboBoxEhItems / EditText可编辑下拉下拉列表项变更后要调用 Refresh
TDBLookupComboboxEhDropDownBox.Columns多列下拉列宽合计不能超控件宽度

4. EhLib 安装与使用避坑:五个高频翻车点及排查顺序

4.1 编译报错:找不到 EhLibVCL.dcp 或 Find unit 失败

现象是打开项目后第一眼就看到F1026 File not found: 'EhLibVCL.dcp',或者某个引用了 DBGridEh 的单元报Cannot find unit 'DBGridEh'。

原因通常是 Library Path 配置无效,IDE 的包索引缓存没有刷新。Delphi 12 在启动时会预加载已有的 dcu 索引,新增路径后不重启 IDE,编译器仍然使用旧索引查找单元。

解决方法是先确认EhLibVCL.dcp文件确实存在于安装包的Lib或Bin目录下,然后把该目录加入 Library Path,最后完整重启 IDE,按Ctrl+Shift+F11打开 Project Options,在Delphi Compiler > Search Path里也加上同一目录。项目级 Search Path 优先于全局 Library Path,两者都配可以避免某些使用$(DELPHI)宏的旧版工程模板互相覆盖。

4.2 组件面板没有出现 EhLib 页签

现象是包编译成功但 IDE 的组件面板里找不到 TDBGridEh,工具菜单里也没有新增控件。

原因很可能是设计期包装了没卸载又重复安装,Delphi 是在 IDE 启动时扫描已注册的包,如果你在同一个 IDE 会话里执行了多次 Install,第二次会提示包已存在,但组件面板索引没有重建。

解决方法是:关闭 IDE,删除安装目录下所有.bpl文件,重新打开 IDE 后只安装一次设计期包。同时检查Component > Install Packages列表里是否有多个版本号的 EhLib 条目,有则全部移除,然后重新安装当前版本。这个“只装一次”原则适用于所有 Delphi 控件包,凡是提示 “already installed” 的,先清理再装。

4.3 安装包时提示 Unit 'System.Types' 版本不匹配

现象是编译 dpk 时编译器弹E2197或E2225 版本不匹配,具体指向System.Types.pas或System.Classes.pas。

原因一般是系统 PATH 环境变量里有残留的旧版 Delphi 安装目录(比如 Delphi 10.3 的bin还在 PATH 里),当 IDE 调起编译器时,dcc32.exe加载了错误版本的 RTL。

解决方法是检查控制面板 > 系统属性 > 环境变量,删除 Delphi 旧版本相关的BDS、Delphi路径变量,只保留当前 Delphi 12 Athens 的bin目录。如果公司电脑上有多个 Delphi 版本共存且不能删环境变量,可以在 IDE 的Tools > Options > Environment Variables里新增一个BDSLIBPATH覆盖变量,强制编译器走当前版本的 Lib 路径。

4.4 导出 Excel 仅生成 .xls 文件但数据是文本格式

现象是导出的文件用 Excel 打开正常,但在单元格里看到的内容复制到别处后丢失格式,以及数字列被当成文本无法参与公式计算。

原因是我在 3.4 里提到的文本导出机制:EhLib 的默认导出是“文本转表格”,它不是写真正的二进制 XLSX 而是生成 XML 格式后改名。Excel 打开时能识别,但内部每个单元格的数据类型都被标记为字符串。

解决方法是尽量使用SaveDBGridEhToExportFile(DBGridEh1, ..., True)并指定.xlsx后缀,EhLib 内部对 xlsx 的导出会做类型转换。如果客户要求必须 .xls 后缀,可以在导出后手动用TFileStream打开文件并替换头部声明,但这个操作不稳定,更稳妥的做法是导出后期调用一次 Excel 的TextToColumns宏——这种方式要引入 COM,就不推荐了。说到底,最省事的方案是让客户接受.xlsx格式,Excel 2007 之后的版本全部能打开。

4.5 运行时提示找不到 EhLibVCL.bpl

现象是开发环境里运行正常,把编译好的 exe 复制到别的机器上运行时报无法找到 EhLibVCL.bpl。

原因是你编译时勾选了“使用运行时包”(Project Options > Runtime Packages > Build with runtime packages),exe 不包含控件代码,启动时动态加载 bpl。

解决方法是二选一:要么把EhLibVCL.bpl、EhLibDesign.bpl和VCLxxx.bpl一并拷贝到 exe 同目录发布;要么在编译时取消勾选“Build with runtime packages”。我一般建议取消勾选,EhLib 的核心包也就几百 KB,静态链接后发布目录干净,少一个 dll 级别的依赖,对甲方交付更省心。如果你做的项目已经在用 FastReport VCL 等大型包,并且它们也是动态链接的,那就保持统一用 bpl 方式发布,不要混用静态和动态。

5. 再做一步:把网格布局与合计设置持久化,省掉重复配置

控件装好、功能跑通之后,我每次新项目里都会做的一件事是把网格配置保存成文件。TDBGridEh 内置了SaveGridLayoutToFile和LoadGridLayoutFromFile两个方法,它们能持久化列宽、列顺序、Footer 开关和排序状态。这对“用户调整过列宽后重启又变回默认”的老问题几乎是一剂后悔药。

最基本的用法是在 FormDestroy 里保存、在 FormCreate 里恢复:

procedure TForm1.FormCreate(Sender: TObject); begin // 恢复上次保存的网格布局;文件不存在时保持默认 if FileExists(ExtractFilePath(Application.ExeName) + 'grid_layout.cfg') then DBGridEh1.LoadGridLayoutFromFile( ExtractFilePath(Application.ExeName) + 'grid_layout.cfg' ); end; procedure TForm1.FormDestroy(Sender: TObject); begin // 保存列宽、列顺序、Footer 状态、排序状态 DBGridEh1.SaveGridLayoutToFile( ExtractFilePath(Application.ExeName) + 'grid_layout.cfg' ); end;

这里有个容易忽略的细节:SaveGridLayoutToFile保存的是列索引和宽度的映射,一旦数据集字段结构变化(比如 SQL 把某个列删掉),恢复时可能出现列错位。保守做法是只保存列宽和 Footer 状态,不保存列顺序,即把DBGridEh1.SaveGridLayoutOptions设为[gloColWidthsEh, gloFooterEh]。另外,如果你用了STFilter并且有用户自定义的筛选条件,布局文件里不会包含筛选内容,筛选条件需要你自己用STFilter.SaveFilterToFile单独落盘。组合使用后,用户调整的表格习惯就能跨会话保留,这在项目验收时是个很加分的细节。

还有一个小习惯:版本升级后第一次打开旧工程,务必先跑一遍 EhLib 自带的 Demos。那个示例工程能验证当前版本和 Delphi 12 Athens 的编译器是否完全兼容,很多隐蔽的边界问题在 Demo 里会直接暴露成编译错误。我经历过一次从 10.4 跳到 12.0 的升级,项目里大量用了旧的DragDrop属性写法,Demos 编译失败后才意识到新版本改了接口签名,没有这个对照排查会浪费至少半天。Delphi 生态里控件升级的“黑匣子”很多,但 EhLib 的一个好处是 Demo 覆盖广,把它当成校验基线,比对着文档空想要快得多。希望这些路径和参数能帮你顺利把 EhLib 跑起来。

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

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

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

立即咨询