简介针对 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 过程实际上是失败的。正确的顺序是打开 Delphi 7Tools Environment Options Library把第 2.1 节解压路径下的 source 和 Common 目录追加进 Library Path。File Open选择 EhLib70.dpk在 Project Manager 里点 Compile。此时只编译不安装。再 File Open选择 dclEhLib70.dpk先 Compile再点 Install。安装成功后组件面板会出现新的一页。页名可能是 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 在三表头、下拉、过滤、合计这些常见表格需求上确实成熟装对版本、按顺序编译、谨慎处理数据量就能少很多折腾。希望帮到你。本文还有配套的精品资源点击获取