ARTICLE DETAIL

资讯详情

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

EhLib 10.0.031 For Delphi 11安装配置与TDBGridEh网格实战指南

EhLib 10.0.031 For Delphi 11安装配置与TDBGridEh网格实战指南 简介EhLib 10.0.031是专为Delphi 11环境打造的第三方组件库覆盖图形处理、数据库连接、报表设计、图表分析与界面增强等模块适合需要快速构建数据库型桌面应用的Delphi开发者无论是内部工具还是复杂业务系统都能从中找到合适的组件支撑。包内共890个文件以dfm窗体、pas源码、res资源、dpr工程等类型为主并附有dcu预编译单元与chm帮助文档整体24.63MB结构清晰便于按需引用。已有885人学习下载此版本针对Delphi 11.1.5实测通过可直接运行install目录下的安装程序实现无缝集成。资源还提供完整源代码便于深入理解内部机制并结合业务需求二次开发配合手册、示例及丰富的组件单元可大幅提升图形界面与数据处理类应用的开发效率。尤其适合ERP、进销存、报表中心等数据密集型项目的快速迭代。1. EhLib 10.0.031 For Delphi 11它不是皮肤库是网格控件的加速器EhLib 10.0.031 For Delphi 11 这个包是 Delphi 老用户很熟悉的第三方控件库重点不是花哨控件而是 TDBGridEh 的数据网格能力。见过太多人把 EhLib 当成 UI 皮肤库装上后拖几个控件找不到门道就删了实际上它的核心价值是把排序、列宽记忆、单元格内嵌编辑、合计行、导出 Excel 这些从“自己写事件”变成“拖个控件配两行属性”。对正在维护老项目的工程师来说这是把 DBGrid 交互升级到类似 Office 网格体验的最短路径也适合在 Delphi 11 下新建 VCL 数据界面时节省工作量。如果你手头正好是 Delphi 11下面这套安装、配置和避坑流程可以直接照着走。2. 安装只是门槛版本对应、路径三件事和一份自检清单2.1 先看清 10.0.031 与 Delphi 11 的包结构EhLib 这类控件库通常按 IDE 主版本拆分发货。你拿到的 10.0.031 对应 RAD Studio 11 Alexandria编译产物目录一般会区分 Win32、Win64解压之后别急着双击任何 exe先看目录结构。常见的布局是 Source、Compiled、Bin 和文档目录Compiled 里按 Delphi 版本和平台分了子目录。后面要加进 IDE Library path 的就是 Compile 后生成 DCU 的那一层。第一件事是分清运行期包与设计期包。运行期 BPL 在项目运行时被加载它不注册到 IDE 工具箱设计期 BPL 才负责让工具箱出现 TDBGridEh、TDBLookupComboboxEh 等控件并提供列编辑器、导出菜单这些设计期能力。很多安装失败的案子都是只编译了 runtime 包就直接开干结果工具箱搜不到 DBGridEh于是去网上找旧版 9.x 的 dcu 来混用越混越乱。包类型典型特征IDE 中的作用是否要手动注册运行期Runtime不带 dcl 前缀的 BPL/DCU项目运行时被引用不需要手动注册设计期DesignTime带 dcl 前缀的 BPL工具箱控件、设计期编辑器需要手动加载同一套控件库的运行期包和设计期包必须来自同一次编译混装不同版本会在 IDE 启动或编译链接时暴露出来这也是后面第 4 章要展开的重点。2.2 装进 Delphi 11 的常规三步第一步解压。解压路径不要带中文和空格我一般放在 D:\Components\EhLib 这类纯英文目录下。第二步执行包内自带的重新编译脚本。cd /d D:\Components\EhLib # 常见做法运行包内自带的重新编译程序或批处理名称以实际安装包为准 Recompile.exe如果包内没有现成脚本就打开 Delphi 11用 Component Install Packages 直接把 Compiled\Delphi11 下的 dcl 开头 BPL 加入让 IDE 重新编译安装。这一步会生成运行时 BPL 和设计期 BPL并在编译输出目录生成 DCU。脚本参数方面常见编译程序支持 /BuildAll 或 /All 这类开关作用是一次编译 Win32 和 Win64 两个平台没有把握时直接不带参数运行按交互提示选择当前 IDE 版本即可。第三步配路径。打开 Tools Options Delphi Options Library在 Library path 里追加两个路径一个指向 Source 源码头文件另一个指向 Compiled\Delphi11\Win32\Release。注意 Delphi 11 的 Library 页面是分平台管理的Win32 和 Win64 各有一个列表两个平台的路径都要加否则切换目标平台时就会出现 File not found。项目级的搜索路径在 Project Options 的 Delphi Compiler Search path 里维护全局路径配好后一般不需要每个工程单独加。注册设计期包是最后一步。Component Install Packages Add选中 Compiled 下 dcl 开头的 bpl确定后等工具箱刷新。随后新建一个 VCL 项目搜索 DBGridEh能拖出来就说明前半段成功了。Delphi 对路径这么敏感是因为编译器定位 DCU 只认全局库路径和项目搜索路径两处。Library path 配错或者被旧版本残留占据编译器找到的可能是另一个版本的单元RTTI 包名、资源版本不一致链接时就报错。所以这一步值得花十分钟一次性做对。2.3 装完怎么自检自检清单按“设计期、编译期、运行期”三个阶段看阶段检查动作期望结果失败时先查设计期工具箱搜索 DBGridEh出现 DBGridEh、TMemTableEh 等设计期 bpl 有没有挂载编译期新建项目拖入网格并 CtrlF9编译通过无 dcu 缺失Library path 两个平台是否都加运行期F9 运行不弹“找不到 bpl”运行期包是否被 IDE 找到拖入 TDBGridEh 后右键菜单里应出现 Export、Columns Editor 等 EhLib 专属项这是设计期包正确挂载最直观的证据。另一个值得做的验证是切到 Win64 平台重新编译一次很多机器只配了 Win32 路径64 位第一次编译就会翻车。常见误用是多版本残留。老项目里如果装过 EhLib 9.x 或 8.xIDE 的 Library path 里可能残留旧 DCU。升级到 10.0.031 之前把旧版本路径从全局库路径和项目搜索路径里删干净尽量做到全机器只有一份 EhLib 10 的 DCU。多版本共存是绝大多数“编译程序报内存错误”的源头。3. 拿 DBGridEh 换掉 DBGrid接线、动态列与三个高频设置3.1 为什么要换排序、列宽、编辑器等都是原生 DBGrid 的短板原生 TDBGrid 能显示数据但用户要排序时你只能写 OnTitleClick 事件自己维护排序状态要下拉选值、日期选择得额外叠一层控件列宽记忆、合计行更是没有。DBGridEh 把这些都收到属性和事件里设计期能编辑列运行期还能动态改列。DBGridEh 的 DataSource 接线与原生完全一致直接改 DataSource 属性即可也可以用同一个 DataSource 变量动态绑定所以老代码迁移成本低基本是换个控件名再调列属性。能力TDBGridTDBGridEh标题排序要写 OnTitleClick选项打开即用合计行无Footer 支持单元格下拉无PickList / Lookup 组合框导出无导出 Excel/CSV/PDF迁移时的原则是先从数据源接线开始确认数据能显示再调列和交互选项最后加导出。顺序反了容易在排查时搞不清是数据问题还是控件问题。3.2 列编辑与运行时动态加列设计期用 Columns Editor 加列时选中列后设置 FieldName列标题由 Title.Caption 控制。但更多场景是运行时根据查询结果动态生成列比如报表工具里字段列表来自外部配置。这时在数据打开后遍历字段并逐列添加。procedure TForm1.BuildGridColumns(AGrid: TDBGridEh; ASource: TDataSet); var I: Integer; Col: TColumnEh; begin AGrid.Columns.Clear; for I : 0 to ASource.FieldCount - 1 do begin Col : AGrid.Columns.Add; Col.FieldName : ASource.Fields[I].FieldName; Col.Title.Caption : ASource.Fields[I].DisplayLabel; Col.Width : 120; // 默认列宽可按字段类型调整 if ASource.Fields[I] is TFloatField then Col.DisplayFormat : #,##0.00; // 数字列保留两位小数 end; end;这段代码先清空原列再遍历数据集字段。FieldName 设置后列才会自动连接数据集Title.Caption 如果留空会默认取字段名所以这里显式给了 DisplayLabel。Width 是像素宽度文本较长时 DBGridEh 会自动换行显示。DisplayFormat 只对数字列生效字符串列设置它没有副作用但没必要。运行时动态加列之后列宽记忆功能可能需要自己在关闭窗体时把 Width 存到配置文件DBGridEh 本身只负责当前运行期的布局。3.3 点标题排序先搞清楚本地排序和数据库排序的分界DBGridEh 的排序有两种一种是本地内存排序适合表已经全部载入的场景另一种是给 SQL 加 ORDER BY适合大数据量分页。实现上由 OptionsEh 里的 dghAutoSortMarking 控制排序箭头显示由 SortLocal 属性控制是否使用本地排序算法。// 启用标题点击排序并显示排序三角 DBGridEh1.OptionsEh : DBGridEh1.OptionsEh [dghAutoSortMarking]; DBGridEh1.SortLocal : True; // 本地排序开关dghAutoSortMarking 决定点击标题列时是否在标题上显示升序/降序三角SortLocal 为 True 时网格在内存中对当前数据集排序适合 TMemTableEh、TClientDataSet 这类全内存数据集。如果数据源是 SQL Server 或 MySQL 的直连数据集且数据量在十万行以上SortLocal 应该设为 False排序下推到数据库否则首屏加载和点标题排序都会有肉眼可见的卡顿。本地排序还有一个容易被忽略的细节它排序的是当前数据集假如数据集本身有主从关系或过滤条件排序结果可能和你预期不一致。遇到这种情况先确认 Filter 是否生效再谈排序。3.4 合计行与单元格内嵌编辑器合计行在 DBGridEh 里叫 Footer需要打开 Options 里的 Footer 显示并在 OnGetFooterParams 事件里写计算逻辑。procedure TForm1.DBGridEh1GetFooterParams( Sender: TObject; DataCol, DataRow: Integer; Column: TColumnEh; FooterValue: Variant); begin if Column.FieldName TotalAmount then // 按 DBGridEh1 当前可见行汇总 FooterValue : 合计 FormatFloat(#,##0.00, CalcVisibleTotal); end;FooterValue 直接赋值网格就会渲染到列底部。Column.FieldName 匹配需要合计的列CalcVisibleTotal 是自己写的方法遍历当前 DataSource 数据集或者维护一个聚合值。需要注意的是Footer 显示的是当前可见行如果数据集被 Filter 过滤合计值自然只统计过滤后的数据报表场景下这是期望行为但如果不清楚这一点会以为合计算错了。列内嵌编辑器最省事的做法是 PickList。它不用额外放 TDBComboBoxEh直接在列上给一个字符串列表运行时该列点击就会弹下拉值写回字段。Col : DBGridEh1.Columns[2]; Col.PickList.Clear; Col.PickList.Add(待处理); Col.PickList.Add(处理中); Col.PickList.Add(已完成);PickList 适合枚举值固定的状态字段如果选项来自数据表还是用 TDBLookupComboboxEh 更合理因为它可以绑定 lookup 数据源。当前需求如果只是三五个状态值PickList 能少写一个数据源少维护一套 lookup 配置。日期选择则要用 TDBDateTimeEditEh它不在 PickList 范围内属于另一个嵌入编辑器控件。4. 避坑编译报错、内存错误与设计期崩溃五个现场4.1 现象File not found: EhLibVCL.dcu原因Library path 没指到编译输出目录或指到了错误平台目录。Delphi 11 的库路径按 Win32/Win64 分列只配了 Win32 后切到 64 位编译就会出现这个错。解决把 Compiled\Delphi11\Win32\Release 和 Compiled\Delphi11\Win64\Release 分别加到对应平台的 Library pathSource 目录也一并加进去。如果只有单个工程报错在项目选项的 Search path 里补上 Source 路径。改完关闭并重开项目让 IDE 重新解析路径不要只按 F9 期望它自动刷新。4.2 现象编译链接时报内存错误或 Out of memory听到“Out of memory”先别怀疑机器这大概率是组件路径冲突。原因机器上残留旧版 EhLib 的 DCU/BPL编译器同时抓到两份不同版本的单元链接器合并符号表时资源消耗成倍上涨表现出来就是编译程序报内存错误或者随机 Access violation。这是我在几个老项目里反复踩过的坑。排查顺序我一般是第一步看 Library path 里是不是只有一处 EhLib第二步看 Component Install Packages 里有没有重复的设计期包第三步用 Everything 搜 *.dcu 和EhLib.bpl把不在当前安装目录下的旧文件移走或删除。三步走完内存错误基本消失。如果还有问题把 IDE 里所有 EhLib 相关包移除重启 IDE 后只注册 10.0.031 这一份。4.3 现象运行后点标题没有排序箭头排序也不生效原因OptionsEh 里少了 dghAutoSortMarking或者数据源类型和排序方式不匹配SQL 数据集用本地排序数据量一大就会出现“点标题没反应”的假象。解决先给 OptionsEh 加上 dghAutoSortMarking在内存数据集上验证排序行为确认箭头出现、数据能排。然后按 3.3 的分界调整全内存数据集用 SortLocal : True数据库直连数据集关掉本地排序去 SQL 层解决。运行时可以点标题后观察标题栏右侧是否出现三角箭头有箭头但数据不动多半是数据集不支持原地排序换 TMemTableEh 这类内存数据集立刻能好。4.4 现象导出 Excel 后中文变成乱码或文件打不开原因用 CSV 类导出时没有处理字符集或者用老式 XLS 导出与新版 Excel 的兼容性出问题另一个常见原因是导出路径目录不存在文件名带非法字符。解决首选 XLSX 路径。我常用的调用方式如下uses DBGridEhImpExp; // 导出当前网格数据第一行带列标题 SaveDBGridEhToExportFile( DBGridEhExportAsXLSX, // 导出格式 DBGridEh1, // 目标网格 ExtractFilePath(Application.ExeName) sales.xlsx, True);第 1 个参数指定导出格式XLSX 的字符集处理最省心第 2 个参数是要导出的网格第 3 个参数给出目标文件路径务必保证目录存在第 4 个参数为 True 表示导出列标题。导出 PDF 的思路相同把格式常量换成 DBGridEhExportAsPDF不需要另外引 iText 这类 PDF 库。导出前还应该确认网格的 DataSource 已经打开导出的是当前可见列和可见行隐藏列不会出现在结果里。4.5 现象设计期拖入 DBGridEh 后 IDE 崩溃或报 Access violation原因designtime 包与 runtime 包版本不匹配或者 IDE 里同时挂载了两套 EhLib 设计期包。到 Component Install Packages 里看列表如果出现两行 dcl 开头的 EhLib 包就是异常状态。解决移除所有 EhLib 相关包关闭 IDE删除编译输出目录里残留的 bpl/dcu重开 IDE 后只注册当前 10.0.031 这一份。如果 IDE 在启动阶段就不稳定先禁用异常包再清理不要带着半套配置继续开发否则设计期随时还会崩。5. 用 TMemTableEh 接住临时数据字段定义、网格联动与导出 Excel5.1 为什么不用 TClientDataSetEhLib 自带 TMemTableEh本质是内存数据集专门和 DBGridEh 配套。它比 TClientDataSet 轻不需要远程数据模块的配置定义一个字段结构、填数据、挂 DataSource 就能显示。它常被用作查询中间层从数据库查出结果放到 TMemTableEh再做计算、过滤、导出不污染主表数据。Lazarus 社区也有类似控件但和 EhLib 的成熟度相比还有差距这也是不少老项目继续留在 Delphi 生态的原因之一。选择 TMemTableEh 还有一个现实理由导出。DBGridEh 的导出函数天然识别网格数据源TMemTableEh 挂上去之后导出 Excel 不用额外写循环代码量少很多。如果只是临时展示数据比新建物理表、再清理表干净得多。5.2 动态建字段、填数据、上网格这份代码可以直接抄到按钮事件里先把内存表跑通。procedure TForm1.Button1Click(Sender: TObject); var M: TMemTableEh; DS: TDataSource; begin M : TMemTableEh.Create(nil); DS : TDataSource.Create(nil); try M.FieldDefs.Add(OrderNo, ftString, 20); M.FieldDefs.Add(Customer, ftString, 40); M.FieldDefs.Add(Amount, ftFloat); M.CreateDataSet; M.Append; M.FieldByName(OrderNo).AsString : SO-2024-001; M.FieldByName(Customer).AsString : 某电商公司; M.FieldByName(Amount).AsFloat : 2380.50; M.Post; // 第二行用批量方式写入 M.AppendRecord([SO-2024-002, 某制造企业, 12600.00]); DS.DataSet : M; DBGridEh1.DataSource : DS; finally // 临时用法结束后释放需要长期保留时把 Create(nil) 改为 Create(Self) M.Free; DS.Free; end; end;FieldDefs.Add 依次传入字段名、类型、长度字符串字段必须给长度否则默认 0 会在运行时出问题CreateDataSet 之后不能再改字段定义。Append 后通过 FieldByName 逐字段赋值Post 提交AppendRecord 用数组按字段顺序一次写入适合多字段批量场景。这段代码用 Create(nil) 创建对象并手动释放优点是作用域干净如果内存表要留给其他事件继续用把 Create(nil) 改成 Create(Self) 让窗体托管生命周期最后就不要手动 Free。上网格之后顺手可以做数据过滤这对报表中间层很实用。M.Filter : Amount 1000; M.Filtered : True;Filter 的字段名要写字段名而不是列标题字符串值需要加单引号数字直接写。Filtered 置 True 后立即生效DBGridEh 会同步只显示过滤后的行。过滤条件写错时不会报编译错而是运行时弹“无效过滤条件”的提示调试时先把 Filter 清掉再逐步加条件。5.3 把内存表内容导出成 Excel 文件TMemTableEh 与 DBGridEh 联动后导出不需要遍历数据调用第 4 章的 SaveDBGridEhToExportFile 即可。但这里有一个细节导出网格时网格的当前列宽、列顺序、排序状态都会带进 Excel如果你只要导出内存表原始内容、不要网格界面配置可以先把网格列设成你想要的顺序再导出。// 先按报表需要调整列顺序 DBGridEh1.Columns[0].FieldName : OrderNo; DBGridEh1.Columns[1].FieldName : Customer; DBGridEh1.Columns[2].FieldName : Amount; // 导出 SaveDBGridEhToExportFile( DBGridEhExportAsXLSX, DBGridEh1, report.xlsx, True);这里复用网格导出意味着列顺序来自 Columns 集合。如果字段还没建列导出会跳过或报错所以导出前确认网格列已经和内存表字段绑定。导出后建议用 Excel 打开检查三个点列标题是否中文、金额列是否按 DisplayFormat 格式化、总行数是否等于过滤后的数据量。这三个点同时通过导出才算闭环。6. 进阶技巧把 DBGridEh 当成报表预览器的两个设置6.1 合并相同相邻单元格MergeColumns 的边界网格用于展示对账单、发货单时相同订单号的列重复显示非常碍眼。DBGridEh 的 MergeColumns 属性指定按哪些列合并注意只合并相邻行且值相同的单元格。DBGridEh1.MergeColumns : OrderNo;参数说明里最关键的是“相邻且相同”。OrderNo 相同但中间隔着其他值时合并会自动断开。设置后该列纵向合并视觉上接近报表的分组效果。边界在于合并只影响显示编辑时一次只改当前行合并区域不会同步写入数据库如果你想让用户批量修改合并区域的某个字段需要自己写循环遍历行。6.2 分组视图DataGrouping 的 Active 切换报表场景常把明细按客户分组显示。DBGridEh 的 DataGrouping 支持分组行、展开和收起。DBGridEh1.DataGrouping.Active : True; DBGridEh1.DataGrouping.GroupPanelVisible : True;Active 决定是否启用分组GroupPanelVisible 控制顶部是否出现分组面板。运行时用户可以把列标题拖到分组面板上按该列分组很适合“先出汇总、再展开明细”的浏览方式。验证方法是运行程序把 Customer 列标题拖到顶部分组栏网格出现分组头点击小三角展开收起。如果分组后列排序异常检查列设置的排序标记是否为默认状态。最初接入 EhLib 时我也迷信数据库排序后来发现报表预览这类小数据集场景本地分组和合并更顺手。从那以后我每换一次 Delphi 版本去旧包、编译新包、跑一遍三阶段自检这三步是必做的组件路径也统一放在纯英文目录希望帮到你。本文还有配套的精品资源点击获取
返回列表