Delphi7+dbgridEH 3.6:老项目表格升级的安装配置与替换指南
简介面向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_PATHC:\Program Files\Borland\Delphi7 set LIB_PATHD:\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的窗体dfmIDE弹窗报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支持把两列合并为一个父表头典型场景是出入库单据里“数量”和“金额”都挂在“明细”下明细金额数量货物A1002DBGridEh1.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上能比很多新控件更省心。希望帮到你。本文还有配套的精品资源点击获取