ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Delphi 12.3下Ehlib控件包安装与DBGridEh实战指南

Delphi 12.3下Ehlib控件包安装与DBGridEh实战指南 简介这是针对 Delphi 12.3 开发环境的 EhLib 控件安装包版本标记为 111015供桌面应用开发者解决数据表格、数据感知控件及界面打印等常见需求。包体共 2000 个文件压缩前容量约 32.7MB以 469 个 pas 源码文件、470 个 dfm 窗体资源、245 个 res 编译资源为基础辅以 dproj/dpk 工程与包定义文件、ico/png 图标素材以及 CHM/HTML 帮助文档能覆盖控件源码查看、安装编译、手册查阅等多个使用环节。压缩包内还含有示例项目、配置文件与少量数据库文件便于在实际项目中验证控件行为并展开二次开发。已有 60 人学习下载适合熟悉 Object Pascal 语法、希望拓展原生 Delphi 组件库的中高级开发者也可作为团队内部统一控件版本的参考材料。1. 为什么是 EhlibDelphi 12.3 下最顺手的网格增强控件做数据库桌面应用的人十个有九个绕不开 Ehlib。Delphi 自带的 DBGrid 只能算毛坯点列头排序要自己拦截 OnTitleClick底部合计要自己 OnDrawColumnCell 画线导出 Excel 更是要把 OLE 对象一个个伺候明白。Ehlib 这个控件包就是干这个的它的 DBGridEh 把排序、合计、多表头、下拉过滤、导出 Excel 全部做成了属性打开就能用。这篇要拆的资源是标称 Delphi 12.3 可用的 Ehlib 111015 包里面带着完整源码、帮助文档和示例工程不是那种丢一个 bpl 就让你全盘信任的散装件。适合正在用 RAD Studio 12.3 维护进销存、MIS、ERP 这类 VCL 数据库项目的开发者想省掉网格控件的轮子这一份就能顶上。2. Ehlib 111015 包体识别从文件清单看它到底给了你什么拿到一个 rar 先别急着解压双击在资源管理器里先看一遍压缩包内部的清单能少走很多弯路。这个包的文件清单不算长但信息密度很高帮助文档、CBuilder 示例工程、位图资源三样全占齐了。我习惯把这些文件分成三组理解安装前先搞明白每组是干什么的后面编译和排错才不会抓瞎。先放一张完整清单表文件名类型作用EhLibHelp.chm帮助文档Ehlib 属性、事件、方法离线手册EHLIB.CNT帮助索引WinHelp 目录辅助 chm 导航Project1.bpr工程文件CBuilder 示例工程Project1.cpp源码CBuilder 示例主程序Project2.cfg配置工程编译器配置ViewSourceBIN.bmp位图示例界面截图或图标NetworkWorkgroupTrans.bmp位图网络工作组示意插图tutorial2.bmp位图教程配图delphixe.bmp位图Delphi XE 相关标识图2.1 帮助文档组合EhLibHelp.chm 与 EHLIB.CNT 如何配合使用包里的 EhLibHelp.chm 是 Ehlib 的离线帮助覆盖每个属性、事件、方法的说明。chm 是老牌编译帮助格式双击就能打开Windows 10 和 11 都能直接看。第一次用 Ehlib 的人最容易忽略旁边的 EHLIB.CNT它是老式 WinHelp 的目录索引文件单独打开没有意义需要在 chm 左侧目录里导航。如果 chm 打开后左侧目录空白多半是 Windows 安全策略拦截了 chm 的脚本解决办法是在文件属性里勾选“解除锁定”。这个细节我后面会再提到。真正查资料的时候我一般会先看 chm 里的 “Getting Started” 章节里面有一页 “How to install” 写得比很多博客都清楚。2.2 Project1.bpr、Project1.cpp 与 Project2.cfgCBuilder 示例工程的信号bpr 是 Borland project 的缩写Project1.bpr 属于 CBuilder 旧版工程文件Project1.cpp 是它的主源码Project2.cfg 是编译器配置。这三个文件出现在 Ehlib 包里说明这个压缩包不是纯粹的 Delphi-only 资源它附带了 CBuilder 的调用示例。对于只在 Delphi 12.3 里用的朋友这几个文件可以先不管但它们是包体完整性的一部分至少证明发布方把示例和源码做在一起不是随手丢个 dcu 了事。如果以后有 CBuilder 的同事一起协作这些示例就能直接参考。2.3 位图文件与构建日期从 delphixe.bmp 和 111015 反推兼容策略ViewSourceBIN.bmp、NetworkWorkgroupTrans.bmp、tutorial2.bmp、delphixe.bmp 这四个位图是 Ehlib 自带的图标和示例插图。delphixe.bmp 这个名字很有年代感Delphi XE 是 2010 年底的产品说明这份 Ehlib 的原始构建大概率基于 XE 时代。配合包名里的 111015这是典型的日期戳命名按 Ehlib 社区的习惯指 2011 年 10 月 15 日前后发布的构建。这个判断直接影响安装策略拿一个 2011 年构建的控件包装到 Delphi 12.3不要指望双击安装程序就能用正确的做法是把源码拿过来重新编译。Ehlib 的核心源码在 Common 目录里Delphi 编译器对源码的兼容性比二进制 bpl 好得多只要没有引用已废弃的 API重新编译通常能过。如果包里有预编译的 bpl也建议忽略掉别用它面向的是当年的 IDE。另外Ehlib 是 VCL 控件库FireMonkey 是另一套完全不同的 UI 框架它不参与 FMX 跨平台体系所以如果你在找 delphi 12 firemonkey 源码里能用的网格控件这个包帮不上忙。2.4 为什么不用预编译 bpl源码包的优势与风险这个 rar 的核心价值在于它是源码包不是编译后的 bpl。源码包意味着你可以用 Delphi 12.3 的编译器重新构建一份当前 IDE 能识别的二进制也能在源码里看实现细节。坏处是安装门槛高前置要懂包编译。如果你遇到一个 Ehlib 版本解压后只有 bpl 和 dcu没有 dpk 和 pas那基本只能丢弃或者要求对方提供对应 IDE 版本的包。而这份包有 Common 目录的源码才值得下载。3. 把 Ehlib 装进 Delphi 12.3从 dpk 编译到组件面板出现安装第三方控件是每个 Delphi 开发者的必修课但 Ehlib 这课比一般控件复杂一点因为它是源码包不是安装程序。整个过程可以拆成三部分解压整理、编译核心包、安装设计时包。只要顺序对了十分钟能搞定顺序乱了经常出现装完找不到控件或者编译报内存错误。3.1 解压与目录整理先干掉中文路径和空格很多人在这一步翻车。Ehlib 源码里的 .dpk 文件在编译过程中会生成大量 .dcuIDE 的绝对路径如果包含中文、空格或杀毒软件监控目录编译时经常报“路径太长”或者“无法创建输出文件”。我一般先把 rar 解压到纯英文路径比如 D:\Components\EhLib111015不要放在桌面更不要放在“新建文件夹2”这种目录。解压后先看一眼目录结构Ehlib 包的常见布局是 Common 放核心源码Delphi 或 RADStudio 目录下按 IDE 版本分文件夹放各个 .dpk 包。提示解压后如果某个文件被杀毒软件报毒先别急着删Ehlib 的安装辅助程序偶尔会被误报。但也不要轻易加入白名单先对比文件是否与包内清单一致。3.2 找对 dpk不同 IDE 版本目录与包命名规则Ehlib 从早期版本开始就按编译器版本组织包文件。解压后你应该能看到 D6、D7、D10、D11 这类目录分别对应 Delphi 6、7、10、11。111015 这个构建的年代最接近的目录应该是 D10Delphi XE或者 D11XE2。装到 Delphi 12.3 时我一般先找 D12 或 DXE12 目录如果没有就选最靠后的版本目录然后用 Delphi 12.3 打开其中的 EhLib.dpk。还有一种情况是包里有 Install 脚本或者 Readme.txt里面写清楚了支持哪些版本。如果实在找不到匹配目录也可以把 Common 目录里的核心单元手动加进工程但那样拿不到设计时组件只能在代码里手工创建 DBGridEh不推荐新手这么做。找 dpk 的时候注意文件名带 dcl 前缀的是设计时包不带的是运行时包两个都要记住位置后面安装步骤要区分对待。3.3 编译核心运行时包路径配置与命令行编译打开 Delphi 12.3通过 File Open 找到对应目录下的 EhLib.dpk双击打开。IDE 会自动加载这个包工程。在 Project Manager 里右键这个 dpk先选 Compile等 Output 窗口出现 “Build succeeded” 再右键选 Install。Install 之后工具栏的组件面板里会出现一个叫 EhLib 的选项卡里面是 DBGridEh、DBEditEh 等一堆组件。编译前建议在 Project Options 里把 Delphi Compiler Output 的目录设置为完整路径下的 Output 文件夹避免 dcu 污染源码目录。另外EhLib 包编译时会先编译 Common 目录下的核心单元如果 IDE 的 Library Path 没有包含 Common会报“找不到 EhLibDBGrid”之类的错误。所以打开 dpk 前先把 D:\Components\EhLib111015\Common 加到 Tools Options Library Library Path 里。这个顺序很重要先加路径再开包能省掉很多报错。为了提升效率也可以把编译过程写成命令行。Ehlib 的 dpk 用 RAD Studio 自带的 dcc32.exe 编译示例C:\Program Files (x86)\Embarcadero\Studio\23.0\bin\dcc32.exe -B -JP D:\Components\EhLib111015\Delphi\D12\EhLib.dpk说明一下参数-B 是强制全部重建避免旧 dcu 干扰-JP 是编译成包package生成的 bpl 会放在 IDE 的默认输出目录里。路径里的 Studio\23.0 是 Delphi 12.3 对应的 RAD Studio 版本号如果你装的是别的 Update要按实际的 Version 目录修正。命令行编译完再手动到 IDE 里 Install 设计时包。注意命令里的路径要用你实际的 Ehlib 解压路径别照抄。3.4 安装设计时包并验证组件面板刚才说过了运行时包和设计时包要分开。如果只有一个包右键只有 Compile 没有 Install那就去打开 dcl 开头的设计时包重新编译然后 Install。设计时包安装成功后组件面板会自动新增一个 EhLib 选项卡。我一般会在这个选项卡里找 DBGridEh只要能拖到 Form 上安装就算成功了一大半。拖上去之后还要检查一点Object Inspector 的属性列表是否完整。正常打开一个 DBGridEh属性区能看到 FooterRowCount、STFilter 这些 Ehlib 专属属性。如果属性不齐说明设计时包没加载干净先重启 IDE 再看。验证到这一步就可以进入下一章的实战环节了。4. DBGridEh 实战排序、合计与导出 Excel 三个高频功能Ehlib 的组件有几十个但日常项目里高频使用的核心其实是 DBGridEh 和它关联的字段级组件。这一章拿三个场景说话点击列标题排序、底部合计行、导出 Excel。这三个功能覆盖了大多数进销存报表页面的需求也是评价一个网格控件好不好用的硬指标。4.1 点击列标题排序TitleParams 与 SortLocalized自带的 DBGrid 要做点击排序得在 OnTitleClick 里拼 SQL 重新查一遍。DBGridEh 不一样它自带排序逻辑只需要设置两个地方把某个列的 Title 的 SortMarker 设为 smUpDownEh再把 DBGridEh 的 SortLocalized 设为 True。前者让列标题右侧出现排序箭头后者让排序走本地化比较算法这样中文文本排序时才不会出现拼音和 Unicode 码点错乱的问题。示例代码在 FormShow 里设置procedure TForm1.FormCreate(Sender: TObject); begin DBGridEh1.SortLocalized : True; DBGridEh1.Columns[0].Title.SortMarker : smUpDownEh; // 允许升降序 DBGridEh1.Columns[1].Title.SortMarker : smDownEh; // 默认降序 end;这里有两层含义SortLocalized 是 DBGridEh 级别的开关告诉控件在所有列排序时都用系统的 Locale 比较函数SortMarker 是列级属性它表明这个列允许排序并显示箭头取值可以为 smNoneEh、smUpEh、smDownEh、smUpDownEh分别表示不允许排序、升序、降序、可升降序。实际排序发生在用户点击标题时控件会直接对数据集做内存排序不需要重新查询数据库。如果数据集是 ClientDataSet可以配合 IndexFieldNames 提高大表排序效率。注意如果数据集是 SQL 服务器返回的内存排序只对当前已加载的数据有效。十万行以上的数据建议还是在 SQL 端做 ORDER BY再在 DBGridEh 的 Title.OnTitleClick 里触发重新查询而不是用默认内存排序。还有一处常见误用把 SortMarker 设为 smUpDownEh 就以为能排序实际上当 SortLocalized 为 False 时字符串列按二进制码点排中文效果不对所以两个属性要配套。4.2 底部合计行FooterRowCount 与 Footer 字段报表页面常见的“总计”行DBGridEh 用两个属性就做完了。把 DBGridEh 的 FooterRowCount 设为 1表格底部会出现一条合计区。然后对某个列设置 Footer.Value 为总和表达式例如统计数量列DBGridEh1.FooterRowCount : 1; DBGridEh1.Columns[4].Footer.Value : SUM; DBGridEh1.Columns[4].Footer.FieldName : Quantity;说明一下FooterRowCount 控制底部合计行数0 表示不显示Footer.Value 是合计方式常用值有 SUM、COUNT、AVG、MAX、MINFooter.FieldName 指定要对哪个字段做合计。Ehlib 内部遍历当前可见数据计算合计值你在界面上就能看到汇总结果。如果要显示“合计”这种前缀文字把 Footer 的 Caption 属性配上就行。需要注意合计行默认不回写数据集它只是在网格视图层做的聚合不会影响底层数据。这三个参数在设计期也能直接配置打开 DBGridEh 的 Columns 编辑器选中列后在 Footer 子属性里填 Value 和 FieldName。代码设置适合动态生成的列。Value 里的函数名不区分大小写但拼写必须对写 SUM 写成 SUN 不会报错只是不计算这种运行时才发现的错误最坑。4.3 导出 ExcelSaveDBGridEhToExportFile 的参数与中文列名老项目里导出 Excel 大多是 OLE 操作代码又长又容易闪崩。Ehlib 自带导出工具类用一行就能把 DBGridEh 内容存成 Exceluses EhLibMTE, DBGridEhImpExp; SaveDBGridEhToExportFile( DBGridEh1, D:\Export\报表- FormatDateTime(yyyymmdd, Now) .xls, True);SaveDBGridEhToExportFile 是 Ehlib 提供的全局函数第一个参数是 DBGridEh 实例第二个参数是输出路径第三个参数为 True 表示导出结束后自动用系统关联程序打开文件。函数内部会根据扩展名自动选择导出器。注意这里的 .xls 并不是真正的 Excel 二进制而是 Ehlib 生成的 HTML 表格文件Excel 能打开但不纯正。如果需要真正的 xlsx要用另一个函数 SaveDBGridEhToXLSX这个函数也在 EhLibMTE 单元里。导出前有几个坑要提前避开。列标题要设好Ehlib 默认取 Column.Title.Caption如果 Caption 为空就取 FieldName所以中文列名要在设计期把每列的 Title.Caption 填好。其次是隐藏列DBGridEh 能正常显示隐藏列但导出时不想导出的列要把 Visible 设为 False。最后是数值精度导出时 Ehlib 按 DisplayFormat 输出DisplayFormat 没配的话会输出原始值金额小数位可能对不上。4.4 下拉过滤DropdownFilter 让用户自己缩小范围这个功能适合列表容量比较大的查询界面。设置 DBGridEh 的 STFilter 属性下的 Location 为 stflInTitleFilter列标题下方会多出一行支持下拉选择和输入过滤。这个功能跟 Excel 的筛选很像但要注意它默认是在内存中过滤绑定 SQL 数据集时需要配合 OnFilterRecord 或者回到服务端查询否则数据量大了会卡。适合中小规模数据集比如几千行的基础资料表体验很好。5. 避坑Ehlib 在 Delphi 12.3 下编译与运行的 5 个常见问题第三方控件装不上的原因就那么几个Ehlib 尤其典型。我把这些年见过的高频问题整理成五条每一条都是现象、原因、解决三步照着排查能省下半天。5.1 编译到一半报内存错误现象用 Delphi 12.3 编译 EhLib.dpk 时IDE 弹出 “Out of memory” 或者 “Access violation at address...”有时候是编译进程直接崩溃。最近不少朋友反馈 delphi 编译程序报内存错误Ehlib 也不例外。原因最常见的是同时加载了多个版本的 Ehlib 包IDE 的 BPL 目录里残留了旧版 dclEhLib.bpl新老包的单元名和包名冲突导致编译器在加载单元时循环引用。也有一部分是杀毒软件实时扫描编译目录造成的资源占用。解决先从 Delphi 12.3 的 Component Install Packages 里移除所有带 EhLib 的包然后在 C:\Users\Public\Documents\Embarcadero\Studio\23.0\Bpl 和 Dcu 目录里搜一遍把 EhLib*.bpl、dclEhLib*.bpl、EhLib*.dcu 全部清理掉。再把源码目录里残留的 dcu 也删干净重新编译。如果还报错把杀毒软件的实时防护临时关掉编译完成后再开。5.2 安装后组件面板里找不到 DBGridEh现象dpk 编译成功Install 也点了组件面板没有任何新增选项卡。原因八成是只开了运行时包没开设计时包。Ehlib 的运行时包只提供功能代码控件不会出现在面板上设计时包才能注册组件。还有一成原因是 IDE 缓存新装的包没有刷新到组件列表。解决在 Project Manager 里确认当前打开的是不是 dclEhLib.dpk名字里带 dcl 前缀的才是设计时包。如果打开的是 EhLib.dpk右键菜单里只有 Compile 没有 Install那就去 File Open 重新打开 dclEhLib.dpk再走一遍 Compile Install。装完后如果面板没刷新重启一下 IDE 就出来了。5.3 64 位目标平台编译失败现象默认 32 位 Windows 平台编译运行正常切换到 Win64 平台后链接报找不到某些 dcu或者界面出现中文乱码。原因Ehlib 111015 年代的包源码里大量使用了 PChar 和字符串转换64 位下指针宽度变化部分旧代码对字符串类型的处理会做显式转换有些写法在 64 位编译器下被判定为不兼容。另外如果 dpk 的输出路径没有按平台分目录32 位和 64 位的 dcu 会相互覆盖。解决先在 Project Options 里把 Output directory 设置为 .$(Platform)$(Config)让不同平台产物分开。然后到 Project Manager 里把 Win64 加为目标平台重新编译 Ehlib 的运行时包和设计时包。只要源码能编译通过64 位运行不会有问题。5.4 导出 Excel 中文乱码或列名变成字段名现象用 SaveDBGridEhToExportFile 导出的文件打开以后数字和英文正常但中文列名全是问号或者列头显示成数据库字段名。原因第一层是列标题没设置Column.Title.Caption 为空时导出器就退回到 FieldName第二层是字符集问题旧版导出器默认按 ANSI 写文件Windows 中文系统下偶尔会乱码。解决设计期逐列把 Title.Caption 填成中文别依赖字段名。代码里导出前统一检查var I: Integer; begin for I : 0 to DBGridEh1.Columns.Count - 1 do if DBGridEh1.Columns[I].Title.Caption then DBGridEh1.Columns[I].Title.Caption : DBGridEh1.Columns[I].FieldName; end;这段代码在导出前统一把没有 Caption 的列用 FieldName 顶上至少保证列名不是空。真正的乱码问题建议改用 SaveDBGridEhToXLSX 导出真正的 xlsx 格式xlsx 内部是 UTF-8基本告别中文乱码。5.5 在 FireMonkey 工程里找不到 Ehlib 组件现象新建工程时选了 Multi-Device Application在组件面板找不到 EhLib 相关组件。原因Ehlib 是 VCL 控件库FireMonkey 是另一套完全不同的 UI 框架。Ehlib 的组件设计目标就是 Windows 下的 VCL 应用不参与 FMX 跨平台体系。很多人在 delphi 12 firemonkey 源码里找 Ehlib方向就错了。解决如果做 Windows 桌面数据库应用新建工程时选 VCL Forms Application不要选 Multi-Device。如果必须用 FMX需要找 Ehlib 官方推出的 FireMonkey 版本包名带 FMX 标识但 111015 这个年代包没有别在这上面浪费时间。6. 装完 Ehlib 后先跑一遍最小验证让 DBGridEh 在 5 分钟内自证可用安装和避坑都讲完最后分享一个我一直在用的验证习惯。不管装哪个版本的 Ehlib我都不会直接往大项目里引而是先建一个最小 VCL 工程把排序、合计、导出三个功能各验证一遍。这套流程五分钟能跑完但能挡住八成的“装好了但用起来出怪事”。新建 VCL Forms 工程放一个 DBGridEh、一个 DataSource、一个 ClientDataSet再加一个 Button。FormShow 里写入测试数据procedure TForm1.FormShow(Sender: TObject); begin ClientDataSet1.Close; ClientDataSet1.CreateDataSet; ClientDataSet1.AppendRecord([A01, 记事本, 100, 10.5]); ClientDataSet1.AppendRecord([A02, 签字笔, 200, 1.2]); ClientDataSet1.AppendRecord([A03, 文件夹, 150, 2.8]); DBGridEh1.DataSource : DataSource1; DBGridEh1.Columns[0].Title.Caption : 编号; DBGridEh1.Columns[1].Title.Caption : 品名; DBGridEh1.SortLocalized : True; end;这段代码同时验证了数据集绑定、列标题设置、内存排序开关。运行后点列头能排序说明 DBGridEh 的核心链路通了。接着在 ButtonClick 里调一次导出DBGridEh1.FooterRowCount : 1; DBGridEh1.Columns[2].Footer.Value : SUM; SaveDBGridEhToExportFile(DBGridEh1, D:\test.xls, False);能弹出总数、能生成文件这台机器上的 Ehlib 就算真正能用了。这个验证工程我还会顺手另存成模板文件名叫 EhLib_SmokeTest.dpr以后换电脑重装环境直接打开模板改数据集就行。从第一次被 Ehlib 的“装好了但 Grid 不出数据”折腾过之后我每次装完第三方控件都强制走一遍最小工程验证组件能拖、数据能跑、导出能出文件才算数。这个习惯帮我挡掉了很多半天找不到头绪的问题希望帮到你。本文还有配套的精品资源点击获取
返回列表