资讯动态

Delphi 11下EhLib 10.0.031安装与DBGridEh实战指南

发布时间:2026/10/18 3:53:13 来源:尧图企业网站定制
简介EhLib 10.0.031是一套面向Delphi 11开发者的功能型组件库核心覆盖图形图像处理、多类数据库连接、报表设计、图表分析与界面增强等常见开发场景。该版本已通过Delphi 11.1.5环境安装测试适合中高级Delphi工程师和需要构建数据密集型桌面应用的企业项目组。压缩包共包含890个文件整体大小约24.63MB文件结构以pas源代码、dfm窗体描述、dpk与dproj工程文件为主同时附带chm帮助手册、doc/docx使用说明及示例数据库方便开发者在不同模块间快速定位。目前已有885人次学习下载在社区中具备一定的实用参考价值。除可直接安装的组件外资源还提供完整源码、示例项目与文档既可深入理解EhLib内部的绘制与数据绑定机制也能据此二次开发出贴合业务的自定义报表、图表和数据库控件从而有效提升Delphi项目的交付效率。1. 装上 EhLib 10.0.031 之前我在 Delphi 11 里被数据网格折磨了两周做一个进销存 Demo 的收费端时我用原生 DBGrid 展示销售明细结果滚动卡顿、列宽拖拽不顺手、合计要自己循环算导出 Excel 更是要开 ActiveX 写一堆模板。两周里项目进度卡在网格上后来看见群里有人提起 EhLib 10.0.031 for Delphi 11装上之后大部分功能变成了属性配置。这篇笔记就是把那次从安装到应用的过程拆开讲新手能按步骤走老手也能看到几个平时容易忽略的参数边界。如果你也正在被数据网格的显示、编辑、导出三件套烦着这份资源值得先花半小时验证一遍。2. 安装 EhLib 10.0.031 到 Delphi 11从解压到组件页出现的完整流程2.1 拿到资源后先检查这些文件别急着双击安装EhLib 压缩包解压后第一件事不是找 install.exe而是先看目录结构。一个合格安装包里通常能看到这些内容目录/文件用途需要核对的点带 11 标识的 .dpk/.dproj对应 Delphi 11 的包工程包名里有没有 11 或 110 之类标识不能拿旧版本强装Source 目录运行时源码后续 Library Path 需要指到这儿Bin/Precompiled预编译的 .bpl/.dcu能用能省时间但建议还是自己编译一遍Help 目录在线帮助文档注册到 IDE 帮助后使用更方便不是必需Demo 目录示例工程安装完先打开一个 Demo能快速确认功能我一般会先在命令行里扫一遍 dpk 文件确认有没有对应 Delphi 11 的包。用 PowerShell 或 Git Bash 都可以find . -iname *.dpk | grep -i 11如果输出为空说明压缩包内没有对应版本或者文件名被改过。这个时候停下来检查是不是拿错了旧版资源不要硬把 Delphi 10.4 的包往 Delphi 11 的 IDE 里装否则编译会一屏红色错误。这个命令只做了检索没有任何副作用。接着检查路径整个解压路径不要带中文、空格和括号。我一般直接放到C:\Components\EhLib-10.0.031免得后面配置 Library Path 时出现玄学问题。路径问题很隐蔽等你配完环境变量仍然报找不到时才会意识到是这个坑。2.2 按顺序编译和安装运行时包再安装设计时包EhLib 的包逻辑和大多数 VCL 组件库一样先有运行时包runtime package提供 .bpl/.dcu再安装设计时包designtime package负责把组件注册到 IDE 的工具面板上。顺序反了设计时包编译会直接提示找不到运行时单元。打开 Delphi 11用 File Open Project 打开压缩包里的包组文件通常是 .dpk、.dproj 或 .groupproj。我一般先编译运行时包再编译安装设计时包。在 Project Manager 里右键对应项目先 Build 一次再 Install。如果一次打开的是包组需要看清楚哪些是运行时包、哪些是设计时包。运行时包编译结果是一个带版本号的 .bpl 文件设计时包编译结果会注册到 IDE。看到 “Package ... installed” 的提示才算注册成功。有些环境会弹确认框点确认后立即生效。这套流程有个隐性要求编译过程中最好不要开杀毒软件的实时监控否则生成的 .dcu 可能被锁成只读导致下一次 Build 失败。不是让你永久关闭是编译时暂停一下编译完再开。2.3 配置 Delphi 11 的库路径Library Path组件面板里能看到 EhLib 页不代表你的工程能编译。直接在 Uses 里写 DBGridEh 保存时会报 File not found原因往往是 IDE 的 Library Path 没有加 Source 目录。打开 Options Environment Options Delphi Options Library Library Path把解压目录里的 Source 相关目录添加进去。具体加几个路径取决于包的目录设计。我常用的最小集合路径说明C:\Components\EhLib-10.0.031\Source主要源码C:\Components\EhLib-10.0.031\Source\Common公共工具类可能被引用C:\Components\EhLib-10.0.031\Source\DB与数据集、数据库相关的单元添加时注意 Delphi 11 的 32 位和 64 位平台路径是分开设置的建议都加上否则后面切换目标平台时又会报找不到单元。这里的路径不带引号不用通配符直接写目录根到源码目录即可。2.4 验证安装新建一个空白工程拖一个 TDBGridEh安装完成后新建一个 VCL 工程在组件面板上找到 EhLib 页面把 TDBGridEh 拖到窗体上。同时放一个 TDataSource、一个 TButton按钮的 OnClick 里写这样一段最小代码procedure TForm1.Button1Click(Sender: TObject); var MemDS: TMemTableEh; GridDS: TDataSource; begin MemDS : TMemTableEh.Create(Self); MemDS.FieldDefs.Add(ID, ftInteger); MemDS.FieldDefs.Add(Name, ftString, 30); MemDS.Active : True; MemDS.AppendRecord([1, EhLib OK]); GridDS : TDataSource.Create(Self); GridDS.DataSet : MemDS; DBGridEh1.DataSource : GridDS; DBGridEh1.Columns.Clear; DBGridEh1.Columns.Add.FieldName : ID; DBGridEh1.Columns.Add.FieldName : Name; end;这里 TMemTableEh 是 EhLib 自带的临时内存表不需要接数据库适合做安装验证。TFieldDefs 定义临时表字段AppendRecord 写入一行测试数据然后通过 DataSource 交给 DBGridEh。如果运行后网格里出现两列且有一行数据说明运行时包、设计时包和 Library Path 全部生效了。如果 TMemTableEh 没有出现在 IDE 列表里可以先改用 TClientDataSet 代替逻辑一致但最好回头确认一下组件安装步骤是不是漏了某个设计时包。验证通过后安装阶段就算正式收工。3. 用好 DBGridEh 的核心功能列管理、下拉、导出与取数选型3.1 动态列配置用代码控制标题、宽度与对齐网格的列定义不建议在设计器里一列一列手工敲尤其是字段多、表头要中文、列宽要统一的场景。我习惯在 FormCreate 里调用一个 SetupGrid 方法把列属性集中管理procedure TForm1.SetupGrid; var aCol: TColumnEh; begin DBGridEh1.Columns.Clear; aCol : DBGridEh1.Columns.Add; aCol.FieldName : OrderNo; aCol.Title.Caption : 订单编号; aCol.Width : 120; aCol.Alignment : taCenter; aCol : DBGridEh1.Columns.Add; aCol.FieldName : Amount; aCol.Title.Caption : 金额; aCol.Width : 100; aCol.DisplayFormat : #,##0.00; end;TColumnEh 的关键属性FieldName 绑定的是 TDataSet 的字段名不是中文显示名Title.Caption 才是表头真正显示的内容Width 单位是像素120 对常见单据算比较安全。DisplayFormat 只在显示时格式化不改变原始值所以导出时不会带上格式需要记住这一点。如果字段非常多双击组件打开 Columns Editor勾选自动生成列再调整顺序。但自动生成列只适合做纯展示原型。进入正式开发后建议用代码生成列把中文字段名统一写在代码里以后改表头直接搜字符串就行不用每个设计器文件翻一遍。3.2 下拉列表和值列表给单元格塞选项但不破坏数据下拉功能在 DBGridEh 里不是普通 ComboBox而是编辑状态下的下拉框和按钮。常用做法是给某一列设置 EditButtons然后弹一个自建列表。代码大致长这样aCol : DBGridEh1.Columns.Add; aCol.FieldName : Status; aCol.Title.Caption : 状态; aCol.EditButtons.Add; aCol.EditButtons[0].Style : ebsEllipsisEh; aCol.EditButtons[0].OnEditButtonClick : StatusEditButtonClick;然后在事件里弹出一个多列列表或一句 MessageBox用户确认后把值写回字段。这种做法比直接绑定 TComboBox 更灵活适合“审核”这类需要二次确认的操作。如果只是“启用/停用”这种两三个值直接在列属性里用 DropDownList 的 Items 填好不需要写事件。这里有个容易翻车的地方下拉选中的值会直接写进数据集的当前行如果你在 OnColumnEhGetCellParams 里做了条件颜色当前行刷新不及时颜色可能不立刻更新。我一般在下拉事件结束后主动调用 DBGridEh.Refresh 一次省得排查半天。3.3 一键导出 Excel / HTML / CSVDBGridEh 自带导出方法不需要第三方导出控件。我常用的是 SaveToXlsxuses DBGridEhImpExp; procedure TForm1.ExportBtnClick(Sender: TObject); begin DBGridEh1.SaveToXlsx(c:\temp\grid_data.xlsx, True); end;第二个参数是“是否保存列宽、字体、合并单元格等显示属性”。希望导出的 Excel 打开后和网格一致就传 True只要纯净数据表就传 False。这里有个实际坑导出前网格里的合计行和筛选图标会自动带进 Excel。如果报表不需要这些需要在导出前把 FooterRowCount 临时设成 0导出完再恢复。类似处理也适用于 SaveToHtml 和 SaveToCsv。3.4 取数选型TClientDataSet、TMemTableEh 还是直接绑数据库同一个网格可以配多种数据集。我的选型参考取数方式典型场景优点注意点TClientDataSet传统单机或 C/S 系统内建排序过滤能力稳定需要管理 Provider内存占用略高TMemTableEh临时明细、报表计算不需要额外配置字段通用接口不如 CDS 丰富FireDAC 数据集生产环境数据库高性能支持多数据库连接参数独立管理不是 EhLib 特有我个人的分界线是能落库的查询结果进 TClientDataSet网格绑定它临时拼凑的一组数据扔到 TMemTableEh。TMemTableEh 对字段类型的控制比 CDS 弱一些日期显示格式最好在列属性里显式指定否则可能出现默认格式不符合业务的情况。网格和数据集结合时过滤、排序、合计大多直接调用数据集方法所以选哪种数据源与 DBGridEh 本身没有强绑定。但 TMemTableEh 能减少依赖适合在安装验证和原型阶段使用。4. 避坑EhLib 10.0.031 在 Delphi 11 下的常见问题排查记录4.1 编译时提示“找不到单位”或“File not found”现象新建工程后编译提示 File not found: DBGridEh.dcu 或 Unknown namespace。原因Library Path 没有正确指向 EhLib 的 Source 目录或者路径里有中文、空格IDE 解析时被截断。解决回到 Options Library Path检查路径是否与解压目录完全一致注意 32 位和 64 位平台分别配置。如果路径确实正确把 IDE 完全关掉再重开让环境变量重新加载。路径带空格时要么改用 8.3 短路径要么干脆把目录放到盘符根目录省得反复踩坑。4.2 安装包时提示“Cannot load package”或找不到依赖包现象在 Component Install Packages 里能看到 EhLib 项但勾选后提示“无法加载包”错误信息中常出现某个 .bpl 未找到。原因运行时包没有先编译或者设计时包依赖的另一个运行时包没有安装到 IDE 的 BPL 目录。解决用包组文件一次编译所有运行时包确认每个 Build 都成功再单独 Install 设计时包。如果库里有多个运行时包注意它们之间的依赖顺序比如先装基础包再装数据库扩展包。不要去 IDE 里手动勾选未编译的包这只会让 IDE 启动时报新错。4.3 中文显示乱码列头排序不对现象DBGridEh 中中文变成“锟斤拷”一类乱码或者中文排序排在数字后面。原因字符集设置不统一。表头字体没有指定中文字体或者数据库连接字符串没有声明 UTF-8排序问题通常是因为字段类型被识别为 AnsiString。解决把字体设置为“宋体 9pt”或“微软雅黑 9pt”同时确认数据源的字符串字段不是 ftAnsiString。数据库连接串里显式写明 charsetutf8mb4 或对应语系代码。中文排序建议在 SQL 里用 order by 和排序规则处理不要依赖网格默认排序默认排序容易整出玄学。4.4 IDE 启动变慢组件面板出现两个 EhLib 页现象装完 EhLib 后 Delphi 11 启动变慢面板里有两个 EhLib 页拖组件时提示重复注册。原因之前装过其他版本旧的设计时包还留在 IDE 的已安装包里两个包同时加载。解决在 IDE 的 Installed Packages 里禁用旧版本并删除项目中残留的 .bpl/.dcp 文件。如果实在找不到旧包来源用“把当前解压目录复制到新目录、再重新编译安装”的方式替换不要手动去注册表删条目容易把 IDE 环境搞坏。我一般先移除所有 EhLib 相关包重启 IDE再安装新版这个方法最干净。4.5 运行期网格滚动慢卡顿明显现象记录只有几千条但滚动时明显掉帧CPU 占用高。原因可能是列太多且每个列都触发了重绘事件尤其 OnColumnEhGetCellParams 里做了大量字段访问也可能是列宽在运行期被频繁修改每次都触发重新布局。解决取消不必要的列重绘事件把列宽在设计期定好运行期不要用 AutoFitColWidth 反复算数据量大时关闭网格的动画效果并减少隐藏列数量。如果一定要根据数据动态调列宽只对少数关键列做不要对全部列循环更新。这些坑基本都是实际交接维护里最容易遇到的。遇到问题先按现象定位到具体环节不要直接卸载重装那会浪费更多时间。5. 进阶技巧用合计行和列布局把报表任务一起消化DBGridEh 的合计行功能其实可以当轻量报表用省掉单独画报表模板的力气。先把网格的 FooterRowCount 设为 1底部就会出现一个合计行然后在 OnGetFooterParams 事件里写合计逻辑procedure TForm1.DBGridEh1GetFooterParams(Sender: TCustomDBGridEh; DataRow: TGridDataRowEh; var Params: TColCellParamsEh); begin if DataRow nil then Exit; if Params.Column.FieldName Amount then begin Params.Value : FormatFloat(#,##0.00, GetAmountTotal); end; Params.TextAlignment : taRightJustify; Params.Color : clInfoBk; end;GetAmountTotal 里可以写一个 SUM 查询也可以在 TClientDataSet 上建聚合字段。注意 OnGetFooterParams 会对每一列都触发必须先判断 FieldName否则空白列也会显示一个聚合结果。合计行的背景色改成了浅黄色打印时一眼能看出区别。另一个常用功能是保存和恢复列布局。用户调整过列宽和列顺序后下次打开窗口应该保持住否则每次都要重拖。我习惯用 IniFile 保存列顺序和宽度uses IniFiles; procedure TForm1.SaveGridLayout(AGrid: TDBGridEh); var Ini: TIniFile; i: Integer; begin Ini : TIniFile.Create(ChangeFileExt(Application.ExeName, .ini)); try for i : 0 to AGrid.Columns.Count - 1 do begin Ini.WriteString(GridLayout, Format(Col%d.Field, [i]), AGrid.Columns[i].FieldName); Ini.WriteString(GridLayout, Format(Col%d.Width, [i]), AGrid.Columns[i].Width.ToString); end; finally Ini.Free; end; end;读取时反向遍历把对应 FieldName 的列找到并恢复宽度。这个方式比自带布局管理器更轻量适合单机版程序。列布局保存是用户满意度很高的小功能很多人忍不了每次打开都重新调列宽。关于导出问题合并技巧是导出前先把 FooterRowCount 临时设成 0导完再恢复这样 Excel 里不会出现合计行数据表更干净。如果想要带合计行一起导出保持 1 就好但要把合计行背景色关掉避免 Excel 出现灰底格。我之前在模拟项目X里就是因为没做布局保存客户每次远程桌面重开都要重新拖列宽后来加了这个 IniFile 方案一次解决。从那以后我每次发布带 DBGridEh 的程序都强制检查三件事版本包是否匹配 IDE、Library Path 是否配好、列布局有没有保存。希望帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