简介:面向Delphi 7桌面开发者的dbgridEH3.6增强表格插件包,用于补齐原生DBGrid在复杂数据处理场景下的能力短板。该控件针对大数据量渲染做了专门优化,支持冻结行列、自定义列宽行高、多样式单元格、高级排序过滤、原位编辑与查找,还提供可扩展的事件体系,便于实现个性化交互逻辑。压缩包共345个文件,约1.63MB,构成上以pas源码、dfm窗体、dpk组件包和dcu编译单元为核心,附有bmp图标、res资源以及txt说明文档,既可直接安装使用,也可通过源码进行二次开发。目前已有603人参与学习下载。资源内包含组件注册与演示工程文件、示例应用和相关说明,开发者按指引将控件导入Delphi 7组件面板后即可调用,能大幅缩短数据表格功能开发周期,适合需要快速交付高质量数据管理界面、兼顾交互体验与维护效率的桌面项目。
1. Delphi7配dbgridEH 3.6:老项目改表格功能前,先明白这套组件替你干了什么
接手一个用Delphi 7维护多年的进销存项目,最头疼的不是业务逻辑,而是那个只能看不能用的DBGrid。客户提了三个需求:表头要合并、底部要出合计行、某些列要能下拉选择。标准DBGrid一个都实现不了,改第三方控件是唯一出路。dbgridEH 3.6就是为Delphi 7量身定做的那套表格插件:它在DBGrid基础上加了多表头、统计行、下拉列表、树形展开、自动排序等能力,而且不改变原有数据感知模型的用法。如果你也在维护老项目、或者正准备给旧系统升级表格交互,这篇笔记把从下载、编译、安装到替换老DBGrid的完整路径拆开讲一遍,包括那些文档里查不到的坑。
2. dbgridEH 3.6 下载与选版:文件名、目录结构与版本匹配的确认方法
2.1 为什么选 3.6 而不是更高版本
很多人一上来就找最新版,但对Delphi 7来说,dbgridEH的版本选择很讲究。版本太高,组件包内部用了较新语法或引用了新版IDE的单元,反而编译不过。3.6是适配Delphi 7最稳定的一代,网上流传的安装包也大多以这个版本为基准。具体特征可以在文件包里确认:解压后应出现Lib、Source、Docs等目录,并且Lib目录下能看到针对D7命名的子目录或dcu文件。
判断版本是否适合本机的标准只有一个:编译时是否报语法错误。3.6在Delphi 7下编译基本零改动,而4.x往上的版本在Delphi 7上编译普遍会报Unsupported compiler之类的提示。所以如果你的环境锁死在Delphi 7,认准3.6就对了。
2.2 拿到安装包后先核对目录,别急着点安装
下载解压后,先打开顶层目录看看。一个正常的dbgridEH 3.6包应该有这些核心内容:
EHlib/ ├── Lib/ │ ├── D7/ │ ├── D9/ │ └── ... ├── Source/ │ ├── EhLibDbConsts.pas │ ├── DBGridEh.pas │ └── ... ├── Docs/ ├── DclEh.dpk ├── EhLib.dpk └── Readme.txt这段目录结构的意义在于:Lib/D7是给Delphi 7用的预编译dcu目录;Source里是完整的pas源码;根目录的EhLib.dpk是运行期包,DclEh.dpk是设计期包。后面编译安装时,这两个dpk的顺序不能搞反。
核对目录时重点看三处:DBGridEh.pas是否存在、D7目录下是否有DBGridEh.dcu、DclEh.dpk和EhLib.dpk是否同时存在。缺任何一样,后面都会卡在安装环节。
提示:网上下载的压缩包经常被杀毒软件误报,因为里面带有dcu和bpl二进制。只要是从长期维护的控件站下载的,解压后核对文件完整性即可,不必过度担心。
2.3 如何确认版本号确实是 3.6
解压后不要只看文件夹名字,进Source目录打开DBGridEh.pas,文件头部的版本注释一般会写明Version 3.6的字样。另一个方法是在Readme.txt或History.txt里查看更新记录,3.6版本的更新日志末尾时间通常在2004年前后。
如果文件包里连Source都没有,只有编译好的dcu或bpl,这种包不建议使用。没有源码,将来遇到兼容性问题无法自己定位,也意味着发布者在打包时可能改过内部实现。我一般坚持用带Source的完整包,哪怕文件大一点。
2.4 不同发布包的差异:哪些能要,哪些别碰
网上流传的dbgridEH 3.6包大致分三类:原版完整包、绿色编译包、二次封装包。原版完整包的特点是目录结构清晰,有Source、Lib、Docs,安装后使用最省心。绿色编译包只给dcu和bpl,省去编译步骤,但路径一旦不对就会在运行时莫名报错。二次封装包最麻烦,有的加了启动画面、有的改了内部控件名,出了问题社区经验完全对不上。
选择建议是:优先找原版完整包。判断方法很简单,看压缩包内是否有DclEh.dpk和EhLib.dpk这两个文件,并且Source目录是否完整。缺少任何一个,后面排错都会很痛苦。
3. 编译安装并接到Delphi7:两个包、三步路径、一处组件面板
3.1 先把运行期包编译出来:EhLib.dpk 的编译顺序不能错
dbgridEH 3.6的安装分两步:先编译运行期包EhLib.dpk,再编译设计期包DclEh.dpk。顺序反了会直接报找不到DBGridEh单元。原因是设计期包依赖运行期包里的组件代码,运行期包没编译进IDE,设计期包自然找不到类型。
打开Delphi 7,通过File > Open打开根目录下的EhLib.dpk,然后执行编译。编译前先在Project > Options里把Output directory设置为一个统一的输出目录,比如D:\DelphiLib\Bpl。这样后续bpl、dcp、dcu文件不会散落在控件目录里,IDE加载时也好管理。
// EhLib.dpk 打开后,在 Delphi 7 的 Project Manager 窗口 // 右键该包,选择 Compile // 观察 Output 窗口,确认没有 Error 提示编译通过后,输出目录会出现EhLib.bpl、EhLib.dcp和对应的dcu文件。这三个文件缺一不可:bpl是运行期组件库,dcp是包编译接口描述,dcu是单元编译产物。编译这一步如果报了找不到某某单元的错,先检查第2章的目录核对是否完成,再看Tools > Environment Options > Library > Library Path有没有把Source目录加进去。
3.2 再把设计期包装上:DclEh.dpk 与组件面板注册
运行期包编译通过后,继续打开DclEh.dpk,同样先编译,然后执行Install。Delphi 7会在Install Packages对话框里列出这个设计期包,点击OK后,组件面板上就会出现EhLib相关的组件页。
// DclEh.dpk 编译完成后 // 在 Project Manager 中右键选择 Install // 成功后 Delphi 7 提示 "Package DclEh.bpl installed" // 组件面板出现新的组件页,页内包含 DBGridEh、DBLookupComboboxEh 等控件安装成功后,在窗体上拖一个DBGridEh出来,如果能正常显示网格控件并且属性编辑器里有Footer、Title相关属性,说明安装成功。如果拖出来报Class TDBGridEh not found,说明设计期包没有真正加载,回到Component > Install Packages里手动勾选DclEh.bpl。
注意:Delphi 7 的 IDE 对包的缓存比较敏感。安装完如果组件面板没刷新,先关掉 Delphi 7 再重新打开,不要指望它热更新。
3.3 Library 路径配置:三个目录缺一不可
Tools > Environment Options > Library > Library Path在Library Path里追加三个目录,用分号分隔:
D:\DelphiLib\Source;D:\DelphiLib\Bpl;D:\DelphiLib\DcuSource目录放的是DBGridEh.pas等源码,编译工程时IDE需要在这里找单元文件。Bpl目录放的是编译好的运行期包,工程运行时需要在这里加载bpl。Dcu目录放的是dcu文件,链接时用。三个目录如果少了任何一个,都会出现编译报错或运行时找不到包的问题。
配好路径后,新建一个工程,在窗体上放DBGridEh,连接一个DataSource和Dataset,运行起来看数据是否能正常显示。此时DBGridEh的处理逻辑和普通DBGrid基本一致:DataSource属性指向数据源,Columns里维护列定义。跑通了这一小步,后面替换老控件就只是复制粘贴的事。
3.4 用命令行的方式批量编译(可选)
如果以后要反复在新机器上搭建环境,不想到处点鼠标,可以用批处理方式调用Delphi 7的dcc32.exe完成编译:
@echo off set DELPHI_PATH=C:\Program Files\Borland\Delphi7 set LIB_PATH=D:\DelphiLib %DELPHI_PATH%\Bin\dcc32.exe -B %LIB_PATH%\EhLib.dpk -U%LIB_PATH%\Source -N%LIB_PATH%\Dcu -E%LIB_PATH%\Bpl %DELPHI_PATH%\Bin\dcc32.exe -B %LIB_PATH%\DclEh.dpk -U%LIB_PATH%\Source -N%LIB_PATH%\Dcu -E%LIB_PATH%\Bpl这段脚本里,-B表示全量编译,-U指定单元搜索路径,-N指定dcu输出目录,-E指定bpl输出目录。设计期包DclEh.dpk比运行期包EhLib.dpk多一个Make的动作,所以批处理里只需在编译DclEh后进入IDE手动点安装。这样做的价值在于:新机器装环境时,双击一下脚本就能把编译产物准备齐,剩下进IDE点Install那一下就够了。
4. dbgridEH 3.6 安装与运行避坑:五个高频报错和对应处理
4.1 编译 DclEh 时报找不到 DBGridEh 单元
现象:打开DclEh.dpk点Compile,报错信息类似File not found: DBGridEh.dcu。
原因:运行期包EhLib.dpk还没编译,或者编译产物路径没进Library Path。设计期包引用了运行期包的单元,找不到就报错。
解决:先回头确认EhLib.dpk是否编译通过,并确认EhLib.dcu文件和它的路径在Tools > Environment Options > Library > Library Path里。我遇到过最隐蔽的情况是EhLib.dcu编译到了别的目录,被手工改路径改乱了。稳妥做法是把三个输出目录统一成一个,避免分家。
4.2 安装 DclEh 后组件面板上没看到新页
现象:Install提示成功,但组件面板上没有EhLib组件页。
原因:设计期包安装到了IDE,但组件页名称被合并到了已有页,或者DclEh的组件注册过程没生效。
解决:在组件面板上右键,选择Properties,在Pages列表里看看有没有一个叫EhLib的组件页,没有的话尝试新建一个页并把组件过滤到该页。还有一个常见情况:Delphi 7开着多个设计期包时,新装的包被临时放到了Active页。关掉Delphi 7重新打开,一般会恢复到正常显示。
4.3 运行期报 cannot load package(无法加载包)
现象:程序跑起来后,启动时报Cannot load package ... EhLib.bpl。
原因:bpl文件没有放在系统搜索路径或应用同目录下。设计期安装成功只代表IDE能加载,发布到客户机器时bpl也必须可访问。
解决:把EhLib.bpl放到C:\Windows\System32或应用exe同目录。老项目发布一般用Inno Setup打包,把bpl放进程序目录就没问题了。还有一种情况是bpl依赖了其他包,比如Vcl.bpl版本不对。这时候用Depends工具查看bpl依赖比盲目拷文件更有效。
4.4 打开老窗体报 Class TDBGridEh not found
现象:从旧项目迁移,打开一个已经放好DBGridEh的窗体(dfm),IDE弹窗报Class TDBGridEh not found。
原因:这个窗体的dfm里写了object DBGridEh1: TDBGridEh,但当前IDE环境里没有安装包含该类的设计期包,所以无法反序列化。
解决:确认设计期包DclEh.bpl已安装。如果已安装仍报错,检查Component > Install Packages里DclEh.bpl前面的勾是否被去掉。Delphi 7的包管理不太稳定,勾选的包有时会意外丢失,重新勾选后关闭并重开IDE,问题就消失了。
4.5 中文列标题显示乱码
现象:DBGridEh的Columns里直接把标题写成中文,运行时表头显示乱码。
原因:多半是dfm文件保存时用了非UTF编码,或者控件内部对字符集的默认处理把中文按ANSI解析了。dbgridEH 3.6是早期组件,对多字节编码的支持不如现代控件全面。
解决:如果整个工程的dfm里中文都乱,把dfm另存为UTF-8格式。Delphi 7的IDE对UTF-8 dfm支持不完美,更常见的做法是在FormCreate里动态赋列标题:
procedure TForm1.FormCreate(Sender: TObject); begin DBGridEh1.Columns[0].Title.Caption := '客户名称'; DBGridEh1.Columns[1].Title.Caption := '订单金额'; end;用代码赋值绕开dfm编码问题以后,编译发布时中文就稳定了。这条经验在中文老项目里几乎必踩,早改用代码赋标题早省心。
5. 把老DBGrid替换成dbgridEH:快速迁移与三个常用效果的属性配置
5.1 最小替换步骤:改类名、改属性、跑通数据
最直接的做法是在dfm里把TDBGrid替换为TDBGridEh,然后重开IDE。但dfm文件直接动手改容易出格式问题,我一般推荐在IDE里操作:删掉旧的DBGrid,拖一个新的DBGridEh,把DataSource属性指向原来的数据源,再把Columns按原样重建。听起来繁琐,但实际项目里列不多的话,5分钟就能完成。
替换后先不急着加效果,保证网格能把数据正常显示出来。如果原来用了DBGrid的OnDrawColumnCell事件来自定义绘制,注意DBGridEh也保留了这个事件,名称一致,直接把事件处理函数挂上即可,内部参数类型TColumnEh和原来的TColumn不同,需要小改一下代码。
// 替换后最小可运行示例 DBGridEh1.DataSource := DataSource1; DBGridEh1.Columns.Clear; DBGridEh1.Columns.Add.FieldName := 'CustomerName'; DBGridEh1.Columns.Add.FieldName := 'OrderAmount'; DBGridEh1.Columns[0].Title.Caption := '客户名称';这段代码的作用是把DBGridEh1绑定到已有数据源上,通过代码重建两列并指定列标题。参数说明:FieldName对应数据集里的字段名,Title.Caption是运行时赋的标题文字,优先级高于dfm里存的值。
5.2 底部统计行(Footer)三个常用配置
DBGridEh最吸引老项目的一个特性是自带统计行。这个功能用标准的DBGrid实现需要自己绘图,而DBGridEh只需设置Footer的ValueType即可:
DBGridEh1.FooterRowCount := 1; DBGridEh1.Columns[1].Footer.ValueType := fvtSum; DBGridEh1.Columns[1].Footer.FieldName := 'OrderAmount'; DBGridEh1.Columns[1].Footer.DisplayText := '合计';第一行开启底部统计行,第二行指定按OrderAmount求和,第三行确认求和字段,第四行是显示在合计行前的文字。注意fvtSum是预定义聚合类型,只有数值字段才能正确求和,文本字段要改用fvtCount做计数。
5.3 多表头合并的配置
多表头是另一个高频需求。DBGridEh支持把两列合并为一个父表头,典型场景是出入库单据里“数量”和“金额”都挂在“明细”下:
| 明细 | 金额 | 数量 |
|---|---|---|
| 货物A | 100 | 2 |
DBGridEh1.Columns[0].Title.Parent := DBGridEh1.Columns[1].Title; DBGridEh1.Columns[1].Title.Parent := DBGridEh1.Columns[1].Title;第二行和第三行把前两列的标题挂到第二列标题下面。这个配置有一个隐含约束:父标题列必须是合并列中可见的那一列。项目里如果父标题列被设置为不可见,合并效果会直接消失。
5.4 替换后第一时间验证的三个点
替换完不能只看表格能显示数据就宣告完成。我的习惯是依次验证排序、增删改、打印预览三件事。DBGridEh默认支持点击表头排序,如果原项目里对DBGrid的OnTitleClick事件有自定义逻辑,需要把旧的排序代码删掉,避免双重触发。增删改的重点是DBGridEh在ReadOnly模式下是否会误触发编辑框,属性面板里把Options中的dgEditing去掉即可。打印这块则是老项目的重头戏,DBGridEh自带DBGridEhExport单元可以导出到Excel或文本,但3.6版本对Excel格式支持有限,导出前先确认客户机器上是否装了对应版本的Excel,否则导出过程会白屏。
这套替换流程我在几个维护项目里反复用过,核心逻辑就是:先跑通数据显示,再逐个开效果,每个效果验证完再接下一个。别一次把所有属性都配上,出了错都不知道是哪行配置引起的。dbgridEH 3.6虽然老,但胜在稳定,只要不触碰编码和包依赖的雷区,它在Delphi 7上能比很多新控件更省心。希望帮到你。
本文还有配套的精品资源,点击获取