☰
Delphi 7表格插件DBGridEH 3.6:安装配置、多表头与排序过滤实战
2026/10/11 15:20:44 网站建设 项目流程

简介:针对 Delphi 7 开发者在数据表格处理上的不足,增强型组件 dbgridEH3.6 相比原生 DBGrid 拥有更优的大数据渲染性能、灵活的列宽行高设置、冻结行列、复杂排序过滤以及多语言支持,适合中高级桌面应用开发者快速构建交互式数据界面。资源包内含 345 个文件,体积仅 1.63MB,核心以 Delphi 源码(pas)、窗体定义(dfm)、组件包(dpk)与编译单元(dcu)为主,同时附带说明文档和多语言资源,便于组件注册与二次开发。目前已有 603 人学习下载,属于轻量实用的第三方控件资源。压缩包内提供完整源码和工程文件,并包含示例界面与事件扩展机制,可帮助开发者快速掌握配置和调用方法,有效提升数据管理应用的开发效率。

1. Delphi 7表格插件DBGridEH 3.6是什么:它不只是把 TDBGrid 换个外观

很多维护老 Delphi 项目的人第一次听说 DBGridEH 3.6,都以为它只是把标准 TDBGrid 换了个皮肤。实际用上以后就回不去了:标准表格控件在 Delphi 7 里只能平铺显示,多表头要自己画,下拉选择要做弹窗,排序、过滤、合计这些需求要么自己写事件,要么再引一堆第三方控件。DBGridEH 3.6 是 Ehlib 组件集里最常被拿出来单独用的网格控件,给 Delphi 7 这种老环境装上以后,多级表头、数据感知下拉列、标题排序、过滤行、底部合计这些能力直接在窗体设计期就能摆好,不需要额外写一条 SQL 去看数。这篇文章适合两类读者:想给老系统界面补功能的开发者,以及接手维护前人代码、被一句“表格加两行表头”追着改的人。下面按下载安装、核心参数、踩坑记录、收尾技巧这条线把整件事讲完。

2. 下载安装:让 DBGridEH 3.6 在 Delphi 7 里真正跑起来

2.1 下载后先对版本:解开压缩包先找 Delphi7 目录

拿到 DBGridEH 3.6 的压缩包以后别急着解压到桌面就打开 IDE,先把包解开看目录结构。Ehlib 组件集的发布包通常按 IDE 版本分组,里面会同时出现 Delphi7、CBuilder6 这类子目录,每个目录对应不同的编译期。DBGridEH 3.6 这个版本号本身是组件的功能版本,和 IDE 版本是两套标号,所以压缩包里一定有个和 Delphi 7 对应的子目录,包文件也常写成带 70 后缀的格式,比如 EhLib70.dpk。

典型结构如下:

EhLib_3.6/ ├── Delphi7/ │ ├── EhLib70.dpk // 运行时包,提供组件实现代码 │ ├── dclEhLib70.dpk // 设计时包,决定组件是否出现在面板 │ ├── EhLib70.dcr // 组件图标资源 │ ├── source/ // 单元源码,编译时依赖 │ └── README.txt ├── CBuilder6/ │ └── ... └── Common/ └── ... // 跨版本共用的基础单元

逻辑说明:运行时包是组件功能的“本体”,设计时包是给 IDE 注册组件按钮、属性编辑器的入口。只编译运行时包,面板上找不到 DBGridEh;只装设计时包,运行时又会提示找不到包。参数说明:整个目录解压以后路径不要带空格,不要放在中文目录下,Delphi 7 的库路径解析对空格非常敏感,建议放在像 D:\EhLib36 这种短路径下。记住这个习惯能省掉后面一半的编译报错。

2.2 编译安装顺序:先编运行时包,再装设计时包

装这个组件最常见的翻车点不是下载错了,而是安装顺序不对。我见过不少人在群里问“为什么装了以后组件面板上什么都没有”,最后都是因为直接打开 dclEhLib70.dpk 点了个 Install,运行时包还没编译,IDE 找不到依赖的符号,Install 过程实际上是失败的。

正确的顺序是:

  1. 打开 Delphi 7,Tools > Environment Options > Library,把第 2.1 节解压路径下的 source 和 Common 目录追加进 Library Path。
  2. File > Open,选择 EhLib70.dpk,在 Project Manager 里点 Compile。此时只编译不安装。
  3. 再 File > Open,选择 dclEhLib70.dpk,先 Compile,再点 Install。
  4. 安装成功后组件面板会出现新的一页。页名可能是 EhLib,也可能受注册方式影响有别的名字,这时直接看面板上的 DBGridEh 图标就行。

