
简介dbgrideh for D7是一套面向Delphi 7开发者的数据库网格增强组件用于替代功能受限的标准TDBGrid在数据显示、编辑、验证、排序、分页、打印导出及高级筛选等方面提供完善能力适合需要构建进销存、ERP、财务等复杂桌面数据库应用的中高级Delphi程序员。压缩包共129个文件大小约1.16MB主要包含40个pas源代码、34个dcu预编译单元、12个dfm窗体资源以及dpk包配置、hlp帮助文档、示例工程dpr和关键inc配置文件可直接集成到Delphi 7环境中并安装到组件面板也可通过源码研究实现机制或自行扩展。压缩包结构清晰已有216人学习浏览资源内附完整源码与预编译单元方便开发者根据业务需求二次开发借助示例工程还能快速掌握日期、货币、复选框等列类型设置及数据验证逻辑减少查阅文档和调试的时间。该组件在多字段排序、行列表冻结、高级筛选和Excel/PDF导出方面均有成熟实现能提升数据库应用的交互体验与开发效率尤其适合处理大数据量表格场景。1. 还在跑 D7 的项目数据表格增强为什么绕不开 DbGridEh客户嘴里的一点小需求往往就是开发者的噩梦。前两天一个还在用 Delphi 7 的进销存项目提了四个需求点列表头排序、表格底部出合计、每列能做条件筛选、把部分字段改成下拉选择。数据列表用的是原生 TDBGrid这几件事得自己写排序逻辑、自己遍历数据集算合计、自己拼 SQL 做筛选下拉工作量完全不小。这种局面我处理过太多次答案基本是同一个把 TDBGrid 换成 DbGridEh。DbGridEh 是 EhLib 组件库里的核心控件脱胎于 TDBGrid但把日常项目里最高频的那批表格交互直接做成了属性配置。点表头排序、底部分组合计、行首筛选行、单元格下拉列表、复选框显示、数据导出这些能力装好之后开几个属性就能用比自己从零写省下太多时间。它适合两类人一类是还在维护 D7 存量系统的老开发系统跑得好好的没必要换 IDE但交互确实该升级另一类是在老项目基础上做功能迭代的新人面对一堆历史代码与其重写列表不如替换控件。这篇文章我就从版本选型、安装、迁移配置、踩坑四个维度把 D7 下使用 DbGridEh 的完整过程讲清楚。1.1 别被小需求骗了原生 TDBGrid 的真实成本很多人觉得 TDBGrid 自带排序其实那只是点击表头有视觉反馈数据本身不会有任何变化。要实现真正的排序你得写 OnTitleClick判断当前列、切换升降序、再给数据集设置索引或重发 SQL。合计更麻烦得在 DrawColumnCell 或者自定义绘制里逐行累加画出来的效果还经常对不齐列宽筛选则基本等于重新做一个查询界面。三个小需求叠加开发加联调至少两三天。换成 DbGridEh 之后我最多一个小时就能把这些配置完。这不是控件迷信是实打实的效率差距。1.2 DbGridEh 到底比原生控件多了什么装完 EhLib 后组件面板会多出一页里面不只有 TDBGridEh还有 TMemTableEh、TDataDriverEh、TDataSetDriverEh 这些配套组件。日常最多用的还是 TDBGridEh 本身高频能力基本都是开箱即用点击表头排序自带升降序箭头标记底部合计行支持求和、计数、平均、最大、最小行首筛选行每个字段下面一个输入框或下拉框实时过滤列级 PickList 下拉固定选项直接配复选框显示布尔字段配合值映射右键菜单导出 Excel、CSV、HTML列宽、列顺序拖拽调整多选行冻结列这些功能拆开看都不复杂但串起来正好覆盖了业务系统数据列表的绝大多数需求。老项目里这一套组合拳比慢慢补原生控件靠谱得多。2. 版本选型是第一道坎D7 到底能装哪一代 EhLib很多人在这一步就栽了。网上搜 DbGridEh直接下载最新版解压后傻眼——安装包里根本没有 Delphi7 目录白折腾半天。DbGridEh 所属的 EhLib 库版本节奏基本是跟着 IDE 走的越往后越不照顾老版本。2.1 EhLib 版本和 IDE 时代的对应关系我按实际可用的范围整理了一张表方便你对照EhLib 版本对应 IDE 时代D7 是否可用3.x / 4.xDelphi 5 / 6 / 7 时代可用但特性偏老5.x尤其 5.2 / 5.3Delphi 5~7 及早期版本推荐社区公认的稳定落点6.x ~ 7.xDelphi 2007 / 2009 / 2010 / XE 系列D7 基本不再官方支持8.x 及以上RAD Studio 10.x / 11.x / 12.x不考虑 D73.x 和 4.x 不是不能用只是合计行、筛选行这些后期加进来的功能不够完善既然要替换控件没必要一开始就迁就旧特性。而 6.x 之后官方安装包的目录结构里已经找不到 D7 的份强行拿源码改编译报错能报到你怀疑人生。2.2 社区里最稳的组合EhLib 5.2 或 5.3对 D7 项目我通常建议优先找 EhLib 5.3找不到就退到 5.2两者在 D7 下都足够稳定功能差异也不大。选择它们的理由很实际安装包里保留了 Delphi7 目录编译链是完整的组件面板注册、设计期包安装都属于按步骤就能成功的那种不需要额外补丁。顺带提醒一句网上有些打包好的所谓绿色版或者一键安装包里面混了不同版本的 Common 单元装上之后编译时经常报一些莫名其妙的错。我的经验是尽量找完整的源码包自己编译安装虽然多几步操作但环境是干净的后面出问题也好排查。3. 安装全流程记录从 dpk 到组件面板源码包的安装方式属于一次装对长期省心这里我把完整流程和容易翻车的点一起写出来。3.1 安装前要做的两件事第一解压路径不要带中文和空格。D7 是老 IDE对路径的处理远没有现在讲究路径里一个中文就可能让编译器找不到文件时间花在这种地方太冤。第二先把 Delphi7 和 Common 两个目录配置进库路径。打开 D7 的 Tools Environment Options Library Library Path把解压目录下的 Delphi7 和 Common 都加进去。这一步不做后面编译包的时候会疯狂报找不到 xxx.dcu。3.2 标准三步安装法源码包解压后目录结构一般包含 Common、Delphi7、Demo 这样的子目录。安装分三步走打开 Delphi7 目录下的运行时包也就是名字里没有 Dcl 前缀的那个 dpk 文件先点 Compile。这一步把公共单元和运行时逻辑编成 dcu 和 bpl。再打开设计期包带 Dcl 前缀的那个 dpk这次要 Compile 之后点 Install。设计期包负责把控件注册进 IDE 的组件面板。回到窗体设计器滚动组件面板看到 EhLib 这一页出现里面有 TDBGridEh、TMemTableEh、TDataDriverEh 就算装成功了。3.3 安装中的常见报错和处理方法这么多年装下来报错基本集中在这几类编译时提示找不到 dcu 文件库路径没有加全回去检查 Delphi7 和 Common 是否都在。安装设计期包时提示找不到 bpl运行时包没编译成功或者编译产物路径没在 IDE 的 BPL 搜索路径里先回头把第一步做完。Install 报 cant load package大概率是系统里残留了其他版本的 EhLib 相关包把原有的 EhLib、DBGridEh 相关的 BPL 和 DCP 清理干净再试。装好后拖动控件到窗体报初始化错误Common 单元混版本了这种情况最省事的办法是清掉 Library Path 里所有 EhLib 相关路径重装一遍。装完之后别急着写功能先放一个空窗体拖一个 TDBGridEh、一个 TADOQuery、一个 DataSource把数据链搭起来验证一下控件能正常显示数据。这步通过后面的配置才有意义。4. 迁移 TDBGrid 后第一个小时该配置的高频功能从原生 TDBGrid 切到 TDBGridEh有两种做法。一种是直接改 .dfm 文件把 object 的类名从 TDBGrid 替换成 TDBGridEh然后在单元文件的 uses 里加上 DBGridEh再把字段类型声明改掉。这种做法适合列配置少、结构简单的表格能保留字段名和宽度省去重新拖一遍的功夫。另一种是删掉旧控件重新拖一个新控件肯定更稳但列多的表重新配置也要花点时间。替换完之后接下来这四组配置是利用率最高的。4.1 让表头点击真正生效DbGridEh 里有个 dghAutoSortMarking 选项勾上之后点击表头就会显示排序箭头标记。但要注意这只是一个标记真正的排序逻辑还要自己接。最省事的做法是在 OnTitleClick 事件里给数据集设置排序procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh); var SortField: string; begin if Column.FieldName then Exit; SortField : Column.FieldName; // 如果是按当前列排序过则在升序和降序之间切换 if Pos(SortField, ADOQuery1.Sort) 0 then begin if Pos( DESC, ADOQuery1.Sort) 0 then ADOQuery1.Sort : SortField ASC else ADOQuery1.Sort : SortField DESC; end else ADOQuery1.Sort : SortField ASC; end;用 ADO 数据集时Sort 属性本身支持多字段比如 CustNo ASC, OrderNo DESC在复杂排序场景里也能用。如果项目用的是 TClientDataSet思路类似换成设置 IndexFieldNames 就行区别是后者依赖索引字段名必须严格匹配数据集里的实际字段。4.2 底部合计行合计行是 DbGridEh 最受欢迎的功能之一。先把 DBGridEh 的 FooterRowCount 设为 1表格底部就会出现一条合计栏。然后对需要合计的列在列属性里设置 FooterDBGridEh1.FooterRowCount : 1; DBGridEh1.Columns[2].Footer.ValueType : fvtSum; DBGridEh1.Columns[2].Footer.ValueFormat : #,##0.00;ValueType 支持的类型包含 fvtSum、fvtCount、fvtAvg、fvtMax、fvtMin 等基本覆盖了常用的统计需求。需要注意合计行统计的是当前数据集里可见的记录也就是说如果后面开了筛选功能筛选后的合计会自动重算这个联动效果客户通常非常满意。4.3 行首筛选STFilter这是拉开体验差距的功能。STFilter 开启后表头下方会多出一行筛选区每个字段下面可以直接输入条件或者从下拉框里选值。基础配置DBGridEh1.STFilter.Visible : True; DBGridEh1.STFilter.Local : True; DBGridEh1.STFilter.InstantApply : True;Local 模式下筛选操作在本地数据集上完成不重新访问数据库响应速度快。但要特别提醒一点Local 筛选只针对当前数据集里已经加载的数据。如果你的查询只是取了前 100 行那筛选结果也是基于这 100 行客户很容易误以为数据不对。数据量大的表我通常会用非 Local 模式把筛选条件交给后端拼 SQL或者写 OnFilterRecord 自定义过滤逻辑。筛选这个功能越早想清楚数据量边界后面越少挨骂。4.4 下拉选择、复选框和导出下拉有两种常见做法。固定选项用 PickList 最方便在列属性里把可选值填进去运行时单元格会自动出现下拉箭头如果下拉内容和数据集相关可以用 LookupParams 配合另一个数据集。布尔字段就简单了把列属性里的 Checkboxes 设为 True再用 KeyList 和 DisplayValues 把存储值和显示值对应起来数据库里存 Y/N界面上显示是/否一行配置搞定。导出这块新版 EhLib 提供了现成的导出能力但 5.x 在 D7 下的导出模块不同发行版实现位置有差异我实际项目里更常用老办法遍历当前数据集自己生成 CSV 文件。这样既能精确控制导出的列和格式也绕开了老版本导出模块偶尔的兼容性问题反正业务系统导出 CSV 足够满足秋后查账的需求。5. 实战里躲不掉的几个坑编码、视觉样式、内存与打印功能配置完成后真正的问题往往出现在长期运行和不同机器上。这几个坑我在 D7 项目里基本都踩过一遍。5.1 编码问题ANSI 和 UTF-8 之间的裂缝D7 是 ANSI 时代的产品DbGridEh 老版本在 D7 下处理字段值用的也是 AnsiString。国内老系统的数据库大多还用 GBK/GB2312所以问题不明显。但一旦数据源换成新业务库或者接口返回 UTF-8表格里就会出现一堆乱码而且这种乱码不是改个字体能解决的。最实用的处理方式是在数据集的字段 OnGetText 事件里做转换procedure TForm1.ADOQuery1NameGetText(Sender: TField; var Text: string; DisplayText: Boolean); begin if Sender.AsString then Text : Utf8ToAnsi(Sender.AsString); end;思路很简单入库和出库统一在边界做字符集转换表格显示层不感知字符集差异。新老系统混接的时候这个处理能省掉大部分乱码投诉。5.2 老控件在新系统上的视觉小毛病D7 时代写的控件拿到 Win10、Win11 上偶尔会出现绘制问题。最常见的表现是列头文字有残影、滚动条样式和系统主题格格不入、焦点框位置对不齐。遇到这种情况先别急着换控件按顺序试两个办法一是把控件的 Flat 属性关掉让绘制逻辑走经典样式二是给所在窗体把 DoubleBuffered 设为 True减少重绘闪烁。这两个操作能解决绝大多数绘制小毛病还不行再考虑是不是系统 DPI 缩放导致的把进程的 DPI 设置调整为系统缩放或者关掉缩放就行。5.3 资源占用和性能问题DbGridEh 本身不会造成特别严重的内存问题但配合 TMemTableEh 这类内存表组件时要注意释放。运行时创建的 TMemTableEh用完一定要 FreeAndNil否则老组件里有些资源不会自动回收窗体开开关关内存就悄悄涨上去了。性能方面网格的滚动流畅度取决于数据量。老项目里常见的错误写法是一次性把整张大表取回客户端然后指望 DbGridEh 滚动不卡。再好的控件也扛不住几万行全部塞进网格。我一般在查询层就控制数据量该分页分页该加 WHERE 加 WHERE。数据量小了本地排序和筛选的响应速度自然快。5.4 打印功能别指望控件自带这是一个容易产生误解的点。很多人装完 DbGridEh 发现右键菜单里没有打印就觉得是不是装错了。实际上老版本的 DbGridEh 本身不提供报表打印能力它管的是数据展示和交互。真正的打印要么自己用 TPrinter 画表格要么搭配 QuickReport、FastReport 这类报表组件来做。项目真有打印需求时尽早确认技术方案别到上线前才发现打印这块还是空白。6. 长线维护的最后几条建议控件装好、功能跑通这不算完。D7 老项目的维护往往要持续很多年后面这些习惯能帮你省掉不少回头路。6.1 把编译产物当资产备份装好控件后把编译出来的 BPL、DCP 文件以及整个源码包一起备份起来。换电脑、换开发环境的时候直接从备份恢复比重新下载、重新编译靠谱得多。D7 项目的环境搭建有时比写代码还麻烦备份做得好半天就能恢复做不好就得折腾一整天。6.2 有条件就做一次基类封装如果项目里有多个列表页面我强烈建议抽一个基类窗体把排序、合计、筛选、CSV 导出这些逻辑统一在基类里实现子页面只负责配列、配字段。这样后面新页面只需要继承基类半小时就能出一个列表功能而且逻辑一致性好改一处全局生效。这个投入在 D7 老项目里回报极高。6.3 给团队定一个统一的控件版本团队协作时一定要在项目文档里固定 EhLib 版本。我见过几个人同时维护一个项目有人装 5.2有人装 5.3有人从别的项目拷了个旧版的 dcu 过来编译时冲突层出不穷。定死版本后再配合编译产物备份至少能把这类低级冲突从根上杜绝。D7 和 DbGridEh 的组合看着像是上个时代的搭配但存量业务系统只要还在跑这套组合就还有它的价值。我个人的体会是别总觉得老技术就该退休在维护成本和技术新颖度之间找平衡点才是老项目开发最该做的事。本文还有配套的精品资源点击获取