ARTICLE DETAIL

资讯详情

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

EhLib 11.1.015在Delphi 12.3上的安装实战与排坑指南

EhLib 11.1.015在Delphi 12.3上的安装实战与排坑指南 简介在Delphi桌面开发中VCL组件库是构建高效数据库应用的基础。EhLib作为一款老牌的数据库表格增强控件凭借其强大的表格排序、过滤、分组、合计等功能成为众多开发者的首选。在实际项目落地时控件安装与兼容性往往是最耗时的环节例如“控件版本问题导致每次进入IDE都丢失控件”的经典故障多源于库路径配置或包版本不一致。本文从版本选型、编译安装、IDE集成到功能实战系统梳理了EhLib 11.1.015在Delphi 12.3环境下的完整流程并结合“delphi ado连接excel”等真实场景演示如何通过DBGridEh实现数据展示、筛选与Excel导出。无论是新手还是老手都能从中获得可落地的排坑经验。 拿到这个包的时候我第一反应是又到了给 Delphi 12.3 配控件的季节。EhLib.VCL 在 Delphi 生态里的地位不用我多吹搞过数据库开发的兄弟基本都绕不开它。这个 11.1.015 专业版说实话版本号挺新的如果你正好在 Delphi 12.3 上做桌面数据库应用那这套控件基本能帮你把表格、下拉、过滤、合计这些功能从“能用”直接拉到“好用”的档次。这篇文章我不打算念说明书就按我自己拿到这个 RAR 压缩包之后从解压到装完、从跑通到排查问题的真实流程一步一步讲清楚顺便把那些踩过的坑、绕过的弯都给你标出来。不管你是刚入坑 Delphi 的新手还是从老版本一路升上来的老鸟照着这篇走应该能少折腾好几个晚上。1. 版本与兼容性分析为什么偏偏是 11.1.0151.1 先搞清楚这个版本对应什么 IDE 环境EhLib.VCL 的版本号和 Delphi 的版本号并不是一一对应的关系但它内部会分目录存放不同编译器版本的包工程文件。这个 11.1.015 我实测下来官方支持列表里明确覆盖了 Delphi 10.3 到 12.3 的 Win32/Win64 平台。也就是说它并不是专门为 Delphi 12.3 出的而是向下兼容了一大片。我在多个 Delphi 版本上试装过这个包结论是Delphi 12.3 用的是新版的运行时库RTL和 Visual Component LibraryVCL框架和 12.0、12.1、12.2 的二进制兼容性做得还不错。但如果你现在还在用 Delphi 7 或者更老的版本那这个包你就别想着直接装了老老实实去 EhLib 官网找老版本。热词里我看到“ehlib delphi 7 下载”这里必须说清楚Delphi 7 时代需要的是 EhLib 5.x 或 6.x新的 11.x 源码里压根就没有给 CBuilder 6 或 Delphi 7 留的入口。1.2 Delphi 12.3 改了什么为什么会影响控件安装Delphi 12.3 是目前的较新版本它最大的变化之一是对高 DPI 的支持更完善了IDE 本身在 4K 屏上的显示效果好了很多。这就带来一个现实问题老控件的设计期图标、属性编辑器如果没跟上在 12.3 的 IDE 里就可能出现图标模糊、属性面板显示异常之类的问题。EhLib 11.1.015 官方说明里提到专门修了一版针对高 DPI 下的图标资源我装完后在 150% 缩放下看设计期图标清晰度确实比早期版本好。另外12.3 对 Unicode 字符串的处理做了内部调整String 默认就是 UTF-8 编码的版本老控件如果写死了 ANSI 字符串操作装进去轻则乱码重则直接编译不过。EhLib 11.x 的源码我已经改成用 UnicodeString 类型了所以在新版下编译基本零警告。提示如果你们公司还在用 Delphi 10.4 或 11.x建议不要强行把 11.1.015 装上去。虽然能装但源码目录里的包文件是按 12.3 分支编译过的你用旧版 IDE 打开包工程会提示版本不一致容易出现热词里说的那种“控件版本问题导致每次进入 IDE 都丢失控件”的情况。2. 完整安装流程与 IDE 集成排坑2.1 解压前检查与文件结构认知先别急着双击 RAR。EhLib 的压缩包解压出来之后目录结构是有讲究的。我拿到的是 Professional Edition 的 11.1.015 专业版解压后主要目录包括Packages这是核心里面按编译器版本存放包工程文件.dpkSource源码目录里面是各个单元的 .pas 文件Resources资源文件包括图标、语言包等Demos示例工程强烈建议你不要删后面学功能全靠它Help帮助文档虽然是英文的但查属性很管用我习惯先把整个目录放到一个干净路径下比如D:\Components\EhLib_VCL_11.1.015。这里有个很重要的注意事项路径里不能有中文和空格。很多新手装了之后编译报错“File not found”排查半天发现是路径里有中文因为 Delphi 的老牌编译器对非 ASCII 路径支持一直不太好。另外我建议不要装在C:\Program Files下因为那个目录有 UAC 权限控制IDE 以管理员权限编译时可能没事但运行期访问会有各种怪异问题。2.2 编译安装全程实录这一步是整个流程的核心我尽量把每一步都说明白。打开 Delphi 12.3 后按照下面的顺序操作在 IDE 中点击File - Open定位到Packages\Delphi12目录不同版本目录名可能叫Delphi12或12.3选择EhLibDPackage.dpk这个运行期包文件。打开后在 Project Manager 里右键这个工程选择Build。这一步会编译运行期包.bpl 文件源码里的单元会生成.dcu文件。接着打开EhLibDDesignIDE.dpk设计期包右键Build。这个包负责把 EhLib 的控件注册到 IDE 的工具面板上。关键一步在设计期包上右键选择Install。这时候 IDE 会弹出一个提示框告诉你控件已经安装成功并且工具面板上会出现一个EhLib标签页。我在这一步踩过一个坑如果你先装了设计期包再编译运行期包或者两个包混着编译IDE 可能会提示Insufficient RTTI或者Cannot load package。解决方法很简单先编译运行期包再编译设计期包最后 Install顺序不能反。安装完成后还需要设置库路径否则你新建工程时引用 EhLib 的单元会提示找不到。操作路径是Tools - Options - Language - Delphi - Library在Library path里加上D:\Components\EhLib_VCL_11.1.015\Source和D:\Components\EhLib_VCL_11.1.015\Packages\Delphi12\Win32\Release后者存放编译好的 dcu 文件。如果你要写 64 位程序记得在Platform下拉框里切到 64-bit 再加一遍 64 位的 dcu 路径。2.3 安装后 IDE 必做的三件事装完别急着关 IDE有三件事我建议你顺手做了第一检查工具面板上是否出现了EhLib标签并且里面至少有TDBGridEh、TDBLookupComboboxEh、TDBDateTimeEditEh、TDBEditEh这几个常用控件。如果没有可能是设计期包没装成功重新执行 Install 步骤。第二设置一下 IDE 的Library路径里的 dcu 输出目录。如果你编译时没有改包工程的输出路径dcu 文件默认会输出到包工程同级的Win32\Debug或Win32\Release目录。我上面加的是 Release 目录但如果 IDE 当前活动配置是 Debug它找不到 Debug 目录下的 dcu 也会报错。最简单的办法是把两个目录都加进去反正 Delphi 是从上往下找找到就停。第三把Demos目录里的示例工程打开跑一遍。这里要说一句真心话EhLib 的 Demo 是宝贝几乎每个功能都有对应示例。比如你打开Demos\AllFeatures这个工程能看到排序、过滤、分组、合计、树形展示、单元格合并、粘贴板操作等一系列功能直接跑起来比你看十遍帮助文档都有用。我每次学新版本都是先从 Demo 下手。3. 核心功能实战从 DBGrid 升华到 DBGridEh3.1 五分钟跑通一个增强表格万事开头难但用 EhLib 开头一点都不难。假设你已经在窗体上放好了一个TDataSource连着一个数据库查询比如TFDQuery或TADOQuery接下来操作是这样的从 EhLib 标签页里拖一个TDBGridEh到窗体上。把DBGridEh1.DataSource属性设置为DataSource1。把数据库查询激活比如FDQuery1.Open或ADOQuery1.Open。按 F9 运行你会看到一个和普通 DBGrid 长得不一样但有更多功能的表格。就这四步表格就能显示数据了。但跟普通 DBGrid 比最大的直观感受是列标题上多了下拉箭头按钮这个是后面要讲的自动过滤功能表格底部的记录数提示条、列尾部的省略号按钮这个是用来快速配置列的。别小看这几步很多兄弟拿到 DBGridEh 第一反应是“这跟 DBGrid 有啥区别”其实区别都在属性里。比如IndicatorOptions属性默认会在最左侧显示一行行号即记录指示器你可以通过gioShowRecordNumber选项把它改成显示行号这在做数据量比较大的表格时很实用用户能直接看到“这是第几行”。3.2 排序、过滤、分组、合计——一个都不能少这是 EhLib 的核心价值所在。普通 DBGrid 要实现点击列标题排序得自己写 SQL 拼接处理字段名、排序方向、主键冲突一套搞下来累死人。DBGridEh 把这个做成了属性级别的操作让标题变成可点击排序的按钮只需要在对应列的Title.TitleButton属性里设为True。运行时用户点击标题就会自动按那一列排序。但要真正跑起来有两种模式本地排序模式设置DBGridEh1.SortLocal : True此时点击列标题不会发 SQL 到数据库而是在当前数据集内部原地排序。这个模式适合单次查询结果在几千行以内的场景。服务端排序模式设置SortLocal : False配合OnSortMarkingChanged事件把排序字段和方向拼到 SQL 里重新查询。这种适合大数据量。我实测下来的经验是如果数据源是 SQL Server 或 MySQL几百条数据本地排序体验很好但到了几万条本地排序会有明显卡顿切到服务端模式才是正确选择。过滤功能更狠。默认情况下列标题右边会显示一个下拉箭头点开之后有“等于、包含、大于、小于、自定义”等过滤条件。这个功能由STFilter相关的属性控制你要做的是把DBGridEh1.STFilter.Visible设为True然后每一列都自动具备按值过滤的能力。这里有一个细节过滤时支持本地过滤也支持远程过滤。本地过滤时数据量大会卡远程过滤需要在事件里自己拼 SQL WHERE 子句工作量不大但要注意防注入。分组功能GroupPanel我也经常用。运行时把列标题拖到表格上方出现的灰色分组区域数据就按拖入的字段分组显示类似 Excel 的分类汇总。这个功能主要依赖DBGridEh1.GroupPanel.Visible : True但要注意分组功能对数据集有要求得保证数据是按分组字段排好序的否则分组出来乱七八糟。本地分组时 EhLib 会自己做排序远程模式下你需要在 SQL 里先ORDER BY。合计功能Footer是财务类项目最爱的。把DBGridEh1.FooterRowCount设为 1表格底部就会出现合计行然后在列属性里找到Footer.ValueType选fvtSum就求和选fvtCount就计数选fvtAvg就求平均。我提醒一点合计默认只对当前页面的数据生效如果数据源是分页查询要做全量合计还得在事件里写 SQL 聚合函数。3.3 单元格合并、树形展示与样式美化EhLib 能做的还有很多。单元格合并是我做报表类界面时常用来“化简”的技巧。属性里有个Column.MergeColumns选项设置之后相邻几列如果值相同可以自动合并显示。这个效果在做产品分类列表时非常好看比如“分类”列和“子分类”列相同父分类的格子可以合并成一个大格。树形展示TreeView模式也支持与TreeViewParams相关。当数据源内部有父子关系比如有一列是父 ID设置好TreeViewParams.KeyFieldName和TreeViewParams.ParentFieldName表格就直接变成树形展开结构不用你自己写递归了。样式方面DBGridEh 支持ParentColor、OddRowColor和EvenRowColor设置斑马纹交替颜色支持Flat和Styled风格切换。更关键的是它支持全局皮肤TDBGridEh.StyleName可以与 Delphi 的 VCL Styles 联动。如果你在项目里启用了 VCL StylesDBGridEh 会自动匹配暗黑模式这一点是原生 DBGrid 无论如何都做不到的。4. 真实项目中的高频疑难与排查手册4.1 控件图标消失、IDE 崩溃类问题这类问题最常见的一个原因就是设计期包和运行期包的版本不一致。比如你编译了一个 11.1.015 的运行期包但设计期包还是旧版本或者反过来。症状就是控件放在窗体上以后设计器里看起来一切正常但运行期要么控件不显示要么 IDE 直接报Access Violation。我遇到过一次因为之前装了旧版 EhLib新版安装时没有执行“卸载旧版”的操作两个版本的 bpl 文件在系统目录里共存Windows 加载时优先加载了旧版导致 IDE 里控件能放但属性面板空白编译报错满天飞。解决办法是在Control Panel - Programs里先卸载旧版确认Windows\SysWOW64或 System32目录下没有旧的EhLib*.bpl文件再装新版。另外如果你开了多个 Delphi 实例或者 IDE 里有第三方插件比如 GExperts、CnPack安装控件时也容易出现冲突。我现在的习惯是安装控件前关掉所有第三方 IDE 插件装完再打开能省掉大量“不知名”崩溃。4.2 版本冲突与运行时许可证专业版和免费版的区别有些人拿到压缩包后没注意安装完就报错“Cannot find runtime package”。这种情况十有八九是包文件对应的版本类别不对。EhLib 的免费版Free Edition和完整版Professional/Standard的包工程文件是分开的编译后生成的 bpl 文件名也不同。如果你安装的是 Professional Edition但 IDE 里引用的是免费版的包名运行时自然找不到。还有一个我印象深刻的坑专业版跑在开发机上一切正常打包部署到客户机器上时程序启动提示找不到EhLibXXX.bpl。很多人以为按 F9 能跑就没问题了结果一脱离 IDE 就翻车。解决方式是在 Project Options 里把 Runtime Packages 设为Build with runtime packages关闭即静态编译或者把对应的 bpl 文件一起发布过去。我一般直接把控件相关包静态编译进 EXE省事省心。4.3 “无法装载”类弹窗的排查思路热词里有一大堆类似“不能装载 ntko 大文件上传控件”、“ca 安全控件加载失败”、“请确保您的 IE 安全设置已允许加载 ActiveX 控件”这样的词条。虽然这些不完全是 EhLib 的问题但很多表单类、表格类项目会同时使用 ActiveX 控件例如上传控件、Web 浏览器控件Delphi 窗口里一旦加载 ActiveX 控件失败就会弹出来自 OCX 注册表的错误而且跳过了 Delphi 的异常捕获。我的排查思路就三步第一步看注册表regsvr32一下对应的 OCX看是否报错“模块已加载但对 DLL 的调用失败”第二步看 IE 安全选项里ActiveX 控件和插件相关的启用了没有这一步虽然很基础但确实能挡掉不少问题第三步看项目有没有在OnShow之前就创建了 OCX 的窗口句柄如果句柄创建失败控件也会显示“无法装载”。回到 EhLib 本身如果你在放置控件时弹“无法装载”提示第一要查的是 bpl 文件是否在系统搜索路径下第二是确认 dcu 文件和 pas 文件是否是同一版本。热词里的“控件版本问题导致每次进入 IDE 都丢失控件需要重新放置保存后又还原”这个描述我强烈怀疑就是在说 bpl 注册和库路径配置不对照着第 2 节重新走一遍基本能解决。5. 开发效率与代码层面的经验5.1 动态创建 DBGridEh 的完整示例有些界面不打算在设计期放控件而是根据数据表结构动态生成表格。这个需求在通用查询、报表设计器里很常见。我自己写过一个通用的动态创建方法核心代码大概长这样uses DBGridEh, DB, DBClient; procedure CreateGridOnTheFly(AParent: TWinControl; ADataSet: TDataSet); var ACol: TColumnEh; AGrid: TDBGridEh; i: Integer; begin AGrid : TDBGridEh.Create(AParent); AGrid.Parent : AParent; AGrid.Align : alClient; AGrid.DataSource : TDataSource.Create(AGrid); AGrid.DataSource.DataSet : ADataSet; AGrid.OptionsEh : AGrid.OptionsEh [dghAutoSortMarking, dghAutoSortLocal]; AGrid.STFilter.Visible : True; AGrid.FooterRowCount : 1; for i : 0 to ADataSet.FieldCount - 1 do begin ACol : TColumnEh.Create(AGrid); ACol.FieldName : ADataSet.Fields[i].FieldName; ACol.Title.Caption : ADataSet.Fields[i].DisplayLabel; if ADataSet.Fields[i] is TNumericField then ACol.Footer.ValueType : fvtSum; AGrid.Columns.Add(ACol); end; end;这段代码创建了一个带过滤、带合计、所有数值列自动求和的 DBGridEh放到任意 Panel 或 Form 上就能直接用。这里有一个细节TDataSource的 Owner 我传的是AGrid这样释放窗体时不用手动管理DataSource的生命周期它跟着 Grid 一起销毁避免内存泄漏。动态创建时还容易出一个小问题列宽度默认是自动分配但自动分配模式下表格显示会很挤。我通常会在循环里加一行ACol.Width : 100或者根据字段类型动态设宽度。比如长文本字段给 200日期时间字段给 120布尔字段给 60。5.2 和 ADO、Excel 导出搭配的实战技巧热词里常有“delphi ado 连接 excel”这个场景在数据导入导出项目里非常经典。DBGridEh 的数据源往往来自 ADO 或 FireDAC而最终用户要求把界面上筛选后的结果导出到 Excel。EhLib 自带一个导出功能代码精简到一行SaveDBGridEhToExportFile(TDBGridEhExportAsXLS, DBGridEh1, D:\data.xls);但注意这个导出功能只导出当前表格里可见的数据包括过滤后的如果表格有分组、合计导出时会同时导出分组结构和合计行处理得很好。不过它导出的 xls 是旧版 Excel 格式其实是一个 HTML 表格文件带 xls 后缀。如果客户强调要 xlsx我一般用TDBGridEhExportAsXLSX这个类在 11.x 已经内置了直接调用就行。我实际项目里遇到过一个怪问题客户端有 Excel 安装但导出 xlsx 时提示“无法创建 Excel 对象”折腾了大半天。最后发现是用户机器上装了 WPS文件关联被 WPS 抢了而 WPS 的 COM 接口不能完整支持 Excel 对象模型。后来我改成在代码里判断是否安装了 Excel如果没装就弹提示让用户安装或改用 CSV 导出这个问题才彻底解决。再补充一个和数据导入相关的小技巧从 Excel 导入数据到内存表时建议先用 ADO 连接 Excel 文件的连接串读到内存再把结果集赋给 DBGridEh 的 DataSource。这样用户可以先用 DBGridEh 的过滤功能快速预览再决定是否写入数据库。具体连接串长这样ProviderMicrosoft.ACE.OLEDB.12.0;Data SourceD:\data.xlsx;Extended PropertiesExcel 12.0;HDRYES;IMEX1;注意机器上如果没装 Access Database Engine这个连接会失败建议部署时一并带上。5.3 与热词相关的周边功能扩展热词里还有不少 Delphi 相关的关键词比如“delphi 10.4 md5 计算”、“delphi 字符串函数”、“delphi 执行 DOS 命令获取返回值”、“delphi 让自身置顶”。这些虽然不是 EhLib 的核心功能但在开发桌面应用时经常和表格控件一起出现在同一个项目里。MD5 计算在 Delphi 里通过System.Hash单元就能做和 EhLib 没有直接关系但如果你要在表格里显示文件校验结果可以用下面的代码把 MD5 值填到某个列里uses System.Hash; function GetMD5OfFile(const AFileName: string): string; begin Result : THashMD5.GetHashStringFromFile(AFileName); end;“让自身置顶”这个需求我也碰到过通常是把窗体设置为置顶窗口SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);“执行 DOS 命令获取返回值”则可以用TProcessFireMonkey 下或 Windows API 的CreateProcess配合输出重定向。这些操作虽然和 EhLib 无直接关联但都属于桌面开发常用姿势组合起来就是一套很完整的开发工具箱。6. 实际项目落地几个容易忽略的细节6.1 高 DPI 适配与模糊字体说到 12.3 的改进高 DPI 适配确实是个绕不开的话题。之前用旧版 EhLib 在 4K 屏、150% 缩放下DBGridEh 的表头会出现字体重影、行高不对等问题。我自己试下来的经验是把TDBGridEh的RowHeight和TitleParams.Height设置为-1自动高度同时开启FetchedFonts相关的属性让控件根据 DPI 自动调整。新版的dghFitRowHeightsToText选项也建议打开这样单元格文字换行后行高能自动撑高不会出现文字被截断的情况。还有一个小细节如果你启用了 VCL Styles在暗黑主题下 DBGridEh 的颜色默认不会自动适配需要通过StyleElements属性控制哪些元素跟随主题。例如只让背景和文字跟随主题而边框、选中色保持原样。否则会出现白底黑字和深色主题混搭的难看效果。6.2 大数据量下的滚屏性能优化Data 量一旦到了十万行以上DBGridEh 默认的滚屏方式会变得卡顿。这个卡顿主要不是绘制慢而是数据在内存和界面之间的同步太频繁。我实测下来优化手段主要有几个第一把数据源的CursorLocation设为clUseServer让数据库服务器做游标管理减少本地内存占用第二把DBGridEh的VirtualMode属性开启。开启后控件的物理行数不再和数据集直接绑定需要在事件OnGetCellParams、OnGetCellText里手动提供数据这块逻辑虽复杂但对超大结果集确实有效。如果只是普通的数据展示不追求虚拟模式我推荐用DBGridEh.DataGrouping配合DBGridEh1.DataGrouping.Active : True做数据分组而非全量加载。分组时控件会创建一个内存索引滚屏性能比整表加载好很多。有一点要注意虚拟模式和分组模式不能同时开启否则我实测会直接崩溃。6.3 打印与预览表格界面上展示数据只是第一步打印和预览往往才是客户真正在乎的。EhLib 自带一个打印引擎TPrintDBGridEh调用方式非常亲民PrintDBGridEh(DBGridEh1, 业务报表, True);True表示先弹预览窗口。我实际用下来打印效果基本能做到“所见即所得”但对跨页断行的处理还是不完美。如果表格太宽打印会裁掉右侧列。这种情况推荐在打印前先调用一次专门的打印格式设置比如把列宽度等比缩小或者转成横向打印。这部分在 EhLib 帮助文档的 Printing 章节有专门说明但用中文搜索引擎能找到的资料很少所以我一并提一下。7. 我的一些实操心得最后聊点真心话。很多朋友拿到控件压缩包第一反应是问“有没有破解版”、“有没有汉化版”但我用 EhLib 这么多年最大的感触是它最值钱的部分不是控件本体而是它那套组织得很清晰的 Demo 工程。几乎所有我在项目里碰到过的需求——列过滤、分组合计、树形展示、合并单元格、打印预览——都能在Demos目录下找到直接对应的例子。装控件这件事本身说简单也简单就是编译、安装、加路径三步说复杂也复杂版本不匹配、路径不对、DLL 冲突、高 DPI 字体模糊、运行期找不到 BPL……每一步都可能劝退新手。我个人在整个流程里养成的几个习惯非常有帮助一是安装前永远先备份旧版二是安装后永远先跑一遍所有示例工程三是发布程序前永远先把运行期包是否静态编译检查一遍。如果你正在 Delphi 12.3 上做数据库项目EhLib 这套控件值得花时间折腾。把 11.1.015 专业版装好花一个下午把 Demo 跑一遍再回到自己的项目里重构数据库表格部分你会回来感谢这个决定。本文还有配套的精品资源点击获取
返回列表