
简介这是一套 Delphi 13.1 环境下的 EhLib VCL/FMX 控件库安装包不含源代码主要为正在使用 RAD Studio 编写数据表格、数据感知界面及复杂数据交互的 Delphi 开发者准备EhLib 系列以数据处理和界面增强见长13.0.015 版本同时支持 VCL 与 FMX 框架并整合数据驱动、数据服务模块及 RAD 专属适配能显著减少数据层和界面层的重复编码。压缩包内共 2000 个文件其中约 1915 个 hpp 头文件是组件声明与集成的主要载体另附有 doc/docx 说明文档、MD 笔记、SQL 数据库脚本、txt 文本及少量 CSS 样式整体约 349.63MB安装目录提供安装程序示例目录提供可运行的工程帮助文件支持按属性、方法、事件检索组件细节更新说明用俄文和英文记录各版本改动样式目录用于统一界面风格。开发者可借助示例理解常见绑定、排序、分组和编辑操作也可以参考数据驱动相关组件组合来处理数据库访问资源包目录结构清晰便于按模块定位文档、示例或驱动。目前已有 66 人学习适合有一定 VCL 或 FMX 基础、希望借助成熟控件体系提升数据界面开发效率的程序员。1. 拿到 EhLib.VclFmx.13.0.015(no source).7z 之后这个 Delphi 13.1 控件包到底是干什么的刚把 Delphi 升到 13.1 的开发者很容易盯上EhLib.VclFmx.13.0.015(no source).7z这个压缩包。它是和新版 Delphi 配套的增强网格控件库核心组件是 DBGridEh比原生 DBGrid 多出多表头、下拉过滤、树形展示、内存表、导出 Excel 这些表格界面里高频要用到的能力。标题里 VclFmx 表示它同时覆盖 VCL 和 FMX 两套框架no source 表示只有编译好的 bpl/dcu没有源码。这两个词直接决定你后续怎么安装、能不能调试控件内部、发布时要带哪些文件。如果你手头有订单、报表、后台管理这类数据库项目被原生表格的交互和导出逼得自己写了不少重复代码这个包基本能把你从填表地狱里捞出来。下面按读包、装包、用起来、排坑、收尾验证的顺序展开适合正在做实际项目的业务开发者也适合刚学 Delphi、想一开始就选对控件方向的新手。2. 先读懂压缩包VclFmx、13.0.015、no source 三个词决定你怎么装2.1 VclFmxVCL 与 FMX 两套实现先确认你的工程是哪一种VCL 是 Delphi 从诞生起就在用的 Windows 原生控件体系绘制走 WinAPI做 Windows 桌面管理界面最稳FMX 是新一点的跨平台框架同一套代码能编译到 Windows、macOS、iOS、Android。EhLib 的 VclFmx 合包会在压缩包内部按这两套框架分别组织目录或包文件安装时只看你的工程框架是哪一种VCL 工程装 VCL 分支FMX 工程装 FMX 分支。混着用会在编译阶段立刻报 dcu 找不到而不是在安装阶段拦下来新手特别容易在这里栽跟头。判断方法很简单打开工程主文件uses 子句里写着Vcl.Forms的就是 VCL 工程写着FMX.Forms的就是 FMX 工程。如果你做的是 Windows 上的管理系统选 VCL 分支就够了如果后面可能要出 Android 或 macOS 版本再去看 FMX 分支。FMX 版的 DBGridEh 在触屏上的编辑体验和桌面 VCL 版有差距尤其是单元格进入编辑态、弹虚拟键盘这些交互移动端项目里往往要少放列、加大行高不能直接把桌面那套界面搬过去。2.2 13.0.015主版本号与补丁号直接对应 Delphi 版本EhLib 的版本号编排一般跟着 Delphi 大版本走主版本 13 对应 Delphi 130.015 是 13 系列里的补丁级版本通常会修正排序、过滤、导出这些模块的边界问题。搜索delphi 13.1下载时很容易搜到一堆版本接近的包安装时最怕的不是版本差太远而是差一点把 13 早期补丁版装进 13.1IDE 可能能正常启动编译到一半报一串类型不兼容。常见做法是解压后先看包内目录有没有按 IDE 版本命名的子目录类似 D12、D13 这种选和你 IDE 完全一致的那一套。我在项目里一般会额外记一行“Delphi 13.1 对应压缩包里的哪个目录”因为自动检测不一定可靠IDE 选项里的版本号显示也可能和实际编译器版本对不上。拿不准时用包内自带的 Readme 或 Demo 工程编译一次能通过的就是正确版本。这里也要提醒一句社区版和商业版的 Tools 菜单位置略有差异但 Library Path 的配置逻辑一样不用因为版本不同而放弃这个控件方向。2.3 no source编译发布没问题调试和改控件要付出额外成本no source 版里没有 .pas 文件只有编译好的 dcu、dcp、bpl、res。它和 with source 版的差别不是能不能用而是能不能查、能不能改。对大多数业务项目来说no source 完全够用你在编辑器里按住 Ctrl 点 DBGridEh 的属性跳转到的还是 IDE 从 dcu 里解析出的类声明只是进不了函数实现。遇到控件行为异常你只能靠包内 Demo 和文档推测原因等于把一个黑匣子放进了项目。能力no source 版with source 版编译业务工程可以可以按住 Ctrl 点进方法实现基本不行可以单步跟踪控件内部代码不行断点灰色可以修改控件行为不行可以发布给客户可以可以结论做业务项目选 no source 足够如果预期要长期在一个产品上迭代或者以后要定制网格行为直接换带源码的版本更省事。另外EhLib 这类商业控件库即使拿到的是 no source 二进制包商用前也要确认授权边界别因为包里没源码就默认它可以随意分发。换版本最麻烦的还不是买授权而是项目里已经有一堆 DFM 引用了旧包升级 Delphi 大版本时 DFM 里的类名没变但包路径要重配这是很多团队升级时翻车的重灾区。3. 安装到 Delphi 13.1解压 7z、注册设计时包、配 Library Path 三步走3.1 先解压到固定目录路径不要带空格和中文第三方 Delphi 控件安装的第一步永远是解压到一个绝对路径固定下来不要放在下载目录里随手用。推荐用 7-Zip 命令行解压时把路径写死# 用 7-Zip 解压-o 指定输出目录注意开关和目录之间没有空格 7z x EhLib.VclFmx.13.0.015(no source).7z -oD:\Components\EhLib # 解压后看一眼目录结构确认 VCL 与 FMX 两个分支都在 dir D:\Components\EhLib双引号是为了包住文件名里的括号防止命令行把括号当特殊字符处理。-o后面直接跟目录中间不要加空格。路径选D:\Components\EhLib这类纯英文、无空格的目录是为了避开 Delphi Library Path 对特殊字符的处理问题如果你把包解压到C:\Users\张三\下载\新建文件夹后面配置路径和写自动化脚本时很容易被空格切断参数这种问题排查起来非常浪费时间。3.2 找出设计时包dcl 开头的 bpl 才是用来注册的解压后先不要急着双击任何 bpl。压缩包里通常有两类包运行时包负责在程序运行期提供实现设计时包负责把组件注册进 IDE 的工具面板。设计时包的名字一般带 dcl 前缀运行时包不带。用 PowerShell 先把它们区分开# 列出所有 dcl 开头的 BPL这些才是要注册进 IDE 的设计时包 Get-ChildItem -Path D:\Components\EhLib -Recurse -Include *.bpl | Where-Object { $_.Name -like dcl* } | Select-Object FullName | Format-Table -AutoSize-Include *.bpl只收 BPL 文件-like dcl*过滤出设计时包。注册设计时包是安装第三方 Delphi 控件最核心的操作只装运行时包的话项目能编译但工具面板里永远找不到组件。如果包内带了 .groupproj 项目组文件那更省事直接打开项目组在 Project Manager 里找到 dcl 开头的那一项右键选择 Install 即可。没有 groupproj 时用 IDE 菜单 Component Install Packages Add手动选中 dcl 包。3.3 Library Path 与 BPL 目录编译期和运行期各配各的即使设计时包注册成功能从工具面板拖出 DBGridEh编译时仍然需要找到它的 dcu 文件。这一步在 IDE 菜单 Tools Options Environment Options Delphi Options Library 里完成主要是三个动作给 Win32 和 Win64 两个平台分别配置 Library Path指向解压目录里对应的 dcu 子目录在 Library 页的 Browsing Path 里加上同一目录这样代码编辑器里能跳转到类声明如果加载设计时包时报找不到模块把 bpl 所在目录加进系统 PATH或者直接复制到 IDE 默认的 Bpl 目录。这里有一个很多人不知道的细节Library Path 里的路径是有顺序的越靠前优先级越高。如果同一台机器装过旧版 EhLib旧路径又排在前面新工程编译时会命中旧 dcu报出的错误五花八门最常见的是大串类型不兼容。配置完成后建议把 IDE 完全重启一次确保工具面板和编译路径都重新扫描。3.4 装完先验证放一个 DBGridEh能出数据就算成功新建一个 VCL 工程在窗体上放 DBGridEh、DataSource、ClientDataSet 三个组件在 OnCreate 里写最小验证代码// 最小验证把两条内存记录显示在 DBGridEh 上 // 能显示说明设计时包、Library Path、数据连接三个环节都没问题 ClientDataSet1.FieldDefs.Add(Name, ftString, 20); ClientDataSet1.FieldDefs.Add(Qty, ftInteger); ClientDataSet1.CreateDataSet; ClientDataSet1.AppendRecord([主板, 3]); ClientDataSet1.AppendRecord([内存, 8]); DBGridEh1.DataSource : DataSource1; DataSource1.DataSet : ClientDataSet1;先给 ClientDataSet 建字段并创建数据集AppendRecord 塞两条数据然后把 DBGridEh 的 DataSource 属性指向 DataSource1再把 DataSource1 的 DataSet 指向 ClientDataSet1这就是 Delphi 里“网格-数据源-数据集”的铁三角。ftString和ftInteger是字段类型常量AppendRecord按字段顺序传值。如果你用的是 FDQuery把最后两行改成DataSource1.DataSet : FDQuery1; FDQuery1.Open(select * from orders);就行。F9 运行后网格里有数据说明安装已经全通了。4. DBGridEh 的三个高频用法多表头、过滤排序、导出 Excel直接抄4.1 多表头dghMultiTitleEh 是总开关竖线分两行做订单、报表类界面时最常见的需求是第一行放分组名、第二行放具体列名。原生 DBGrid 做这个得重绘标题在 DBGridEh 里是内置能力// dghMultiTitleEh 打开多表头Title.Caption 里的 | 自动变成换行 DBGridEh1.OptionsEh : DBGridEh1.OptionsEh [dghMultiTitleEh]; DBGridEh1.Columns.Add.FieldName : OrderNo; DBGridEh1.Columns[0].Title.Caption : 订单信息|订单号; DBGridEh1.Columns[0].Width : 140;OptionsEh是集合属性 [dghMultiTitleEh]表示在不改动其他选项的前提下追加一个开关这是 Delphi 集合属性最常见的赋值方式。Title.Caption里的竖线在开启多表头后会被拆成两行标题左边写第一行右边写第二行。如果某列不想分两行不写竖线即可。列索引Columns[0]只在这个示例里够用实际项目建议用列名而不是索引因为列的新增和删除会让索引漂移。多表头还有一个隐藏能力两列的第一行标题文字相同DBGridEh 会自动把这两列合并成一组比如第一列写订单|订单号、第二列写订单|客户名第一行就会合并成横跨两列的“订单”分组这就是报表里常见的一级表头分组效果。4.2 下拉过滤与本地排序SortLocal 与三个选项DBGridEh 的 DropDownFilter 会在列标题上生成一个下拉框列出当前列的去重值选中即过滤。配合 SortLocal 可以在内存里直接排序不重新查询数据库// 本地排序 标题排序三角 列过滤下拉 DBGridEh1.SortLocal : True; DBGridEh1.OptionsEh : DBGridEh1.OptionsEh [dghAutoSortMarking, dghFilterButtons]; DBGridEh1.Columns[0].DropDownFilter : True; DBGridEh1.Columns[1].DropDownFilter : True;SortLocal让排序在客户端进行要求数据集是已经打开、可以本地浏览的数据ClientDataSet 和已完成查询的 FDQuery 都没问题。dghAutoSortMarking在点击列标题时排序并在标题上显示升降箭头dghFilterButtons是列过滤功能的总入口不加它DropDownFilter不会在页面上出现按钮。DropDownFilter是按列开启的只给关键列开可以降低绘制成本如果数据源是几十万行以上的大数据集下拉去重值会在第一次点击时明显卡顿这种情况更建议用服务端过滤而不是本地过滤。排序、过滤、多表头三个功能互不依赖可以任意组合这也是 DBGridEh 比原生网格强的地方。4.3 导出到 Excel用内置导出不写 Excel 操作代码原生 DBGrid 导出 Excel 的常规做法是遍历单元格拼 xlsx列一多性能就崩。DBGridEh 内置了导出框架最常见的用法是uses DBGridEhImpExp; // 导出当前网格内容过滤后的行和当前可见列都会被写入 procedure ExportEhGridToExcel(Grid: TDBGridEh; const FileName: string); begin Grid.ExportTitle : True; // 把列标题写进表头 Grid.SaveToExcelFile(FileName); // 保存为 xlsx 文件 end;DBGridEhImpExp是 EhLib 的导入导出单元SaveToExcelFile是常见的导出入口。导出内容是“当前网格里所见”已经过滤的数据行、当前可见的列、现在的排列顺序和屏幕上保持一致这也是大家说的所见即所得导出。ExportTitle控制是否导出标题行默认是 False如果开了多表头再导出生成的 Excel 表头也会是两行。如果 IDE 提示当前版本没有SaveToExcelFile方法不用慌网格右键菜单里自带 Export 子菜单选 Excel 格式效果一样。导出这一项直接接上了delphi excel 操作这个高频需求比单独接第三方 Excel 组件少写大量代码而且不会引入新的依赖。4.4 内存表 MemTableEh把查询结果拉到本地再操作最后补一个实际项目里高频的组合把数据库查询结果全部拉到 MemTableEh之后的所有排序、过滤、汇总都在本地完成数据库连接可以提前释放// 查询结果复制到内存表断开数据库后再操作 MemTableEh1.Close; MemTableEh1.LoadFromDataSet(FDQuery1, 0, lmCopy); MemTableEh1.Open; DBGridEh1.DataSource.DataSet : MemTableEh1;LoadFromDataSet把传入数据集的结构和数据一起复制进内存表第二个参数 0 表示不限制记录数lmCopy是加载模式表示复制结构加数据。复制完成后DBGridEh1.DataSource.DataSet指向 MemTableEh1之后用户在网格上做的排序和过滤都不会回到数据库执行。如果原查询只有几千行这个方案体验很好几十万行的数据首次复制会有肉眼可见的耗时建议只在明细查询这类需要反复切换排序方向的场景使用。另外要注意MemTableEh 操作的是内存副本对副本的修改不会自动写回数据库需要写回时得自己实现更新逻辑别把它当成普通 ClientDataSet 用。5. 装第三方控件的 5 个坑从 dcu not found 到 Cant load package安装 EhLib 这类带多个 bpl/dcu 的控件包最容易出问题的时期不是编译而是安装和第一次构建。第三方控件的安装错误往往表现得像玄学其实按顺序排查通常就三条线包有没有被 IDE 正确加载、Library Path 有没有指到对的目录、版本和平台有没有匹配。下面 5 条按出现频率排每条按现象、原因、解决三步写照着查能省半天。5.1 组件面板里搜不到 DBGridEh现象完成安装后在 Tool Palette 搜索框输入 Eh什么也没搜到。原因最常见的是注册错了包把运行时包当成设计时包安装了。运行时包只提供函数实现不负责向 IDE 注册组件另一个常见原因是当前打开的是 FMX 工程而装的是 VCL 分支或者反过来。解决打开 Component Install Packages确认列表里有 dcl 开头的 EhLib 设计时包没有就点 Add 手动选中。如果包在列表里但工具面板不显示把勾选取消再勾选一次强制 IDE 重新扫描组件必要时重启 IDE。5.2 编译报 File not found: DBGridEh.dcu现象网格能从工具面板拖出来一按 F9 编译报F1026 File not found: DBGridEh.dcu。原因Library Path 里没加 dcu 所在目录。很多教程只讲怎么装 bpl没讲编译期还需要 dcu 路径这是安装第三方 Delphi 控件最典型的漏配。解决Tools Options Delphi Options Library 里给当前工程的平台添加解压目录里的 dcu 路径。注意工程是 Win32 就配 Win32工程是 Win64 就配 Win64。如果路径里能看到 dcu 文件但仍报错多半是 dcu 版本和 IDE 不匹配去解压目录里找与 Delphi 13.1 对应的子目录别拿旧版本目录硬配。5.3 加载 bpl 时报 Cant load package现象注册设计时包时弹出Cant load package ...后面还可能跟一句“找不到指定的模块”。原因bpl 在 Windows 下加载依赖搜索路径。dcl 包依赖运行时包运行时包之间还有互相依赖关系其中任何一个 bpl 不在 IDE 搜索路径、系统 PATH 或当前目录里整条依赖链就断掉。解决把解压目录里所有 bpl 所在目录同时加进 Library Path 和系统 PATH更省事的方法是把全部 bpl 复制到 IDE 默认的 Bpl 目录也就是 IDE 自己存放编译产物的那个目录。这条对 no source 版特别重要因为没有源码没法重新编译来重建依赖文件缺失只能重新解压。5.4 升级后旧版 dcu 串路径项目报类型版本不匹配现象项目从 Delphi 12 迁移到 13.1编译报 Unit DBGridEh was compiled with a different version of System.Classes 或一串类型不兼容。原因这台机器之前装过旧版 EhLibTools Options 里旧版本的 dcu 路径排在前面。IDE 的 Library Path 按顺序查找先命中旧文件新旧文件混在一个工程里编译冲突就爆了。解决在 Library Path 里删掉所有旧版本条目只保留 13.0.015 的目录然后对工程执行 Project Clean再重新 Build。建议每个 Delphi 大版本单独建一个控件目录目录名直接带版本号比如D:\Components\EhLib_D13这样升级或重装时一眼看出哪个该删。配置时多花一分钟换版本时省一小时这个习惯算是后悔药。5.5 no source 版调试受限断点灰色进不了实现现象按住 Ctrl 点方法名只能跳到接口声明在调用处设断点也是灰色的根本进不去。原因no source 包里没有 .pas 文件dcu 里没有源码映射信息调试器无法把机器码对应回源码行。解决行为问题优先查包内 Demo 和帮助文档如果确实要单步跟踪控件内部或者要改控件行为只能换成 with source 版本。这不是缺陷是 no source 版的设计边界选择它之前就要清楚这个代价。如果上面 5 条都没覆盖到还有一个通用招删掉工程目录下所有 dcu 和 identcache 缓存文件关闭 IDE 后删除 *.dsk 文件再重开。第三方包经常和 IDE 的增量编译缓存互相干扰清缓存是最保险的一道补救。6. 装完顺手做两件事5 分钟验证安装把 runtime package 部署出去6.1 5 分钟验证建一个 64 位 VCL 工程过一遍核心功能安装完成不要直接开写业务代码。我一般新建一个 VCL 工程放一个 DBGridEh 接上 ClientDataSet手工过一遍四个动作确认整个链路是通的验证动作操作预期结果多表头在列标题 Caption 里写带竖线的两行标题表头拆成两行且分组正常本地排序点击列标题标题出现排序三角行序变化下拉过滤点列标题右侧的过滤按钮下拉列表出现该列的去重值导出 Excel网格右键菜单选择 Export生成 xlsx内容与当前视图一致这四个动作过了说明设计时包、编译路径、运行时包三件事全部就位后面业务代码遇到问题基本可以排除环境因素。6.2 部署发布时决定带不带 bpl项目交给客户前在 Project Options Packages Runtime Packages 里做一个关键选择。勾选 Build with runtime packages 时exe 启动会动态加载 bpl发布目录里必须带上全部 bpl 文件不勾选时控件代码静态链进 exe单个 exe 就能跑体积会变大。不同版本 Delphi 的菜单位置略有差异直接在 Options 搜索框输入 Runtime Packages 更快。对于 EhLib 这种依赖多个 bpl 的控件我一般选择静态链接少一次 bpl 版本不匹配的风险但如果你同时用了大量第三方控件包静态链接会让 exe 涨到几百兆那时勾选运行时包并把 bpl 统一放一个目录更合理。6.3 我的习惯把版本配对写进 README最后一条是教训换来的习惯每个项目 README 的第一行写工具链版本比如Delphi 13.1 EhLib 13.0.015(no source) Windows 11 x64。换机器、换同事、半年后自己回来维护按这一行就能把环境恢复到可用状态不用面对一堆压缩包一个个试。控件类依赖不像普通包管理器有锁文件不记下来的话只能靠回忆。这个习惯帮我避开过好几次装错版本白忙半天的事希望帮到你。本文还有配套的精品资源点击获取