上面这些动作写成注释形式是:

{ Delphi 7 菜单路径对应动作: 1. Tools → Environment Options → Library → Library Path 追加 D:\EhLib36\Delphi7\source D:\EhLib36\Common 2. File → Open → EhLib70.dpk → Compile 3. File → Open → dclEhLib70.dpk → Compile → Install }

逻辑说明:先编译运行时包,是因为 dcl 设计时包在注册组件时会引用运行时包生成的 dcp 文件,这个文件不存在时 Install 只会把注册表信息写一半,面板不显示,还没有任何一个直观错误弹出来。参数说明:Library Path 里加的两个目录不要颠倒,Common 里通常是跨版本共用的基础类,source 里才是 DBGridEh 的实现单元。每添加一个目录,Delphi 7 会立即重新解析一次环境,第一次添加以后 IDE 会卡几秒,这是正常的。

安装完以后验证一下:Component > Install Packages 里能看到 dcl 开头的包在列表里,并且前面的复选框是勾选状态。如果没勾,手动勾上再关掉对话框,组件面板会刷新。

2.3 最小验证:新建工程放一个 DBGridEh 到窗体

装完组件不要直接进业务代码,先做一个最小验证,确认控件不但在 IDE 里能看到,而且运行期也能正常创建。新建一个 Application 工程,往窗体上放一个 DBGridEh,右键点它,菜单里有“Columns Editor”这一项,说明设计期注册成功。

再用代码方式验证一次运行期:

// 窗体上一个 TDBGridEh,全代码创建,用来判断运行包是否加载完整 procedure TForm1.FormCreate(Sender: TObject); begin DBGridEh1 := TDBGridEh.Create(Self); DBGridEh1.Parent := Self; DBGridEh1.Align := alClient; DBGridEh1.Options := DBGridEh1.Options + [dgTSortEnabled]; // 没连数据集也能创建窗体,说明运行时包已经进入当前工程 end;

逻辑说明:TDBGridEh 这个类在代码里能创建出来,直接证明运行时包被成功编译并加载到了当前工程。如果提示找不到这个类,说明刚才那一轮安装步骤里运行时包没有真正编进去。参数说明:dgTSortEnabled 是后面讲排序用的选项,这里先挂上不影响验证。验证标准是运行以后不弹错误,窗体里能看到一块空白网格区域。

3. DBGridEH 3.6 的核心功能与参数配置:多表头、下拉选择与自动合计

3.1 多表头与跨列表头:两行表头一次摆平

需求很常见:部门下面挂姓名、工号两列,表头上要有一个大的“员工信息”把它们罩住。标准 TDBGrid 对这种需求基本只能靠自绘,DBGridEH 3.6 用 MultiTitle 属性解决。

先把网格的 MultiTitle 置为 True,然后给每个列的 Title.Lines 加入上级表头文本。我一般这样处理:列自身的 Caption 写最下面那行,Lines 里写上一级,同一个组的多列用相同的上级文本。运行以后父文本会自动对齐到同一高度。

// 开启多表头 DBGridEh1.MultiTitle := True; // 第0列:部门,不需要上级标题 with DBGridEh1.Columns.Add do begin FieldName := 'DeptName'; Title.Caption := '部门'; end; // 第1、2列:姓名和工号,上级都写“员工信息” with DBGridEh1.Columns.Add do begin FieldName := 'EmpName'; Title.Caption := '姓名'; Title.Lines.Add('员工信息'); end; with DBGridEh1.Columns.Add do begin FieldName := 'EmpNo'; Title.Caption := '工号'; Title.Lines.Add('员工信息'); end;

逻辑说明:Title.Lines 相当于给标题区增加“上层行”,DBGridEh 3.6 会把相邻列中相同字符的上层文本在视觉上拼成一块,看起来就是跨列合并表头。参数说明:MultiTitle 为 False 时 Lines 会被忽略;某个列不想有父标题,就不要给 Lines 加任何内容。注意一点,父级标题文字别太长,最好控制在 6 个汉字以内,过长会把整个表头高度顶得很高,挤压正文区的显示空间。

3.2 列内下拉选择:外键字段不用再弹窗

老系统里状态字段经常是“0”“1”“2”这样的编码,界面上不能直接显示数字,过去都在字段的 OnGetText 事件里转成中文。DBGridEH 3.6 的列对象直接带 PickList,属于最简单的下拉方案:把选项在运行前填进 PickList,编辑状态下该列自动变成下拉框,选中的内容直接写回字段。

代码设置方式:

