
简介Delphi数据库开发中数据表格的排序、筛选、分组、合计等功能常因重复编码而效率低下。EhLib作为成熟的第三方VCL/FMX控件集通过预编译包BPL/DCU的形式集成到IDE大幅简化了这些交互。其安装过程涉及Library Path配置与设计时包注册而版本冲突往往导致控件丢失或装载失败。无论是传统Win32项目还是FMX跨平台应用甚至手持PDA扫码结果展示EhLib都能提供开箱即用的表格方案。本文基于实际经验详解从解压、配置到验证的完整流程并梳理常见坑点帮助开发者快速上手。1. EhLib 是什么为什么老 Delphi 项目里到处是它1.1 标准 TDBGrid 的尴尬处境写过几年 Delphi 数据库应用的人大概都经历过这个场景数据集查出来了拖一个 TDBGrid 放上去数据能显示但也就到此为止了。想要点列标题排序没有想要表格底部出现合计行没有想要某列下来个筛选下拉菜单还是没有。这些功能不是做不到而是每一张表单都要重新写一遍大同小异的代码项目一多维护成本直接失控。我早年在做进销存系统的时候就深有体会。一个简单的订单列表客户要列头排序、按状态筛选、金额合计、导出 Excel这四样需求摆出来用裸 TDBGrid 实现意味着要处理标题点击事件、维护筛选条件、遍历数据集算合计、再调用导出函数。同一套逻辑复制到十来个窗口里后面需求一变改到怀疑人生。当时公司里的老前辈提了一句“用 EhLib 吧”从此这张网格控件就成了项目里的标配。1.2 EhLib 解决的是一整套商用表格需求EhLib 不是一个花架子控件它把数据库客户端开发里最琐碎、最重复的那部分交互全部做完了列标题排序、自动筛选、分组汇总、合计行、查找下拉列、多选行、剪贴板操作、数据导出、打印预览……几乎覆盖了企业内部管理系统里九成以上的表格交互场景。这也是为什么很多老项目里只要出现 DBGrid 相关的高级功能基本都能看到 EhLib 的影子。它不是单纯把网格画得更漂亮而是把“数据展示 交互 输出”这条链路整体打通了。装好之后你不需要为了一个合计行去翻代码不需要为了一个筛选下拉去折腾 PopupMenu设计期把属性一配运行期效果就出来了。1.3 标题里每一段字符都在说什么标题Delphi 13.1控件之EhLib.VclFmx.13.0.015(no source).7z拆开看其实信息量很大Delphi 13.1这是控件的目标 IDE 版本也就是 Delphi 13 这条版本线。EhLib 的版本号一直是跟着 Delphi 走的13.0.015 对应的就是给 Delphi 13 系列用的版本015 是内部构建号。VclFmx说明这套包里同时包含 VCL 和 FireMonkeyFMX两套框架的控件。VCL 是传统 Windows 原生界面框架FMX 是跨平台框架可以编译 Android、iOS、macOS、Windows 等平台。两个框架的控件不能混用但“一个包全带”对开发者来说省事不少。13.0.015EhLib 的主版本号和构建号主版本 13.0 对应 Delphi 13 这条线。no source这是最关键的信息。说明压缩包里没有 .pas 源码只有编译好的二进制包BPL、DCU、DCP 等。好处是安装路径短、不用自己编译代价是调试时进不了控件内部遇到 Bug 只能靠现象判断。7z压缩格式需要用 7-Zip 解压Windows 自带的资源管理器解不了这个格式。很多人在这一步就卡住了拿着 7z 文件双击打不开以为是文件损坏其实只是缺一个解压工具。1.4 no source 版本到底能不能装进 IDE这里要先打消一个顾虑no source 和“不能用”完全是两码事。Delphi 的第三方控件安装本质上就是把二进制包注册进 IDE让 IDE 在组件面板上显示控件、在编译时链接对应单元。源码只是给人看的编译器真正需要的是编译好的 DCU 和 BPL。所以 no source 版本完全可以正常安装、正常使用。不过要有一个心理准备不带源码的包在调试问题上更折腾。比如一个网格的某个属性在特定条件下表现怪异你只能通过隔离测试去定位没法直接翻控件的内部实现。如果你有“看控件源码学实现”的习惯或者经常需要改控件行为那 no source 版本会比较别扭。但绝大多数业务开发场景里使用层面一点问题都没有。这套控件适合谁我总结下来是三类人一是新接触 Delphi、想把表格交互做得像模像样的新手二是从旧版本 Delphi 升级上来的老开发者需要把旧项目里的 EhLib 迁移到新环境三是正在做 FMX 跨平台数据库应用、又不想从零写表格组件的团队。2. 开箱前的判断先搞清楚这套控件能不能装进你的环境2.1 解压 7z 之后的目录里会看到什么先解决最基础的问题把EhLib.VclFmx.13.0.015(no source).7z解压出来。我建议用 7-Zip免费、开源、全格式通吃。解压到一个干净目录比如D:\Components\EhLib这里有两个原则需要注意。第一路径不要带中文和空格。虽然现在的 Delphi 对中文路径的容忍度比早年好不少但第三方控件的包配置文件里往往硬编码了路径习惯遇到中文目录容易出幺蛾子。第二不要解压到C:\Program Files这类权限敏感目录。Delphi IDE 如果以管理员权限运行还问题不大但如果你偶尔以普通用户打开 IDE控件找目录会报权限错误。放在 D 盘这种自己控制的根目录下省心很多。解压后你会看到若干子目录通常会有 VCL 和 FMX 两个核心目录各自存放对应该框架的包文件还可能包含 Resources、Docs 等辅助目录。如果你打开某个.pas文件但标题里明明写了 no source别惊讶——有些目录里可能带少量示例 Demo 的 pas 文件这跟控件本身没源码是两回事示例源码和控件源码不是同一个概念。2.2 Delphi 13.1 版本和平台如何确认安装前花两分钟确认环境能避免后面大半的问题。打开 Delphi IDE菜单 Help About 里能看到 IDE 版本号。标题说的是 Delphi 13.1那么你的 IDE 应该就是这条版本线太老的 Delphi 10.x、11、12 都用不了这套 13.0.015 的包包内部会声明依赖的 RTL 版本版本对不上安装时直接报错。另一个要确认的是目标平台。如果你只做 Win32 的 VCL 应用安装时只需要加载 VCL 包如果要做 FMX 跨平台才需要加载 FMX 包。有些开发者贪方便把两套包全装了一遍结果打开做 VCL 项目时在 FMX 页面找控件找不到反过来也找不到。这不是控件坏了是你找错页面了。VCL 和 FMX 控件在设计期分别占用不同的组件面板分类。2.3 no source 包的两种安装路径no source 包在安装逻辑上有个特点你不需要去编译任何 dpk 工程因为没有源码就不能编译出新的 BPL你实际要做的只是“把编译好的包加载进 IDE”。这对应两种操作方式第一种用 IDE 的Component Install Packages菜单点击 Add 按钮直接选中解压目录里的设计时 BPL 文件。IDE 会加载这个包里面注册的控件会自动出现在对应分类中。这种方式最直接也是 no source 包最推荐的安装方式。第二种如果压缩包里带.dpk包工程描述文件注意dpk 只是包工程描述不是 .pas 源码你也可以用 File Open 打开 .dpk然后右键 Build、Install。这种方式对预编译好的包也能用IDE 会读取已有的 DCU 和 BPL不会重新编译源码。两种方式选哪一种取决于解压包里到底给了哪些文件。我的建议是优先看有没有现成的 BPL有就直接 Install Packages如果包里文件组织得很工程化、有完整 dpk 结构再考虑第二种。2.4 安装前必须配好的 Library Path这一步是新手最容易漏掉的。很多人装上包、控件面板也出现了但新建项目往窗体上一拖控件编译时直接报“找不到 TDBGridEh”或者“File not found: Ehlib.dcu”。原因很简单控件面板出现靠的是 BPL 注册编译链接靠的是 DCU 搜索路径这是两回事。BPL 负责让 IDE 在设计期认识控件DCU 负责让编译器在编译期找到单元实现。你必须把解压目录中 DCU 所在路径加入到Tools Options Library Library path里。而且要注意平台Win32 和 Win64 是两套不同的 DCUDelphi 的 Library path 配置可以按平台分别添加。后面我会把具体操作写清楚。3. 完整安装流程从解压到控件面板出现我踩过的坑全在这3.1 安装步骤全景概览把上面说的事汇成一个清单整个安装流程是固定的照着做基本不会出问题用 7-Zip 解压EhLib.VclFmx.13.0.015(no source).7z到D:\Components\EhLib。打开 Delphi 13.1 IDE进入Tools Options Library为当前平台添加 DCU 路径。用Component Install Packages Add选择解压目录里的 VCL 设计时 BPL。如果做 FMX 开发重复第 3 步选择 FMX 对应的设计时 BPL。关闭 IDE重新打开这一步不是必须但能保证 IDE 的组件面板重新刷新。新建一个 VCL 项目在 Tool Palette 里搜索“Eh”或“DBGridEh”确认控件已经出现。拖一个 TDBGridEh 到窗体上完成编译验证。这个流程看起来简单但我在实际装过几十台机器之后发现几乎每一步都有对应的坑。下面把关键步骤展开细说。3.2 添加 Library Path 时最容易犯的错误打开Tools Options Library后你会看到平台选择下拉框。这里先选择当前 IDE 默认平台通常是 Win32然后点右侧的编辑按钮把解压目录下的 DCU 路径添加进去。需要注意VC L 和 FMX 的 DCU 目录通常不同要分别添加。如果要做 Win64 编译把平台切到 Win64再添加 Win64 对应的 DCU 路径。不要把整个 EhLib 大目录直接塞进去最好指向包含 DCU 的那个具体子目录。目录太大会让 IDE 的编译搜索变慢虽然现在的电脑跑得动但没必要。有一个小技巧在路径里可以用$(Platform)宏变量让 IDE 根据当前编译平台自动切换目录。但这个宏能不能生效取决于解压包是否按Win32、Win64这种命名的子目录组织 DCU。保守的做法是人工为每个平台各加一次路径一劳永逸。3.3 通过 Install Packages 注册设计时包Library Path 配好后进入Component Install Packages。这个界面管理的是当前 IDE 已经注册的运行时包和设计时包。点 Add然后在文件选择框里定位到刚才解压的目录。关键点来了Add 时要选“设计时包”而不是运行时包。一个 BPL 可以同时承担两种角色但大多数第三方控件会拆成运行时包和设计时包两个文件设计时包依赖运行时包。选错了文件IDE 可能提示“Cannot load package”或者加载后看不到控件。通常设计时包的文件名里会带Design、Dsgn、D之类标识比如EhLibDesign.bpl这种。如果你拿不准哪个是设计时包可以逐个试提示依赖缺失就说明选的是运行时包。加载完成后该 BPL 会出现在 Install Packages 的列表中前边的复选框一定要勾上。如果加载时报“Cannot load package ... It contains unit ... which is also contained in package ...”说明这个包里的某个单元和你系统里已有控件的单元重名了绝大多数情况是旧版 EhLib 残留导致的按第 5 章的方法清理干净再装。3.4 VCL 和 FMX 的包怎么区分安装VCL 和 FMX 是两套完全不同的界面框架对应两套独立的控件单元。EhLib 的压缩包里通常会把两个框架的目录分开VCL 控件装在 VCL 项目里用FMX 控件装在 FMX 项目里用两者互不干扰。安装 FMX 包时我建议先建一个 FMX 项目再安装或者至少在 FMX 项目环境里验证。原因是 FMX 控件在设计期只挂在 FMX 页面上如果你当前打开的是 VCL 项目组件面板里 FMX 分类会被隐藏看到的结果就是“装了像没装”。很多人装完 FMX 包后找不到控件其实只是 IDE 根据当前项目的类型自动过滤了组件面板。FMX 版 EhLib 在跨平台数据库应用里很有价值尤其是做 PDA、手持终端这类场景。热门词里出现的“delphi firemonkey pda 编程实现扫码结果接收”就是说在 Android 或 Windows 手持设备上用 FMX 做出扫码接收界面再用 DBGridEh 把结果列表展示出来。对比直接用 TListView 画数据DBGridEh 的列对齐、标题栏、行选中状态、横向滚动这些都是现成的开发效率高一个量级。3.5 验证安装是否成功的三个层次很多开发者验证安装的方式就是“组件面板能看到控件”这远远不够。我一般分三层验证。第一层组件面板里搜索“DBGridEh”确认能找到 TDBGridEh以及 TDBLookupComboboxEh、TDBEditEh 等几个常用控件。第二层拖一个 TDBGridEh 到窗体上连接一个 TDataSource 和一个 TClientDataSet设计期就能把数据显示出来说明设计时包和运行时包都正常。第三层把目标平台从 Win32 切到 Win64重新编译一次。这一步能检查 Win64 的 DCU 路径有没有配好不然项目后期切 64 位时才报错那时排查成本高得多。这三个层次都过了这套控件才算真正装好了。4. 装完先试这几个实战功能再决定值不值得留4.1 第一步用 TDBGridEh 替换旧 DBGrid安装完第一个动作我建议把现有窗体上的 TDBGrid 直接换成 TDBGridEh。数据连接方式完全一样也是设置 DataSource 属性指向 TDataSource。替换后界面顿时不一样——列标题带立体感、支持拖拽调整列宽、自动填充整行背景色这些基础体验都比原版 DBGrid 好一截。之后可以在Columns编辑器里对每一列做细粒度配置。比如把某列的Title.Caption改成中文把金额列的对齐方式设成taRightJustify把某列设为只读。这里建议把经常要配置的列属性写进窗体的 OnCreate 事件里而不是每个属性在设计期点一遍。项目多了以后代码里能快速 diff比翻 .dfm 文件直观。4.2 列标题排序、筛选和分组三件套一次搞定这是 EhLib 最核心的价值所在三个功能分别在三个属性上排序在 TDBGridEh 的OptionsEh属性里打开dghAutoSortMarking这样列标题点击后会出现排序箭头标记。但注意EhLib 只是让网格看起来在排序真正执行排序的是数据集。如果数据集是 TClientDataSet需要在 OnTitleClick 里设置索引procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh); begin ClientDataSet1.IndexFieldNames : Column.FieldName; end;如果数据集是 SQL 查询结果比如 TFDQuery就不能靠 IndexFieldNames 了需要重新执行带 ORDER BY 的 SQL再 ReOpen 数据集。筛选把STFilter.Visible设为 True每一列标题旁边会出现一个漏斗按钮点开后按值筛选、按条件筛选、自定义筛选还能把多个列的筛选条件组合成一条过滤条件。这个过程不需要写任何代码EhLib 自动转换成数据集的 Filter。不过要注意数据集的Filtered属性如果被手动改成 FalseEhLib 的筛选也会失效小心别踩了这个合并逻辑的坑。分组把GroupPanelVisible设为 True网格顶部会出现一条分组面板运行时把列标题拖上去数据就会按该字段分组显示。同时还可以配FooterRowCount让每一组下面显示一个统计小计行。分组功能对数据集的排序要求比较高如果数据集没有按分组字段排序分组结果会显得混乱。4.3 合计行、查找下拉、多选行三个实用细节这几件事在实际项目里出现频率极高。合计行设置FooterRowCount : 1然后在某列属性里设置Footer.ValueType : fvtSum该列底部就会出现自动求和的值。除了求和还有fvtCount计数、fvtMax、fvtMin等类型。如果想自己控制显示内容可以写Footer.Value指定固定文本。这里要注意合计计算的是一次性读取的数据集如果数据量大、分页加载合计的是当前数据集内容而不是全表数据逻辑上要跟业务对齐。查找下拉列很多业务表存的是 ID界面上要显示名称。EhLib 的 TDBLookupComboboxEh 就是干这个的。把它放到列编辑器里绑定 KeyFieldID 字段、ListSource字典数据源、ListField名称字段运行期点开就是下拉选择不需要手工写弹窗。如果你的数据表有十几个外键字段这个控件能节省大量时间。多选行设置 Options 里包含dgMultiSelect用户按住 Ctrl 或 Shift 就能多选行。读取选中行用SelectedRows属性遍历时取出书签再定位到数据集var i: Integer; begin for i : 0 to DBGridEh1.SelectedRows.Count - 1 do begin ClientDataSet1.Bookmark : DBGridEh1.SelectedRows[i]; // 处理当前选中的行 end; end;这里有个容易搞混的细节SelectedRows返回的是 TBookmarkList里面存的是数据集的记录书签TBookmark不是 Grid 的行号。直接把行号拿来当索引用编译能过运行期必崩。4.4 导出 Excel 和打印预览别自己造轮子内部管理系统几乎没有不需要导出 Excel 的。EhLib 自带导出能力设计期把导出相关按钮接到网格上运行期点一下就能把网格数据保存为 Excel、CSV、文本等格式。你不需要调用 Excel COM 对象也不需要考虑 Excel 版本兼容性EhLib 自己处理。实际导出时会发现列的标题、宽度、合计行都会一并导进去导出效果和界面上看到的几乎一致这一点比很多通用导出组件强太多。打印方面直接放一个 TPrintDBGridEh 组件绑定 DBGridEh 后即可打印预览。列宽、页边距、标题、页脚这些参数都可以在设计期设置。老项目里常用的“客户要一张和屏幕上一样的单据打印出来”的需求这个组件几分钟就能实现。4.5 数据量大的时候感受一下滚动性能装好之后还有一个很重要的测试把一张十万行左右的数据集连上去用鼠标滚轮滚动网格观察刷新和滚动是否有明显卡顿。EhLib 在数据量大的情况下表现比裸 DBGrid 好不少因为它对可见行渲染做了优化。但如果你把 STFilter、分组、合计、列排序全打开运算量上去了滚动还是会略微变慢。这种情况建议在Options里把dgRowSelect之类的无关选项关掉或者改用虚拟游标模式把大数据集分批读取。反正装都装了至少要知道性能底线在哪里后面项目设计才有底气。5. 那些年掉过的坑控件丢失、装载失败、版本冲突排查实录5.1 每次打开 IDE 都丢控件根本原因是什么有人搜索过“delphi 控件版本问题导致每次进入 ide 都丢失控件需要重新放置保存后还是那样”。这个现象在装了 EhLib 老版本又升级新版本时非常典型。表面现象是你放了一个 TDBGridEh 在窗体上保存、关闭 IDE再打开窗体上那个控件显示成了一个灰色方块或者直接报“Class TDBGridEh not found”。查了半天控件的 BPL 也装了组件面板也有为什么就是识别不了根因通常是IDE 启动时加载的设计时包不是你以为的那个版本。Delphi 在启动时会按注册表记录的包列表加载 BPL如果你系统里保留着旧版 EhLib 的路径IDE 会优先按旧路径加载旧包。而项目文件里记录的新控件类型名是安装新包时注册的两者的 ClassName 或单元名对不上于是 IDE 只能报“类不存在”。排查顺序是这样的打开Component Install Packages检查列表里是否有多个 EhLib 相关的 BPL有的话把旧的全取消勾选并移除。查看Tools Options Library的 Library Path看有没有旧版本的 DCU 路径在前面。Delphi 的编译器按路径顺序搜索如果旧目录排在前面新项目也会引用旧 DCU。重启 IDE验证窗体是否还报错。如果还报打开注册表编辑器搜索旧版本号相关的包配置手动删除残留键值。这个问题的核心就是“旧包没清干净”和“新包路径优先级不够”两个原因。处理手段要么移除旧包要么调整路径顺序把新包目录放到前面。5.2 组件面板找不到 EhLib 页面的排查装完控件重启 IDE结果 Tool Palette 里搜“Eh”搜不到这种现象也不少。不要急着重装按这几点查检查 IDE 当前打开的项目类型。VCL 项目里不显示 FMX 控件FMX 项目里也不显示 VCL 控件这是设计如此。检查 Tool Palette 搜索框是否启用了过滤。有时候之前搜过别的关键词过滤没清掉页面全被藏起来了。右键 Tool Palette 空白区域选择“Reset Palette”让面板恢复默认布局。Install Packages 列表里确认对应包已经勾选。如果 BPL 被加载但没有注册任何控件通常是设计时包选错了或者这个 BPL 只是运行时包。还有一个隐蔽的情况有些传播的 no source 包把 VCL 和 FMX 的文件放在同一个目录安装时你手动选了一个 BPL但 IDE 自动关联了同目录下另一个版本依赖导致控件虽然注册了但归属分类在某个不显眼的组里。这时候直接搜“DBGridEh”比翻分类更快。5.3 编译 Win64 目标时提示找不到 DCUDelphi 13.1 的项目默认是 Win32 目标很多人在第一时间没有切到 Win64 验证等到项目上线前切架构时一编译全是“File not found: Ehlib.dcu”。原因在前面提过Library Path 是分平台配置的。Win32 的路径能查到 DCU不代表 Win64 能查到。处理方式打开Tools Options Library平台下拉框切到 Win64然后把 Win64 的 DCU 目录加进去。如果解压包里的 Win64 目录确实存在这一步之后编译就通了。如果解压包里压根没有 Win64 目录说明这个 no source 版本并不完整或者只给了一种平台预编译文件。这时候只能找完整版本。顺便提一句FMX 跨平台编译时Android 和 iOS 平台也需要对应的 DCU。如果版本包不支持你要的目标平台编译会直接报错。提前判断比编译时报错再排查省事得多。5.4 其他控件装载失败问题的一般排查思路说到“装载失败”我在实际项目里还见过不少类似的报错比如浏览器安全设置里 ActiveX 无法加载、某个旧式控件组件创建失败等等。这类问题的排查思路其实是通用的先看进程位数。64 位程序加载 32 位控件通常直接失败这是最常见的坑。再看权限。很多控件在安装时需要往注册表写入内容没有管理员权限就会悄悄失败。右键“以管理员身份运行”重装一次往往就解决了。最后看注册表。控件安装完成后应该在注册表里注册对应的类标识如果找不到说明安装过程不完整。虽然这些场景和 EhLib 没有直接关系但如果你是公司的“Delphi 专家”这类问题迟早会找上你。掌握一套通用的排查思路比每个控件单独研究要高效得多。5.5 卸载与清理装不上很多时候是旧的没弄干净最后讲一个我的独家心得控件装不上的时候先怀疑旧版本残留不要怀疑新包损坏。如果你想彻底卸载 EhLib至少要做三步打开Component Install Packages把勾选去掉并移除 BPL。打开Tools Options Library删除所有与 EhLib 相关的路径。删除打开的旧项目里对旧包的引用。有些项目文件在 Requires 列表里硬编码了旧包名不清理的话一打开项目 IDE 就会尝试加载旧包然后报错。如果做完三步还有问题那就要去注册表里清理残留的包配置了。搜索关键词用“EhLib”就行找到相关键值后备份再删除。这一步要有耐心别删错别的控件配置。我个人这几年用下来最大的体会是EhLib 这类控件真正值钱的地方不在于某一个功能多惊艳而在于它把数据库开发里最重复、最琐碎的交互一次性打包解决了。如果你还在用裸 DBGrid 硬撑业务需求花一个下午把这篇流程走一遍换上去试两个界面对比会非常直观。最后再补一个小建议装好之后不要急着把全部功能用上先选排序、筛选、合计这三样用到真实项目里跑顺了再逐步加分组、查找下拉和导出这样排查问题的时间会少很多。本文还有配套的精品资源点击获取