
简介EhLib VCL 10.2.42 for Delphi 12 Athens 是面向 Delphi 开发者的可复用控件集成包专注提升企业级数据库应用、报表与图形界面的开发效率。包体共收纳1490个文件体积约25.56MB其中dfm窗体描述、pas单元源码、dcu编译单元及hpp头文件构成主体配合dpr工程文件、dpk包文件与res资源文件便于直接安装或二次编译调试。已有346人学习使用。这套组件覆盖EhDBGrid等数据库表格、EhReport报表设计、EhGantt甘特图、EhDiagram流程图、日期时间工具及对话框等常见场景并提供树形视图、资源管理器浏览等实用控件同时采用高效内存管理优化大数据量展示性能紧密集成Delphi 12开放API支持深度定制附CHM帮助文档、示例源码和单元测试数据库可帮助开发者快速搭建专业前端界面并降低后期维护成本。1. 先说清楚这东西到底是干嘛的看到这个标题常年在 Delphi 圈子里泡着的老哥们应该已经条件反射了。EhLib VCL 10.2.42 for Delphi 12 Athens.7z说白了就是一套专门给 Delphi 12 Athens 适配好的 VCL 控件库压缩包。Delphi 12 的代号是 Athens这一点从Delphi 12 Athens就能直接对上号。很多从 XE 时代一路走过来的老朋友习惯看到EhLib就知道这是用来强化 DBGrid 的利器但放在 Delphi 12 这个新版本上安装和使用多多少少有几个新细节要留意。先给没接触过的新同学补个基础认知EhLib 是一套非常经典的 VCL 扩展控件库核心卖点是它把原生 DBGrid 的编辑、筛选、排序、分组、合计、树形展示、下拉表格这些能力全部补强了。原生 TDBGrid 说实话只能干点粗活业务系统里那种“客户要求能筛选、能合计、能按 F2 弹下拉还要直接把 Excel 粘进来”的需求原生的 DBGrid 满足不了的大多数人最后都会找到 EhLib 头上。我现在手头维护的两套老管理软件报表查询那一堆页面全是建立在 TDBGridEh、TDBLookupComboboxEh、TDBEditEh 这些控件之上的没有这套东西代码量至少要翻一倍。这次拿到的是 10.2.42 版本对应 Delphi 12 Athens。从版本号看属于一个相对稳定的发行版适合直接上生产环境。不过有个非常容易踩的坑EhLib 每个大版本都针对不同 Delphi 版本打包了不同的目录或文件如果装错版本IDE 直接报Package ... not found或者编译期一堆F2613 Unit DBGridEh not found。所以解压之后的目录结构必须看清别拿到了包就往里装。我见过不少新手拿到手就开始双击安装包点完 Next 发现 IDE 里什么都没有转头就骂控件有问题。其实绝大多数情况下是没搞懂 VCL 组件库安装的三步逻辑路径配置、运行时包编译、设计时包安装。这篇博文就照着这个逻辑把你从拿到.7z压缩包到能在 IDE 里拖出一个 TDBGridEh 的完整过程捋一遍。2. 解压与目录结构先弄明白再动手2.1 解压之前的两个小准备先说解压工具。.7z格式 Windows 自带的资源管理器是解不了的必须用 7-Zip 或者 WinRAR。我习惯用 7-Zip免费、干净、无广告官网下载完一路 Next 就行。如果你公司电脑装不了绿色软件也可以用 NanaZip 这种微软商店里的开源替代品功能一样的。第二个准备工作是路径。很多老玩家会习惯性把压缩包直接解压到C:\Program Files (x86)\或者桌面这两个地方都不是好选择。原因很简单Delphi 编译时会向这些目录写入 DCP、DCU、BPL 等编译产物如果目录带空格或者没有写权限编译期就会跳出一堆莫名其妙的E6001警告甚至E2202 Required package EhLib not found。我个人的经验是统一放一个纯英文无空格的根目录比如C:\Components\EhLib_10.2.42_D12。宁可多打几个字母也别给自己后面埋雷。2.2 解压后的目录别急着找安装程序解压之后先别双击任何 exe。EhLib 这个控件库和普通的商业控件不太一样它绝大多数场景需要你自己在 IDE 里挂载没有那种“下一步下一步就完事”的傻瓜安装向导。打开解压出来的文件夹你会看到Lib、Source、Docs、Examples、Resources这么几个核心目录。重点看两个地方Lib目录这里面是编译好的部分运行库和需要你自己编译的项目文件通常能看到EhLib100.dpk、EhLib100.dproj这类 Delphi 工程文件。数字后缀和 Delphi 版本有对应关系不同版本数字不一样。Source目录所有的单元源码比如DBGridEh.pas、DBAxisGridsEh.pas、MemTableDataEh.pas等。如果后面你需要在控件源码里加日志、改默认行为改的就是这里。如果你看到的是按目录分名的结构比如Lib_D12、Lib_RAD11那就更直观了直接进Lib_D12这一层。找不到的话去Docs里翻 README 或阅读安装说明文档上面会明确写清楚这一版本支持哪些 IDE 版本。我遇过一种情况是解压后目录里只有Source和Compiled两大块Compiled里有现成的 BPL 和 DCP理论上可以直接挂到 IDE 里。但这里我不建议直接加载预编译的 BPL因为预编译包链接的 Delphi 版本、更新补丁如 12.0 还是 12.1以及 Debug/Release 模式可能和你的环境不完全一致。最干净的方式还是用自己的 IDE 从 DPK 编译一遍这样 DCP、DCU 的路径和编译选项全部对齐到本机后续调试源码也不容易出问题。提示不要试图把Lib下的 DPK 文件用记事本打开乱改版本号。DPK 文件内部有依赖包名和版本描述手改版本号只会让 IDE 的Base Address或包引用校验失败最终报错更难看。3. 安装与集成的完整实操流程3.1 第一步把 Source 目录加进 IDE 的搜索路径打开 Delphi 12 Athens点击菜单Tools Options Environment Variables Delphi Options或者直接走Tools Options IDE Environment Variables这里要看具体的版本界面但核心是在Delphi Options的Library页面里操作。我一般直接点开Tools Options IDE LibraryDelphi 12 里是Tools Options IDE Library: Library在Library path里把这几个目录加进去解压根目录下的Source目录确保 IDE 能找到 .pas 文件如果解压包带了Lib下的子目录比如Lib\Delphi12也要加进去如果后面用到了Resources里的图片资源可能还要加资源目录不过大部分场景用不到。加完路径顺手点Save或者OK。这一步的目的简单说就是让 IDE 在编译任何项目时一旦遇到uses DBGridEh这样子的引用能自动去这些路径下面找文件不用你手动把控件源码复制到每个工程目录里。3.2 第二步编译运行时包打开Lib目录找到类似EhLib100.dpk的文件。注意100 这个数字可能是别的也可能是EhLibDB100.dpk、EhLibCDS100.dpk这种带功能后缀的包。Delphi 12 对应的数字到底是 100 还是 90请以你解压目录里的实际文件名和 README 为准。在 IDE 里执行File Open把EhLib100.dpk打开。此时如果 IDE 提示缺少某些设计时包不要慌通常是没装依赖先把提示记下来回头去Source目录下找对应的包。打开包工程之后看右侧Project Manager面板右键这个包节点选择Compile。等右下角提示编译通过、没有红色报错就可以进行下一步安装。如果你是按Run Install或者是右键Install来操作那也能一次性完成设计包的安装但更多时候建议分开做因为运行包和数据访问包往往有依赖关系安装顺序混乱会带来新的坑。我一般先把所有运行时包全部 Compile 一遍最后再 Install 设计时包。3.3 第三步安装设计时包组件面板出现才算成功在刚才的包工程里再次右键EhLib100.dpk选择Install。此时 IDE 会弹出一个提示窗口类似 “Package ... installed. The following components were added to the palette: ...”里面会列出一堆组件名比如TDBGridEh、TDBLookupComboboxEh、TDBEditEh、TDBCheckBoxEh、TDBDateTimePickerEh等。看到这个提示才算真正安装成功。然后到Component Install Packages里可以看到刚才装的包已经出现在运行时包列表里勾选状态正常。如果你安装时需要额外的功能包比如EhLibCDS100.dpk支持 TClientDataSet 连接、EhLibMemDS100.dpk支持内存数据集等这些包也要按同样流程编译安装。等所有包都装完关闭 Delphi 再重开一次打开工具栏的组件面板在EhLib或Data Controls组里找到那批带 Eh 后缀的控件就证明你的环境已经 OK可以开工了。3.4 实际新建工程验证一次安装完成建议别直接跑到老工程里改先新建一个 VCL Forms Application拖一个TDBGridEh到窗体上配置一个TDataSource、一个TClientDataSet或TFDMemTable看看能不能正常编译运行。这一步是低成本验证编译环境不用写业务逻辑就验证能不能连接数据集、能不能跑起来。我这里提供一个最简单的验证代码片段用TFDMemTable模拟数据var i: Integer; begin MemTable1.Close; MemTable1.FieldDefs.Clear; MemTable1.FieldDefs.Add(ID, ftInteger); MemTable1.FieldDefs.Add(Name, ftString, 50); MemTable1.FieldDefs.Add(Amount, ftCurrency); MemTable1.CreateDataSet; MemTable1.Open; for i : 1 to 100 do begin MemTable1.Append; MemTable1.FieldByName(ID).AsInteger : i; MemTable1.FieldByName(Name).AsString : Item i.ToString; MemTable1.FieldByName(Amount).AsCurrency : i * 1.5; MemTable1.Post; end; DBGridEh1.DataSource : DataSource1; DataSource1.DataSet : MemTable1; // 开启标题栏排序 DBGridEh1.TitleParams.SortMarkerStyle : smstSign; DBGridEh1.OptionsEh : DBGridEh1.OptionsEh [dghAutoSortMarking]; end;这段代码不讲业务核心是验证几件事控件能不能拖动到 Form 上、能否跟 TDataSource 正常关联、数据集打开后网格能否显示记录数、排序功能是否响应。如果这一步拿出来能正常出数据说明 EhLib 的运行时环境没问题后面你在老项目里接入也只是照葫芦画瓢。4. 在实际项目里接入这些操作最有实用价值4.1 用 TDBGridEh 快速实现筛选和合计EhLib 值钱的地方在于网格顶部可以加上筛选框。这个功能在很多成熟的 MIS 系统里几乎是标配客户打开单据列表希望直接在表头输入关键字模糊过滤不用专门做一列查询条件。原生 TDBGrid 实现这个效果得写一堆 OnKeyDown 事件而 TDBGridEh 只需要在OptionsEh里启用dghAutoFilterRow并把STFilter.Location设置为stflInTitleFilter或stflSmartCombo。启用之后网格的标题栏下面会出现一排空白的筛选单元格。用户在某一列输入文字、选择下拉值网格就会自动触发数据过滤。这套默认行为它内部已经做了涉及数据感知控件或数据集在过滤时的游标处理EhLib 有一套自己的逻辑。如果需要自定义过滤规则可以处理OnFilterRecord事件大部分时候还是用自带的规则就够了。合计就更好用了。直接在列属性里找到Footer设置ValueType为fvtSum、fvtCount、fvtAvg脚注区域就会自动计算合计值。以前用原生 DBGrid 算一个合计得写扫码的 OnDrawColumnCell现在相当于白送的功能。放一个表格给你参考常用配置功能需求关键属性取值说明启用筛选行OptionsEh添加dghAutoFilterRow允许列标题排序TitleParams.SortMarkerStyle设为smstSign并OptionsEh添加dghAutoSortMarking显示合计列属性 Footer.ValueType常用fvtSum、fvtCount、fvtAvg合并单元格OptionsEh启用dghCellMerge并设置列的MergeColumns相关属性行高自适应DrawMemoText给备注列设置DBGridEh1.Columns[].TextHeightStrategy这套配置我用了好几年从 Delphi 7 的项目一路迁到 Delphi 12几乎没改过业务逻辑迁移成本低得感人。4.2 下拉列表、Lookup 和下拉树另一个高频需求某列需要从字典表里选值但不想跳页去处理。原生 DBGrid 你得摆一个 DBLookupComboBox 到编辑器上逐个对齐位置做起来极烦人。TDBLookupComboboxEh 自带列下拉选择功能直接设置列的LookupParams或指定 KeyField/ListSource在网格编辑状态下点一下该列就会弹下拉同时支持模糊过滤。还有一个更进阶的玩法是用TDBCtrlGridEh或TDBTreeGridEh把树形结构和表格结合。我最近一个部门架构页面就用了树形表格展开各层部门、每个部门挂职员列表轻量搞定比 TreeView 右侧 Grid 联动要省 300 行代码。这种控件模式在老系统里改造时页面呈现形态更直观客户基本一眼懂。4.3 数据导出 Excel少走弯路业务系统永远会遇到“把网格导出成 Excel”这种基础到不能再基础的需求。EhLib 自带的导入导出机制核心在TDBGridEhExportAsText和TDBGridEhExportToTextFile。但 Excel 格式用它默认的SaveToXLS也能出文件不过生成的 xls 在老版本 Excel 里偶尔会有格式兼容的提示如果客户对文件格式挑剔建议走TDBGridEhExportAsUnicodeText配合你自己写个 CSV 再转换成真正的 xlsx。我踩过一个小坑导出带日期的列时如果没有设置DateUtils和格式化参数出来的可能是一串浮点数字。要把列属性的DisplayFormat显式设置为yyyy-mm-dd之类的格式导出时才不会乱。这个问题在 10.2.42 还是存在属于老传统了做进报表功能前先在测试数据上过一遍好过客户验收时暴雷。5. 常见问题与排查技巧实录5.1 编译报错找不到单元路径没加全最常见的报错是F2613 Unit DBGridEh not found。这个提示出现时先别急着重新解压去检查一下 Lib 路径。很多时候是只加了Source目录没有加包含.pas文件的子目录。比如最新版把DBGridEh.pas放在Source\GridsEh下面你只加Source有些 IDE 版本不会递归搜索子目录要把具体找得到的源码目录加进去。排查方法很简单进入Project Options Delphi Compiler Search path或者Tools Options IDE Library中把路径补全。检查当前 project 的Search path和后保存并重新编译。5.2 包编译报 E2202 或找不到 BPL如果打开 DPK 后提示E2202 Required package xxx not found这说明当前 DPK 依赖另一个包而这个依赖包还没编译安装。EhLib 常拆成基础包和数据访问支持包你直接 Install 最外层会缺依赖。正确做法是先把依赖的包全部打开、逐个 Compile再 Install。有的版本还需要安装 FastReport 这类第三方依赖但这种一般不会出现在 EhLib 里更多是业务项目里另外引入的控件之间打架造成的连带问题。提示如果你同时装了多个版本的 EhLib比如电脑上既有 Delphi 10.4 又有 Delphi 12要注意 BPL 文件的搜索路径。Delphi 12 的 IDE 默认在C:\Users\Public\Documents\Embarcadero\Studio\23.0\Bpl和Program Files的特定目录里找 runtime package旧版本的 BPL 如果也在这个目录可能会被错误加载导致版本混乱。这种情况优先清掉旧路径引用只保留当前版本的搜索路径。5.3 组件面板看不到 Eh 控件Install 完成但组件面板看不到多数情况是设计时包没有成功加载或者加载了但 IDE 的缓存没刷新。先看Component Install Packages窗口里是否有EhLib对应的包并处于勾选状态。如果已经勾选还是看不到尝试关掉 IDE 后删除临时目录下的*.identcache、*.dsk再重新打开。这两个文件是 IDE 的工程状态缓存偶尔装完新包后刷新不及时删除后重启一般能解决。如果使用的是 Delphi 12.0 低版本更新有的组件包需要以管理员身份运行 IDE 才能安装。这个和 UAC 权限有关并不需要每次都用管理员跑但安装新控件时建议右键 IDE 图标选择“以管理员身份运行”减少写入BPL、DCP目录被系统拦截的概率。5.4 卸载与清理不用这个控件或者要升级版本的时候建议去Component Install Packages里先Remove掉包然后关闭 IDE删除Lib目录下生成的.bpl、.dcp、.dcu等中间产物再把Source路径从 IDE 的搜索路径中移除。不要在 IDE 开着的时候直接删除文件容易造成文件占用和缓存残留。重新开启 IDE确认没有报错提示再继续操作。6. 升级与后续扩展6.1 另一个容易被忽略的到期时间Design-Time 包和源码头文件冲突项目的代码文件如果从老版本迁移过来比如之前是用EhLib 9.x的打开时会遇到DBGridEh.pas里大量找不到的属性和方法。排查演练方式先全局搜索旧的属性名看是否在新版本中改名了再对照官方Docs里的迁移说明。新版本中FOldSortMarkerStyle之类的属性可能演变成枚举类型用法稍有区别但只要编译提示指向某个单元文件定位到那行代码基本都能找到对应新 API。6.2 利用源码灵活定制EhLib 的Source目录不仅仅是用来编译的它更是定制你来开发的基础。比如你想在 Grid 的右键菜单里直接加入“合计当前列”直接修改DBGridEh.pas里的鼠标事件代码重新编译。这种修改方式不会引入新依赖包只需要确保自己分支的源码版本可追溯下次升级时把改动过的单元 diff 出来重新打补丁就行。我自己维护的那些网格组件里就加过几个自定义快捷键整体开发效率提升不少坑也没怎么踩。最后再分享一个小细节。很多朋友安装顺利后就直接扔到服务器发布结果发现程序在其他机器上运行时报Cannot load package EhLib100.bpl。原因很简单用 runtime packages 的发布模式下目标机器必须安装对应的 BPL否则就得去掉Project Options Runtime Packages里的Link with runtime packages勾选把组件静态编译进 exe。对于普通内部管理系统我建议直接静态编译少一层环境依赖虽然包体积会大几 MB但换来的是部署时少挨骂这笔账怎么算都划算。本文还有配套的精品资源点击获取