// 状态列下拉:运行时自动变成下拉框 var Col: TColumnEh; begin Col := DBGridEh1.Columns.Add; Col.FieldName := 'Status'; Col.Title.Caption := '状态'; Col.PickList.Add('启用'); Col.PickList.Add('停用'); Col.PickList.Add('维护中'); end;

逻辑说明:PickList 是 DBGridEh 列对象上现成的字符串集合,不需要额外放 Popup 控件,也不需要在事件里处理下拉弹出逻辑。参数说明:PickList 选项不要超过 10 个,选项过多时下拉区域会被拉得很高,操作体验反而差。另一个更关键的坑是:PickList 写回字段的就是你看到的那串文本。如果数据库里存的是“0”“1”,不要用 PickList 去硬映射,否则保存时会把“启用”写到整数列里,然后数据库报转换错误。

当外键指向另一张表时,DBGridEH 3.6 还有一组合适的 LookupParams 参数可用:指定 KeyFieldNames、LookupDataSet、LookupKeyField、LookupResultField,网格显示时自动去关联数据集里找对应名称。适合这种情况就用它,不要在查询 SQL 里硬 join 一张字典表,界面渲染会更简单。

3.3 标题排序、过滤行、底部合计:看数据不用再开查询工具

DBGridEH 3.6 最招人喜欢的地方是排序、过滤、合计这三个功能都不依赖写 SQL。排序开关是 Options 里的 dgTSortEnabled;过滤需要把 dgFilter 加进 Options,打开以后标题下方会出现一行过滤输入条,每列可以单独输入条件;合计则需要三样东西配合:FooterRowCount、SumList 和列的 Footer 属性。

三件事放在一段代码里就是最小配置:

// 初始化网格的排序、过滤、合计 DBGridEh1.Options := DBGridEh1.Options + [dgTSortEnabled, dgFilter]; // 合计行:先给数量,再激活计算 DBGridEh1.FooterRowCount := 1; DBGridEh1.SumList.Active := True; // 指定要汇总的列,假设第3列是金额 DBGridEh1.Columns[3].Footer.ValueType := fvtSum; DBGridEh1.Columns[3].Footer.DisplayText := '合计金额'; // 显示文本与数值并列展示,列底部会同时出现“合计金额”和求出的值

逻辑说明:dgTSortEnabled 打开后点击表头会触发排序,前提是数据集本身支持排序,像 TClientDataSet 配好索引、ADO 数据集开合适的游标就能正常工作。dgFilter 打开后过滤行输入的内容会被网格自动处理,相当于可视化的过滤条件。合计行的计算由 SumList 统一监听,数据集过滤后它会自动重算,不用手工刷新。参数说明:Footer.ValueType 支持 fvtSum、fvtCount、fvtAvg、fvtMax、fvtMin 几种;DisplayText 不设置时只显示数值,没有“合计”这样的前缀文字;FooterRowCount 设为 1 代表底部出现一行统计行,设 2 会出现两行,第二行通常放明细状态说明。

提示:排序和过滤不要当成数据库查询来用。排序只在当前数据集已经读取的数据里做,如果数据来自 SQL 的 ORDER BY,再点击表头排序可能出现顺序来回跳;过滤也是对进入数据集的行做筛选,不会去数据库重跑 SQL。要真正的条件查询,还是走 DataSet 的 Filter 或重新执行 SQL。

4. 避坑手册:DBGridEH 3.6 安装与使用中的高频问题与排查

4.1 安装后组件面板找不到 DBGridEh

现象:按顺序编译了两个包,Component > Install Packages 里也看到了 dcl 开头的包,但组件面板上就是找不到 DBGridEh 图标。

原因:大概率是 IDE 加载的是另一个同名包,或者设计时包安装时因为依赖缺失被跳过,Delphi 7 对这类失败通常不弹错误框,只是默默不显示。还有一种情况:安装成功但面板新增页在比较靠后的位置,被滚动条挡住了。

解决:先到 Component > Install Packages 里确认 dcl 开头的包名前面复选框是勾选状态,没勾就勾上。然后到组件面板完整翻一遍,不要只盯着默认页。如果还是没有,直接回到 dclEhLib70.dpk,重新 Compile 再 Install,安装成功时 IDE 状态栏会出现安装完成的提示文字,看到这个才算数。

4.2 编译运行时报找不到运行包或启动崩溃

现象:工程编译通过,运行到主窗体创建时报访问地址冲突,或者直接提示找不到 EhLib 相关的 bpl 文件。

原因:Delphi 7 在使用第三方组件时经常以 bpl 运行时包方式加载,新机器上只拷了 exe 和设计时包相关文件,运行包没有注册到系统路径,程序启动时自然找不到类。

