ARTICLE DETAIL

资讯详情

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

EhLib VCL 11.1.015在Delphi 12.3中的安装使用与避坑指南

EhLib VCL 11.1.015在Delphi 12.3中的安装使用与避坑指南 简介Delphi 12.3环境下的EhLib VCL 11.1.015专业版组件包是一套面向使用Object Pascal进行数据库应用开发的Delphi程序员的第三方控件集合主要用于扩展VCL数据控件能力解决数据密集型桌面应用中的网格展示、编辑、打印与多数据库适配等问题。该版本针对现代Windows应用做了优化修复提供数据感知网格、报表生成器、数据绑定与编辑控件并支持InterBase、Firebird、MySQL、Oracle、SQL Server等主流数据库可显著简化复杂数据界面的构建过程并提升运行性能。压缩包内共2000个文件以pas源码、dfm窗体、dproj/dpk工程与包文件为主辅以ico图标、png图片、chm帮助文档及示例数据库等整体约32.81MB源码、工程、说明文档与示例一应俱全便于安装配置、阅读研究和二次开发。目前已有138人学习下载适合需要在Delphi 12.3中集成成熟第三方数据库控件、缩短数据库应用开发周期的中高级开发者。该专业版还包含商业授权相关组件与完整示例配合文档可帮助团队快速落地具备专业外观和高性能的数据管理软件减少底层数据处理与重复编码工作量。1. EhLib.VCL 11.1.015一套让 DBGrid 长出多表头、分组和合计的控件包Delphi 桌面管理类项目做到第三四个报表页基本都会撞上同一个痛点原生 TDBGrid 太素表头只有一行合计要自己写循环排序要么拼 SQL 要么翻数据集导出更是要手工拼 CSV。EhLib.VCL 就是来补这块短板的第三方 VCL 控件包11.1.015 Professional Edition 覆盖到 Delphi 12.3装上之后控件面板里多出 TDBGridEh、TDBEditEh、TDBLookupComboboxEh 这一族控件核心场景从多表头、自动合计、分组统计到导出 Excel 全都归它管。这篇笔记按“为什么选专业版、怎么装到 12.3、核心功能代码怎么写、哪五个坑最容易翻车”的顺序展开新手能照着落盘熟手也能对着参数边界判断值不值得投入。2. 为什么是 EhLib 而不是重写 TDBGrid专业版到底多给了什么2.1 先认清拳头产品TDBGridEh 在原生控件上加了什么老项目里的“表格”需求从来不只是把数据铺开。进销存要“本月入库明细”两层表头上面一层是“入库信息”下面拆成“单号、日期、数量”财务页要底行合计业务员列表要点表头就能按列排序。这些需求落在原生 TDBGrid 上每一件都得写事件多表头要用OnDrawColumnCell画边框线合计得在OnCustomDraw或数据遍历里自己累加排序得分清楚是本地IndexFieldNames还是回 SQL 改 Order By导出基本没有内置能力。TDBGridEh 把这些收进了属性里。列对象TColumnEh自带Title和Footer结构多表头开一个开关合计行开一个计数排序有SortLocal分组有GroupingData。它不是把原生控件包一层壳而是把网格常见操作重写了一遍绘制和数据逻辑。你在设计期双击列就能打开列编辑器勾选合计类型、设置显示格式、调整列顺序运行期这些配置直接生效。原生是白纸EhLib 是半成品方案。对大多数 MIS、ERP 后台页面来说后者的价值在于把“每个页面都要重复写的两百行表格逻辑”压缩成几个属性。这也是我推荐团队优先评估它的原因它不是万能的但表格类需求里它覆盖了八成场景。2.2 Professional Edition 比 Standard 多出的东西源码、内存表、设计期编辑器标题里带 Professional Edition这是商业授权版。常见的交付包里Standard 或试用版能让你跑起来但会弹版权提示专业版的核心差异在三块完整源码、设计期编辑器、以及 TMemTableEh 这类附加控件。完整源码的实战意义在于调试。表格合并单元格颜色不对、打印线条偏位这类问题靠猜属性和看文档效率太低直接翻 Sources 目录下的TDBGridEh.pas找到绘制函数看断点几十分钟就能定位是哪个像素偏移。我一般拿到包第一件事不是拖控件而是用 IDE 的 “Find in Files” 搜FooterValueType的实现确认它枚举值在哪个单元这样后面写代码时知道该 uses 什么。设计期编辑器是省时间的另一大头。右键 TDBGridEh 弹出的列设计器里可以直接为某列加 Footer、设fvtSum、填ValueField运行前就能看到效果预览。专业版的 TMemTableEh 则是内存表控件临时汇总、过滤、分组比重新建 ClientDataSet 方便配合网格做报表中间层很顺。再说直白一点标准版可以把控件装上用但改不了内部行为专业版把黑匣子拆开摆在桌面上。项目里已经有大量历史代码、又不想被控件厂商牵着走的时候这条差异就是预算决策的关键。2.3 与 DevExpress/TMS 的选型边界什么时候不该无脑上 EhLib讲完优势也得讲边界。Delphi 控件里 DevExpress QuantumGrid 是重型选手功能确实全但学习曲线陡一套皮肤下来界面风格统一要额外花时间调TMS FlexGrid 偏表格底层灵活但很多能力要靠自己堆事件。EhLib 居中它专注“数据表格本身”多表头、合计、分组、排序、导出全覆盖但没有图表、没有复杂卡片视图、没有日历导航这类扩展。我的选型判断是页面主体是数据网格、字段几十个、交互主要是查和导就用 EhLib项目里要求界面像 Web 后台那样有卡片、树、联动筛选器那上 DevExpress 更划算如果只是只读表格原生 TDBGrid 加两个事件也能顶没必要引入第三方依赖。另一个现实因素是维护成本。EhLib 的源码是 Pascal团队里只要有人能读 Delphi 基础代码出问题敢改DevExpress 这类大套件遇到版本兼容问题很多时候只能等官方更新。对维护周期长的进销存类系统“敢改源码”比“功能多”更重要。3. 在 Delphi 12.3 里装好 EhLib 11.1.015从 RAR 解压到控件面板出现3.1 解压之后的目录门道Sources、Packages、Common 各管什么先做一件事把 RAR 解压到一个纯英文路径下比如D:\Dev\EhLib_11路径里不要带中文和空格。这不是玄学是 dcc32 编译器和部分 IDE 插件在带中文路径下会偶发 “File not found”报错位置还特别隐晦不值得赌。解压后先看目录结构不要急着双击 install.bat。常见的布局里会有 Sources、Packages、Common、Docs、Demo 这几个目录各管一摊Sources 是控件核心源码TDBGridEh 的.pas文件都在这里安装后要把它加进 IDE 的 Library path编译时找不到.dcu八成是漏了这一步。Packages 是按编译器版本分目录的包工程Delphi12目录下放着.dpk和.bpl工程文件是编译安装的入口。Common 是公共工具单元一些版本的数据导出插件、辅助函数会依赖它建议也放进搜索路径。Demo 是官方示例很多属性组合和坑点其实是照 Demo 调出来的值得留。这里有个常见误区把 Packages 目录加进搜索路径而不是 Sources。IDE 能找到.dpk但编译你的业务工程时找不到TDBGridEh.pas生成的.dcu报错只差一个单元名排查却要多花半小时。3.2 先编译运行时包还是设计时包顺序错了会怎样安装顺序是新手最容易翻车的地方。正确顺序永远是先编译运行时包再编译并安装设计时包。运行时包是控件逻辑本体设计时包是让控件出现在 IDE 工具面板上的壳壳依赖体反着装就会出现“工具面板能看见 TDBGridEh拖到窗体就报 Class not found”的情况。Windows 下 install.bat 做的事情拆开看其实就三步找到 Delphi 12.3 的安装目录调用 dcc32 编译运行时.dpk再把设计时.dpk编译出的.bpl注册进 IDE。我一般不用一键脚本因为它在某些系统上会静默跳过个别包手动两步更可控# 以 Delphi 12.3 默认安装目录为例 # 第一步编译运行时包注意先 cd 到对应版本的 Packages 目录 cd /d D:\Dev\EhLib_11\Packages\Delphi12 C:\Program Files (x86)\Embarcadero\Studio\23.0\bin\dcc32.exe -B EhLib.dpk # 第二步编译并注册设计时包 C:\Program Files (x86)\Embarcadero\Studio\23.0\bin\dcc32.exe -B -JP dclEhLib.dpk这里的-B是强制全部重建避免旧的.dcu干扰-JP是让 dcc32 生成 bpl 并做注册。如果命令行编译中间报单元找不到先把D:\Dev\EhLib_11\Sources和D:\Dev\EhLib_11\Common追加到 dcc32 的-U参数后面等价于给编译器临时加搜索路径。手动编译还有个好处报错信息能实时看到。比如提示缺少某个jcl或dcl基础库说明你本机 Delphi 的公共包版本和 11.1.015 的编译条件不完全匹配这时候直接查包名再去 IDE 里装对应运行时包比脚本一把梭快得多。3.3 把库路径挂进 IDE并实测控件落地的检查清单编译安装完成后还有最后一步把 Sources 和 Common 挂进 IDE 的全局搜索路径。路径不对控件面板正常但你的工程一编译就报 “TDBGridEh not found” 或 “Unit not found”。在 IDE 里打开 Tools Options Language Delphi Library Library path新增这两行D:\Dev\EhLib_11\Sources D:\Dev\EhLib_11\Common加完路径最好重启一次 IDE让设计时包重新加载。然后建一个全新的 VCL 空工程按下面清单验证安装结果验证项通过标志工具面板出现 EhLib 选项卡能拖出 TDBGridEh不报 Invalid class编译空工程无 “TDBGridEh not found” 或 “.dcu 找不到”右键网格打开列设计器能看到列集合能修改 Title Caption接着跑最小代码确认控件真能出数据procedure TForm1.FormCreate(Sender: TObject); begin // 用 FieldDefs 快速建一个内存数据集避免连数据库 with ClientDataSet1.FieldDefs do begin Clear; Add(Name, ftString, 10); Add(Amount, ftInteger); end; ClientDataSet1.CreateDataSet; ClientDataSet1.AppendRecord([电梯维保, 12000]); // 数据源和网格相互绑定 DataSource1.DataSet : ClientDataSet1; DBGridEh1.DataSource : DataSource1; end;这段代码里FieldDefs.Add的三个参数分别是字段名、类型、长度ftString必须给 Size否则建表会报错。跑起来后窗口能显示一行“电梯维保 / 12000”说明控件安装和路径配置都通了。4. 让表格自己干活多表头、行合计、分组排序的代码级实现4.1 多表头MultiTitleTrue 之后一个标题里塞两行报表页里最常见的需求是两层表头顶层一个“员工信息”底层拆成“姓名、部门”。EhLib 实现这个只要一步开 MultiTitle然后用竖线分隔两层标题// 开启多表头模式TColumnEh 的标题才会解析竖线分隔符 DBGridEh1.MultiTitle : True; DBGridEh1.Columns[0].Title.Caption : 员工信息|姓名; DBGridEh1.Columns[1].Title.Caption : 员工信息|部门; DBGridEh1.Columns[2].Title.Caption : 业绩数据|销售额;竖向分隔符必须是英文|中文全角或顿号都不会触发换行。同一个顶层名称的列运行时会被绘制成合并单元格也就是“员工信息”跨姓名和部门两列“业绩数据”独立成组。这是一个纯属性开关不需要碰任何绘制事件多表头和拖动列宽也能共存。这里要注意列的索引问题。Columns[0]是按列集合当前的排列顺序索引的如果设计期调整过列序数字索引可能不再是你以为的那一列。后面避坑章会专门讲怎么用字段名定位列这里先带上一个更稳的写法尽量在设计期列编辑器和字段绑定一起处理运行期不要频繁用数字索引改 Caption。4.2 合计行FooterRowCount 与 fvtSum 的两个必设属性底行合计是财务页的命根子。EhLib 的 Footer 行设计得很直接先开合计行区域再指定某列的合计类型和统计字段// 合计行默认不显示FooterRowCount 至少要 1 DBGridEh1.FooterRowCount : 1; // 对“销售额”这一列做求和ValueType 枚举在 EhLib 的常用单元里 DBGridEh1.Columns[2].Footer.ValueType : fvtSum; DBGridEh1.Columns[2].Footer.ValueField : Amount; DBGridEh1.Columns[2].Footer.FieldName : Amount;ValueType的可选值包括fvtSum、fvtAvg、fvtCount、fvtMax、fvtMin对应求和、均值、计数、最大、最小。ValueField是参与统计的字段名FieldName决定页脚显示文本的字段来源实际项目中这两个最好保持一致避免出现“算的是 Amount 显示的是 Qty”的情况。列本身的DisplayFormat属性会同时影响 Footer 里的数字格式。如果字段值是浮点数记得设成#,##0.00否则合计结果会显示成一大串小数。还有一点当数据集为空时fvtSum默认显示 0而fvtCount显示 0 也是正常的不要试图在空表时把 Footer 藏起来那属于额外逻辑。4.3 分组与排序不写一行 SQL把明细摊成“带小计的抽屉”分组是 TDBGridEh 另一个招牌能力。开启分组面板后运行期用户可以把列头直接拖进分组条按字段折叠数据代码里也可以用属性固定分组字段// 显示顶部“分组拖拽区”运行期可拖入列表头 DBGridEh1.GroupingData.ShowGroupingPanel : True; // 固定按部门分组 DBGridEh1.GroupingData.GroupFieldName : Dept; // 分组默认折叠减少滚动长度 DBGridEh1.GroupingData.DefaultGroupExpanded : False; // 点击列标题本地排序不产生 SQL 回绕 DBGridEh1.SortLocal : True;SortLocal : True的作用是让点击列标题时直接在当前数据集上做内存排序适合已经加载到本地的数据。如果你连的是远程 SQL 数据库且数据量大不要开它否则每点一次表头就全表拉一遍性能会很难看。那种场景应该把排序交给后端 Order ByEhLib 里对应的是服务器端排序模式本地只负责显示。分组这里有个容易漏的点分组字段在数据集里的值如果不连续同一个值会出现多次分组。比如“部门”数据是“A、B、A、A”内存数据集没有按 Dept 排序时A 会被分成两个组看起来像数据重复。凡是做分组展示先让数据集按分组字段排好序再开分组显示才正常。5. 避坑EhLib 11.1.015 在 Delphi 12.3 下的 5 个常见翻车现场5.1 现象编译报错 “TDBGridEh not found” 或 “File not found: dclEhLib.bpl”这是安装后最常见的问题。控件面板里明明有 TDBGridEh新建窗体也能拖上去但一编译整个工程就报找不到类。原因一般不在控件本身而在两个点一是 Library path 里只加了 Packages 没加 SourcesIDE 在设计期能找到 bpl但编译业务代码时找不到TDBGridEh.pas对应的 dcu二是运行时包没编译成功设计时包强行安装IDE 里显示正常编译器却缺底层单元。解决分两步走先把D:\Dev\EhLib_11\Sources和Common都加进 Tools Options Language Delphi Library Library path顺序要放在其他第三方库前面然后回到 Packages\Delphi12按“运行时包在前、设计时包在后”的顺序重新编译一遍。多数“not found”都会在这一轮后消失。5.2 现象导出 Excel 打开全是 “???” 或乱码网格里中文显示正常用SaveToExcel导出的 xls 文件用 Excel 打开后中文全变成问号英文数字正常。原因是老式 .xls 导出通道按 ANSI 编码写文件简体中文环境下代码页一冲突就坏另外数据集里字段若是 AnsiString 而非 WideString导出时宽字符会被截断。这个问题跟控件版本有关但 11.1.015 在默认参数下依然会踩。我的后悔药是不硬磕 Excel 导出改成 UTF-8 带 BOM 的 CSVExcel 直接识别既不乱码也不依赖 OLEvar SL: TStringList; begin SL : TStringList.Create; try SL.Add(姓名,销售额); // 真实项目中这里遍历 DBGridEh1.DataSource.DataSet 逐行拼数据 SL.SaveToFile(report.csv, TEncoding.UTF8); // UTF-8 带 BOMExcel 正确识别中文 finally SL.Free; end; end;TEncoding.UTF8在 Delphi 2009 以后可用12.3 自然支持。注意TStringList.SaveToFile带编码参数时会自动写 BOMExcel 打开 .csv 就能按 UTF-8 解析这是绕开乱码最稳定的路径。5.3 现象编译 dpk 时报“内存错误”或 Access Violation安装控件包时 dcc32 崩了错误信息类似“内存错误”或 Access violation注册表也写不完整。这个报错多数和 EhLib 无关和编译环境有关解压路径带中文、杀毒软件实时扫描临时文件、IDE 里残留了上一个版本的 dcu 缓存都会让编译器踩到异常地址。我的处理顺序是这样的先解压到纯英文短路径退出 IDE删除 Packages\Delphi12 目录下所有*.dcu和__history文件夹然后管理员身份运行 IDE 或命令行重新编译。如果还报就关掉杀毒软件的文件监控再试一次。这一步解决了我遇到过的九成编译崩溃。5.4 现象列设计器调整顺序后表头字幕和列内容对不上代码里用Columns[0]设置了标题但运行后发现标题串到了相邻列上多表头模式下更明显。原因是列集合的索引和可见顺序不一致。列设计器里拖动列后物理索引没变但显示顺序变了运行期再用固定数字索引给 Title 赋值就把标题赋给了错误的列对象。解决是改用字段名定位列而不是索引var Col: TColumnEh; begin Col : DBGridEh1.Columns.FindColumnByFieldName(Dept); if Col nil then Col.Title.Caption : 组织|部门; end;FindColumnByFieldName是按字段名在列集合里查找列怎么拖都不会找错。返回的TColumnEh对象判空后再用避免字段名写错时直接访问空指针。这也是我在所有报表代码里的统一习惯。5.5 现象分组打开后数据行“消失”了设置GroupingData.GroupFieldName之后网格里只剩下几个分组标题明细行没了第一反应是数据被清空了。这通常是两个原因叠加分组默认是折叠状态行被收进“抽屉”里或者数据集没有按分组字段排序相同值的行分散在多处被拆成多个组看起来内容变少。先验证数据没丢检查ClientDataSet1.RecordCount数量不变就说明只是折叠。再把默认展开开回来并把数据集先按分组字段排序DBGridEh1.GroupingData.DefaultGroupExpanded : True; // 先全部展开确认数据在 ClientDataSet1.IndexFieldNames : Dept; // 按分组字段排好序 DBGridEh1.SortLocal : True;数据量小的时候用IndexFieldNames即可数据量大或远端数据集排序逻辑放到 SQL 层。分组功能本身不删数据但折叠状态和未排序会制造“丢数据”的假象先展开、先排序再谈优化。6. 进阶过滤行与自检把 EhLib 调成自己的表格工作台6.1 用 STFilter 行内过滤替代手写 Edit 组件很多项目做筛选的习惯是窗体上方摆一排 Edit 和 ComboBox点“查询”后重新取数。数据量不大时更轻的做法是用 TDBGridEh 自带的 STFilter 行内过滤不需要额外控件// 打开每列表头下方的过滤行区域 DBGridEh1.STFilter.Visible : True; // 本地过滤直接在当前数据集上执行 DBGridEh1.STFilter.Local : True;STFilter.Visible决定网格上方是否显示过滤输入条每列对应一个小漏斗按钮点开能输入关键字或范围STFilter.Local让过滤在当前数据集内完成适合几万行以内的内存数据。远程大表不要开 Local否则每次过滤都会全量拉数据性能扛不住。这个能力和分组面板配合基本能把一个报表页做成小型的自助查询工具用户自己拖分组、自己过滤、自己导出开发只需要把数据准备好。6.2 写一个最小自检流程验证分组、合计、导出链路第三方控件换版本后我最怕的是旧代码在细节上悄悄改变行为。所以现在养成的习惯是每次接入新版本先写一个自检按钮把核心功能断言一遍procedure TForm1.btnSelfCheckClick(Sender: TObject); begin // 自检一合计行是否开启 Assert(DBGridEh1.FooterRowCount 1, 合计行未启用); // 自检二多表头模式 Assert(DBGridEh1.MultiTitle, 多表头未启用); // 自检三导出文件能否生成 DBGridEh1.SaveToExcel(selfcheck.xls); Assert(FileExists(selfcheck.xls), 导出失败); // 自检四分组面板可用 Assert(DBGridEh1.GroupingData.ShowGroupingPanel, 分组面板未开启); ShowMessage(自检通过); end;Assert在 Delphi 的 Debug 配置下默认开启发布编译会关闭所以这段代码可以安全留在工程里当回归测试用。实际项目里可以把四项断言再细化比如检查合计值是否为预期求和结果、导出文件大小是否大于某个下限这样版本升级后点一次按钮就能发现行为漂移。我自己的交付习惯是任何第三方控件包拿到手先建一个最小空工程跑通核心链路再进入业务代码。原因很简单版本兼容问题的报错往往是“内存错误”“找不到类”这类黑匣子信息不先把控件自身排除掉出了问题根本分不清是控件、是数据库、还是业务逻辑的锅。EhLib 这套多表头、合计、分组、排序、导出的组合是当前 VCL 项目里我维护得最顺的表格方案希望帮到你。本文还有配套的精品资源点击获取
返回列表