资讯动态

EhLib 11.1在Delphi 12.3的完整安装与实战指南

发布时间:2026/8/29 15:00:44 来源:尧图企业网站定制
简介在VCL数据库开发中数据网格是构建管理信息系统的核心交互组件。EhLib作为一款成熟的控件库通过提供统一的排序、统计、筛选、分组合并等高级数据编辑能力显著提升了开发效率。其Full Source全源码模式更让开发者能够深入编译与调试灵活扩展业务呈现。伴随IDE升级或项目迁移正确安装运行期与设计期包、配置全局搜索路径是发挥组件价值的前提。本文从EhLib的基本概念和原理出发以Delphi 12.3环境安装EhLib 11.1 Build 11.1.015为例详细介绍解压、编译、注册到IDE的完整流程并结合订单查询界面演示了DBGridEh的列头排序、底部统计、行内筛选等典型应用同时总结了旧版升级、跨平台编译及数据源混用时的常见问题与解决方案适合需要维护老项目或正在评估数据网格选型的开发团队参考。 看到这个压缩包标题很多老朋友应该会心一笑Delphi 12.3搭配EhLib 11.1Professional EditionFull SourceBuild 11.1.015。我在升级IDE这件事上保守得很但每次换新版DelphiEhLib一定是第一批跟着装进来的第三方控件。今天这篇不聊虚的就围绕这个安装包把“为什么选它、怎么装上、装完怎么用、用起来有哪些坑”一次性交代清楚。不管是长期维护老项目的团队还是刚入行面对公司旧代码库的新人这篇文章都能用得上。1. 老项目升级到Delphi 12.3为什么第一时间想到EhLib先说说背景。Delphi这个圈子有个很有意思的现象你很少看到有人因为“新功能”主动升级IDE绝大多数人升级是因为“电脑换了”“系统重装了”或者“客户要求支持新Windows版本”。我也差不多。真正促使我认真研究Delphi 12.3和EhLib 11.1组合的是手上一堆跑了七八年的老管理软件它们的数据展示层几乎全部建立在EhLib之上。EhLib这个组件库在VCL数据库开发里基本属于“半官方标配”。它不是在TDBGrid上打几个补丁而是把日常开发中真正高频的需求——排序、统计、合计、筛选、分组合并、下拉列表、自动调整列宽——集成到一套统一的组件体系里。很多从Delphi 7时代走过来的项目界面上的网格、下拉框、日期选择、数值输入框底层都是EhLib。所以当项目迁移到Delphi 12.3时能不能找到一个兼容新版IDE的EhLib版本直接决定了迁移工作量。这次拿到的Build 11.1.015按照EhLib官方的版本节奏属于适配Delphi 12.x系列的成熟版本。之前我在Delphi 11上用的是10.x版本升级后碰到两个问题一是控件的设计期图标不显示二是编译老的包会报“unsupported version”。换成11.1之后这两个问题都消失了。对项目组来说这种“不动业务代码、只换运行环境”的升级方式是最理想的。这里要特别说一下“Full Source”的意义。EhLib有试用版和源码版之分试用版在运行时会弹出提示窗口具体表现为程序启动后弹一个“未注册”的对话框这在交付给客户时是不可接受的。Full Source版本意味着所有单元的.pas源码都给了你可以自己编译、自己修改、自己跟踪调试。对于需要长期维护的项目这一步的价值体现在两个地方出了问题可以直接进入EhLib源码断点调试不用靠猜后续想给网格加一个业务专属的绘制效果可以直接在源码层面扩展。所以我拿到这个安装包之后第一件事不是急着装到IDE里而是先解压看一下目录结构搞清楚自己拿到的到底是什么。2. 解压之后先别急着装认识一下EhLib 11.1的交付结构很多朋友拿到第三方组件安装包的习惯是“一路Next”装完能用就算完事。这种思路在开发环境里其实挺危险的因为一旦编译不通过你都不知道问题出在哪一步。我建议你解压之后花十分钟把目录结构过一遍知道每个文件夹里是什么。这能帮你省掉后面大量排查时间。典型的EhLib Full Source目录里会有这么几类东西目录或文件作用使用时机Packages文件夹存放各版本Delphi的编译工程文件.dpk/.dproj安装控件时用Source文件夹所有运行期单元源码调试和查看实现时用Resources文件夹设计期需要的图标、语言资源编译设计期包时用Demos文件夹官方示例工程学习属性用法时用Readme或Install说明版本匹配和编译顺序说明安装前必看关键点在Packages目录。不同Delphi版本对应的包工程是分开的你千万不要图省事直接拿Delphi 10.4的包工程在12.3里打开然后强行编译。正确做法是找到与Delphi 12.3匹配的包通常是目录名里带“D12”或者“Delphi 12”字样的那些。如果目录名是按IDE版本号区分的那你需要确认12.3对应的是哪个。版本选错了编译报错是小事最怕的是编译完装进IDE运行时发现包依赖于其他版本的运行时库那才叫麻烦。这个解压包里另一个要关注的是Redistributable相关的内容就是运行用到的lib文件。不过因为这次是Full Source所以我们主要走“自己编译”这条路。然后再来看控件分组。EhLib不只是一个网格控件它是围绕数据编辑的一套组件族。日常用到的核心组件大概分这几组TDBGridEh系列数据网格功能最重支持排序、合计、Footer、下拉筛选、树形结构TDBEditEh / TDBNumberEditEh / TDBComboBoxEh / TDBDateTimeEditEh绑定型编辑器TEditEh / TComboBoxEh非绑定型编辑器TDBLookupComboboxEh下拉查找框的增强版TDBMemoEh / TDBImageEh大字段编辑显示TTBDComboEh? 或者网格内嵌的按钮列、下拉列这类辅助类组件。单看名字你会觉得“这不就是原生控件换个名字”但实际上手之后差别非常大。拿TDBGridEh举例原生TDBGrid你如果要实现“点列头排序”得自己写OnTitleClick事件拼SQL再刷新数据集。TDBGridEh里默认就有一组排序属性打开开关之后排序逻辑自动接管你只需要处理业务层的特殊情况。为了让你后面用起来不懵我再解释几个Full Source版本特有的前置概念运行期包Runtime Package和设计期包Design Package。运行期包是应用程序运行时链接的组件实现通常叫“EhLibXXX.bpl”设计期包是给IDE用的负责把控件注册到面板上通常叫“dclEhLibXXX.bpl”。安装的顺序是先编译安装运行期包再编译安装设计期包顺序反了或者漏了IDE面板上就看不到控件。这个顺序在源码版里尤其重要因为官方示例工程引用的是运行期包而你IDE里的设计期包需要单独注册。3. 从.7z到IDE面板可见完整编译安装过程记录下面是这次在Delphi 12.3环境里安装EhLib 11.1 Build 11.1.015 Full Source的完整过程。我用的环境是Windows 11 x64IDE为Rad Studio 12.3。不同电脑的路径会有差异但步骤逻辑是通用的。3.1 解压与目录整理把压缩包解压到一个不含中文和空格的纯英文路径下比如D:\Components\EhLib。这一步看着多余实际上很关键。Delphi的老版本编译器对中文路径和带特殊字符路径的兼容性一直不算好尤其是涉及资源文件编译的时候偶尔会出一些莫名其妙的错误。尽量一开始就沿着“不会出问题”的路走。解压后不要放在系统盘的Program Files目录下。很多组件在编译时会写文件到自己的目录而Program Files受UAC权限保护IDE以管理员权限运行还行普通权限编译时经常报“Access denied”。我自己现在统一把第三方组件放在D盘的一个Components目录下按照“组件名版本号”命名比如D:\Components\EhLib_11.1。后面配置Library Path和管理多版本时都方便。3.2 选择正确的包工程并确定编译顺序打开Packages目录找到对应Delphi 12.3的子目录。如果你不确定是哪一个可以看目录名里是否带“D12”后缀或者对比工程文件里的平台版本。打开方式有两种在IDE里通过File Open打开对应的.dproj或.dpk文件直接在Package Manager里加载。我的做法是打开.dproj工程后先确认Project Options里目标平台。当前项目如果是32位程序就把Target Platform切成Win32如果是64位程序就切成Win64。这里要特别提醒你可以选择编译多个平台但安装到IDE设计期面板时需要确保设计期包注册的是当前IDE运行的那个平台。Delphi 12.3的IDE跑在Win32模式所以设计期包一定要编译Win32版本否则面板上不显示。编译顺序严格执行两步先编译运行期包即不带dcl前缀的那个工程再编译设计期包。运行期包编译通过后会在输出目录生成.bpl文件和.dcp文件设计期包编译时依赖这些文件。如果你直接先编译设计期包大概率会报“找不到xxx.dcp”的错误。在Build 11.1.015里包文件后缀带版本号所以编译完成后生成的.bpl也是带版本号的。这样做的好处是不同的EhLib版本可以共存但对开发者来说需要留个心眼项目工程里引用的是哪个版本的包别搞混。3.3 安装设计期包到IDE运行期包编译完成接下来安装设计期包。在IDE里执行Component Install Packages弹出对话框中点击Add定位到设计期包编译生成的.bpl文件。选中的瞬间Package Manager里会出现对应包同时工具栏的控件面板上会出现一组新的控件页签EhLib系列的控件就都躺在里面了。这个环节有一个常见问题设计期包安装成功后打开窗体却看不到控件图标。这种情况多半是设计期包编译时使用的RTL版本和当前IDE实际加载的RTL版本不一致。解决办法是回到包工程里确认Project Options中Runtime Packages的Use Runtime Packages选项是勾选状态然后再重新编译一次设计期包。这个选项的作用是让设计期包也走动态包链接避免静态链接带来的版本冲突。3.4 配置全局搜索路径安装完成不代表所有工程都能直接用。新工程在IDE的环境选项里加一下Source目录的搜索路径这样写代码时IDE能识别EhLib单元代码提示和编译都能找到源文件。打开Tools Options Language Delphi Options Library在Library Path里追加一行指向解压目录下的Source文件夹。这里有个细节Library Path是全局生效的意味着你所有工程都能用EhLib的源码单元。如果只是个别工程使用也可以把路径加到工程的Search Path里。我个人的习惯是加全局路径因为EhLib这种基础组件基本每个项目都会用全局加一次省事。配置完后新建一个VCL工程往窗体上拖一个TDBGridEh能看到控件正常生成双击可以进入列编辑器说明整个安装过程基本成功。接下来就是实际的编码使用环节了。4. 第一个带排序、统计、筛选的查询界面半小时跑通核心流程安装好控件直接上实战。我用一个经典的订单查询界面做例子把这个需求从头到尾做完顺便把关键属性说明白。场景一个订单表字段有订单号、客户名称、订单日期、订单金额、状态。界面要求网格显示订单列表点列头可以排序底部显示订单数和金额合计顶部能按客户名称或状态做筛选。4.1 数据访问层准备数据访问我用的还是FireDAC组件这里的逻辑和有没有EhLib关系不大。窗体上放一个FDConnection、一个FDQuery设置好连接和SQL。SQL写成这样SELECT OrderID, CustomerName, OrderDate, OrderAmount, Status FROM Orders ORDER BY OrderID然后在设计期把FDQuery的Active设为True。如果这个阶段数据集没数据后面调EhLib属性看不出效果所以务必先确认查询能返回数据。4.2 网格绑定与基本列配置向窗体放一个TDBGridEh一个TDataSourceDataSource1.DataSet指向FDQuery1DBGridEh1.DataSource指向DataSource1。这个时候设计界面上应该能看到订单数据了。在列编辑器里把需要的列添加出来并设置列头的Title.Caption为中文。关于列类型有几个值得提前掌握的默认列类型是列字段适合普通文本和数字复选框列适合布尔类型下拉列表列适合枚举状态字段按钮列适合做“操作”列。这个例子里把Status字段设为下拉列表列下拉项映射成“已提交、处理中、已完成、已取消”用户点单元格就能改状态编辑体验和日期、文本字段完全不一样。具体操作是在列编辑器里选中Status列把列类型的对应属性设为dtPickList或者直接设置KeyList和PickList。KeyList里放真正的数据库值PickList里放下拉显示值。这样原始数据、显示文本和用户选择之间有一层清晰的映射。4.3 开启列头排序EhLib的列头排序功能是它最大的卖点之一。默认情况下TDBGridEh的列头是普通标题要实现排序需要把两个属性配合起来DBGridEh1.OptionsEh中的dghAutoSortMarking设为True数据集上对应字段的索引已经建立或者让网格自己做本地排序。如果数据集是本地模式比如FDMemTable或ClientDataSet开这个功能是纯前端排序用户体验很流畅。如果是服务器端数据库我更推荐在SQL里写ORDER BY然后配合OnTitleClick事件通知服务器重新查询。这里不展开服务器逻辑只演示本地排序。运行时点击列头你会发现表头自动出现三角箭头升序降序切换数据行同步变化整个过程不需要写任何代码但实际效果却和原生TDBGrid不可同日而语。4.4 底部统计栏计数字段与合计金额底部统计栏是TDBGridEh的另一大招牌。这个功能在会计、进销存、仓储这类系统里几乎是刚需。实现方式分两步。第一步在DBGridEh的底部放一个Footer。对应属性是FooterParams可以通过设计期的RowHeight和Font参数控制样式。第二步针对金额列设置合计。在列编辑器里选中OrderAmount列打开列的Footer字段设置FieldName为OrderAmountValueType设为fvtSum。这样网格底部会自动出现一行显示所有行的金额合计。统计类型不止Sum还有Count、Min、Max、Average。订单数这一列我用fvtCount统计订单条数。你用这个功能之前先确认数据集是全部加载的。如果数据量巨大分页模式下直接算合计会算错那就要改成服务端计算后把结果塞到Footer的Value里。4.5 行内筛选状态下拉与客户名称模糊过滤筛选功能在数据量一大之后就显得特别重要。EhLib提供了好几种筛选方式我最常用的是网格自带的“列头行筛选”在网格顶部显示一行可编辑的筛选行用户直接输入内容进行过滤。开启方式很简单把DBGridEh1.IndicatorOptions里的ioShowFilterBar开关打开。运行后你就会看到网格标题栏下面多出一行列头下面有输入框。输入客户名的一部分网格自动过滤在状态下拉选择“已完成”只剩对应数据。这个筛选在本地执行速度非常快但没有走SQL对大表只能配合分页使用。实际做法通常是这样用户选择完筛选条件点击“查询”按钮把条件拼进SQL重新加载如果只是临时筛选用本地筛选就够了。做到这里一个平时要写不少事件代码的查询界面已经跑通了。剩下的工作基本就是根据业务不断调整列的展示格式。5. 真实交付项目里躲不过去的几个坑上面讲的是理想路径实际交付项目的时候情况会复杂不少。下面这几个坑是我在多个项目里踩过之后总结出来的每一个都花了至少半天时间排查。5.1 从旧版EhLib升级到11.1的“包冲突”项目从Delphi 7时代就开始用EhLib代码里引用的单元是EhLib相关单元但旧版本的BPL文件名和新版本完全不同。升级后IDE里可能同时存在旧版和新版两套设计期包。这时候打开旧工程如果LoadPackage顺序不对IDE会报“Class already exists”或者“Unit ... was compiled with a different version of ...”。解决办法是把旧版本的EhLib包全部从IDE里移除包括Library Path里的旧路径然后重启IDE再添加新版本的包。不要试图让新旧版本共存虽然不同版本的包文件名不同但组件类名是相同的设计期类重复注册在Delphi里基本无解。5.2 Win64编译时“找不到单元”或“证书失效”Delphi 12.3支持64位编译但很多老项目还停留在Win32。当你首次切换到Win64平台编译时会发现EhLib控件报“Unit xxx not found”。原因很简单你的Library Path里虽然加了Source目录但不同平台的搜索路径是分开管理的。你需要打开Tools Options Language Delphi Options Library切换到Win64平台确认Source路径仍然存在。很多人在Win32下配置完 Library Path切到Win64后没检查导致编译不通过。还有一种情况是Win64平台下没有编译对应的运行期包导致DCP文件缺失这个在升级时尤其常见。全平台编译一次能省去后面切换平台时的很多麻烦。5.3 设计期看得到数据运行期变成空白这种问题通常和数据集的Active状态有关。设计期FDQuery是打开的网格上能看到数据但是运行期FormCreate里没有把数据集重新打开或者数据集的Connection没有指向正确的连接。因为设计期和运行期共享同一个DataModule但运行时会重新执行构造逻辑如果你在FormCreate里没有主动Open数据集那运行期网格自然没有数据。排查思路是先在运行期确认FDQuery1.DataSource的数据是否有效。可以在设计期设置DataSet的Active为True但如果数据库连接串里带密码或者目标机器上没装对应驱动运行期还是会失败。稳妥的做法是在FormCreate里显式打开数据集并且把错误处理写好这样才能保证交付环境里能正常运行。5.4 中文排序和统计结果不对这是中文用户最容易遇到的问题。网格开启排序之后点击客户名称列你会发现排序结果并不是按拼音或中文顺序而是按字符编码排的看起来像随机顺序。EhLib的本地排序默认比较的是字符串的二进制值中文在这种比较下不会得到拼音序。针对这个我有两个方案一是在SQL层解决用数据库自己的排序规则排序再交给网格显示二是通过网格的OnSortMarkingChanged事件自己实现中文排序逻辑。如果你只是想要一个大致可读的顺序第二种方案其实够用。另外还有统计栏的数值精度问题。金额字段如果是FloatFooter里统计出来的合计可能会有浮点误差比如显示成0.30000000000000004。稳妥做法是字段类型用Decimal网格列的DisplayFormat也用带两位小数的格式。这些老生常谈的问题在EhLib里一样需要注意。5.5 网格打印预览的部署依赖如果项目里用了EhLib的打印预览功能部署客户端时记得把对应的运行时包也带上。Full Source版编译后的程序如果采用动态链接运行时包的方式需要将对应BPL和DCP一起发布。忘了带包最典型的报错是“Cannot load package xxx”。为了避免这类部署问题我在交付配置里建议统一采用静态编译方式也就是在Project Options里把Build with Runtime Packages选项取消掉然后把EhLib相关的源文件编译进exe。后果是exe体积变大一点但部署时再也不用操心机器上有没有装对应BPL。这个选择对动不动需要拿U盘去客户现场部署的传统管理软件来说是非常省心的。5.6 和ODAC/ADO等其他数据访问组件混用时的提示很多老项目的数据访问层用的是ODACOracle Data Access Components或者ADO数据源组件是TOraQuery或TADOQuery。EhLib对数据源接口的兼容性做得不错大多数情况下你只需要把Delphi自带的TDataSource作为桥接一边连接ODAC/ADO的数据集一边连接DBGridEh即可。比较容易踩坑的是ODAC有自己的字段类型映射和状态管理当EhLib网格编辑字段并提交时如果ODAC的Update模式设置不合理会报“Record not found or changed by another user”。这其实不是EhLib的问题而是数据集更新条件的默认配置太严格。你需要在ODAC那边把UpdateCriteria的配置适当放宽。排查思路上先确认纯ODAC环境下数据集更新是否正常再接入EhLib这样能快速定位问题出在谁身上。6. 网格方案怎么选EhLib、DBGrid还是cxGrid每次谈到数据网格都会有人问“为什么不直接用DevExpress的cxGrid”。我的回答是看场景没有绝对优劣只有适不适合你的项目。先放一张对比表方便你对照判断对比维度原生TDBGridEhLibcxGridDevExpress学习成本低中低高功能丰富度基础高数据库场景强极高支持复杂视图依赖体积无小大需要引入大量DevExpress单元定制自由度一般高有源码可改高但文档复杂跨FireMonkey支持有基础网格VCL为主移动端支持有限有FMX版本支持适合场景内部简单小工具传统管理软件、ERP、进销存报表复杂、界面炫酷的企业应用EhLib的定位很明确它把自己限定在“数据编辑与展示”这块。你不需要理解复杂的View层次不需要关心皮肤机制绑上DataSource就能干活。它不会给你做什么花哨的UI效果但对订单、客户、库存这类表格数据的处理做到近乎零成本。正是这种“专一”让它在老项目里扎根特别深。cxGrid强在视图多样化、多级主从、卡片布局、复杂样式。它的学习曲线陡峭如果你只想做一个带排序和统计的网格花两天去学cxGrid纯属浪费。但如果你要做那种主表、明细表、汇总面板、卡片视图切换的复杂界面cxGrid才是合适的工具。原生TDBGrid则适合那种“数据量小、功能简单、以后不打算扩展”的工具软件。你说它够用吗够用。但一旦客户提出“加一列合计”、“点列头按日期排一下序”你就得回到代码里写一堆事件而这种事在EhLib中本来只是勾个属性。还有一点值得提热词里有人搜“delphi firemonkey pda”说明现在也有不少人用FireMonkey做PDA移动端。EhLib的主要阵地是VCLFMX下虽然有一些版本支持但功能完整度确实不如VCL版。如果项目是纯FMX我不会首选EhLib而是用TStringGrid临时方案或者选专门支持FMX的网格组件。反过来如果你的项目还是VCL那EhLib几乎就是最优解。7. 我个人在使用EhLib过程中的一些体会最后说点轻松的。用EhLib这么多年我最满意的一点其实是它的代码风格。官方源码写得很规矩每个核心类设计得都相对独立注释也比较到位。遇到疑难杂症进入源码调试基本都能找到问题出处。这一点和很多“装了能跑、写完看不懂”的第三方库相比体验好太多了。我目前这几个线上项目升级到Delphi 12.3之后EhLib 11.1跑得很稳代码层面几乎没做改动。如果你也刚拿到这个Build 11.1.015的安装包不要急着吐槽“怎么还不出.NET版”之类的老梗先把它编译干净、装进IDE然后找一个旧项目试着打开看看属性面板、事件、列配置是不是和以前完全一样。大多数情况下你会发现一切如初数据库界面该什么样还是什么样真正需要改的反而是一些跟EhLib无关的注册表、第三方驱动问题。还有个小建议每升一次级就到Demos目录下翻翻新的示例工程。EhLib每次改版都会增加一些细小的增强功能比如新的Footer计算类型、新的统计展示方式。这些功能藏在示例里官方文档不一定写得特别显眼。花一晚上时间把Demo跑一遍比事后在项目里翻代码要省力得多。今天就聊到这后面如果大家在实际操作里碰到具体报错欢迎在评论里把报错信息贴出来我们一起对着看一下。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价