解决:打开 Project > Options > Packages,把 Build with runtime packages 勾选上,并确认包列表里有运行时包那一项。发布给别的机器时,把对应的 bpl 文件放到 exe 同目录,这个方法比去系统目录注册稳定,也方便以后清理。检查时还要注意 bpl 和项目当前编译的 dcp 是否同一批次生成,混装旧版本容易出现更隐蔽的跳转错误。

4.3 MultiTitle 与过滤行同时开,表头高度错乱

现象:设计时两行表头看着正常,运行后过滤行一出现,表头被挤压,列标题开始换行,整个标题区布局变形。

原因:过滤行占用标题区下方的纵向空间,MultiTitle 又把标题区按多行拆分,两行表头再加过滤行时,某些版本的表头高度计算会漏掉一行,导致重绘错位。

解决:先确认标题文字长度,父级标题控制在 6 个汉字以内,没有父级的列 Caption 也尽量短。第二,不要同时让过滤行和跨列父标题挤在一起,如果业务上必须同时用,把标题区的自动换行关闭,或者在设计期就把列宽调到足够放下一行文字。第三,把用户运行期拖拽列宽后的值保存下来,FormResize 时重新对齐,能减少重绘动态计算带来的二次错位。

4.4 大数据量下滚动卡顿,合计行一直显示 0

现象:数据到几十万行时,垂直滚动明显卡顿;同时底部合计行不刷新,一直显示 0 或空白。

原因:滚动卡顿通常不是网格的锅,而是数据集一次性把全表数据取回了内存,DBGridEh 只是展示层,瓶颈在数据读取方式。合计行不显示与初始化顺序有关:SumList 在数据集打开之前就激活,某些数据源类型下合计不会自动重算。

解决:数据量大的场景,我一般改数据集侧的加载方式:ADO 查询用服务器端游标,存储过程返回的数据不要做全量缓冲,本地临时表则考虑分页查询,每次只让网格面对必要的行数。合计行这块,固定顺序是:数据集打开之前把 SumList.Active 设为 False,数据集打开之后再设为 True,同时列 Footer 的 DisplayText 也要等数据集打开后再赋值。顺序对了,合计行基本不会出现空白。

5. 收尾的两个细节:导出 Excel 与大数据量下的显示优化

5.1 用网格自带的文本导出生成 Excel 可读文件

导出需求几乎每个用 DBGridEH 3.6 的项目都会遇到,而且通常没人愿意再引一个报表组件。这个版本比较成熟的方案是文本导出,生成的文件用 Excel 能直接打开,也能被 WPS 识别。

// 导出当前网格内容为文本格式,Excel 可直接打开 procedure ExportGridToSpreadsheet(const AFileName: string); begin DBGridEh1.DataSource.DataSet.DisableControls; try DBGridEh1.ExportToTextFile(AFileName, True); finally DBGridEh1.DataSource.DataSet.EnableControls; end; end;

逻辑说明:导出前调用 DisableControls 是为了防止数据滚动时界面反复刷新,导出完再恢复。参数说明:ExportToTextFile 的第二个参数表示是否包含表头行,设为 True 时导出的第一行是标题文字,财务对账场景这个参数通常是必须的。文件建议命名为 .xls 后缀,Excel 打开时会按表格方式识别,列顺序与网格显示顺序保持一致,不需要额外映射。

5.2 大数据量下的一次只取一屏

网格本身没有把几十万行数据压进内存的魔力,它能滚动流畅,靠的是数据集端一次只提供一小批数据。我以前做某个人事系统时,一开始直接往 ADO 查询里拖全表,屏幕上网格滚动到一半就开始打嗝。后来改成按部门条件分页,每页 1000 行,配合索引定位,滚动就顺了。这个思路比在网格参数里找选项更可靠。

真正遇到超大数据量,还有一个习惯值得留下:列宽持久化。DBGridEH 3.6 运行期允许用户拖列宽,但不负责保存,每次打开界面都要重新调。我一般在 FormClose 里把每列 Width 写进 ini 文件,FormCreate 时读回赋值给对应列。这个小习惯能顶掉不少用户报的“每次打开都要拉列宽”的琐碎反馈。

这几年我维护老 Delphi 系统的经验是:组件用熟不难,难的是知道哪个参数该碰、哪个参数别碰。DBGridEH 3.6 在三表头、下拉、过滤、合计这些常见表格需求上确实成熟,装对版本、按顺序编译、谨慎处理数据量,就能少很多折腾。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询