ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Delphi 12.3安装EhLib 10.2.42源码版完整指南

Delphi 12.3安装EhLib 10.2.42源码版完整指南 简介面向使用 Delphi 的开发者这份 EhLib v10.2.42 控件源代码资源包支持从 Delphi 5 到 Delphi 12 的多个版本主要解决数据库网格显示、数据表格快速编辑与报表呈现等桌面客户端开发中的常见需求。压缩包内共包含 1878 个文件整体体积约 29.69MB其中以 479 个 Pascal 单元源码、466 个窗体布局定义、232 个资源文件、175 个工程文件、160 个编译包为核心并配有必要的图标、示例和帮助说明文件类型覆盖从界面设计到工程组织的完整环节。目前已有 111 人学习下载。借助此源码包开发者能够直接查阅并编译集成该控件库深入理解数据网格的实现细节也可参考附带示例快速上手同时多版本兼容特性便于在旧项目或新项目中复用对提升数据库界面开发效率、解决表格控件定制问题具有实际价值。1. 为什么 Delphi 12.3 安装 EhLib 10.2.42 要选源码版EhLib 是 Delphi 生态里沿用最久的网格控件包之一DBGridEh 带来的点击列头排序、表尾合计、多选与下拉数据集几乎是桌面 MIS 系统的标配。标题里 v10.2.42 for Delphi 5-12 的 .src.rar 是源码分发包同一套代码覆盖从 Delphi 5 到 Delphi 12.3 的编译环境老项目迁移到新 IDE 时它一直是“控件”这一层最常被翻出来的包。对正在学习 Delphi 12.3 的人来说直接装编译好的版本确实省事但预编译 dcu 跟不上 12.3 的 RTL 版本时IDE 会以版本不匹配为由拒绝加载。自己从 .src 重建一次等于把运行时包、设计时包和 Library 搜索路径这套机制完整走通以后再装任何三方控件都是同一套路。2. EhLib 10.2.42 源码包结构从 .src.rar 到可编译的包组2.1 解压时用完整解压别用“释放到当前文件夹”拿到 EhLib.v10.2.42.for.Delphi5-12.src.rar 之后第一个动作是解压但解压方式直接决定后面能不能编译。图形界面里很多人图快在 WinRAR 里点了“解压到当前文件夹”结果 Common、Packages、Demos 全部平铺在一个目录里包组内相对路径全部失效。常见做法是用 7-Zip 的命令行完整解压保留压缩包内自带的多级目录7z x D:\Downloads\EhLib.v10.2.42.for.Delphi5-12.src.rar -oD:\Components\EhLibx表示以完整路径解压-o后跟目标根目录目标盘符后不要加结尾反斜杠。解压完成后先别急着打开包用资源管理器确认一下目录树根目录下应该有 Common核心单元与公共代码、Packages按 Delphi 版本分目录存放的 .dpk/.groupproj、Demos示例工程和说明文档。Common 是跨版本共享的源码目录编译任何版本时它都会被引用所以路径里不要出现中文、空格和超长目录名深路径在 12.3 里偶尔会触发 Windows 的 MAX_PATH 问题虽然新版 IDE 大多数情况能容忍但没必要赌。提示源码版与编译版最大的区别就在这里。编译版只需要把 .bpl/.dcu 拷进指定目录源码版则要求你把 .pas 和 .dpk 的搜索路径都暴露给 IDE因此目录是否规整直接影响后续每个工程。2.2 找到匹配 Delphi 12.3 的包组目录解压后打开 Packages 目录会看到按编译器版本命名的子目录常见命名规律是 D7、D2007、DXE2、D10_4、Delphi12 或 D12 这类缩写。Delphi 12.x 的 IDE 产品版本号是 29.0安装路径形如 C:\Program Files (x86)\Embarcadero\Studio\29.0所以目录里带 12、D12 之类字样的子目录就是当前要用的。注意 EhLib 10.x 只支持 Windows 原生 VCLLinux 和 macOS 目标不在支持范围内Delphi 12.3 里只用 Win32/Win64 平台即可。进入对应目录后优先找 .groupproj 文件它是 IDE 的包组工程一个包组里通常串了运行时包和设计时包两个项目构建顺序已经写好。设计时包的名字一般带 Dsgn 或 Design 标记它负责把控件注册到 IDE 的工具面板里运行时包则是普通 bpl最终程序运行时按需加载。内容类型作用Common 目录源码EhLib 核心单元编译期必须进搜索路径Packages\Delphi12 等工程12.x 对应的 .dpk 与 .groupprojDemos/Examples示例每个控件的使用范例验证安装最快路径包内历史说明文档版本兼容性与修复记录升级前必读2.3 编译前先检查的 3 个前提第一确认当前 IDE 是 Delphi 12.x 而不是 11.x组件安装报错有一半来自版本判断错误。第二检查 Tools Options Language Delphi Library 里 Win32 与 Win64 的搜索路径是否包含 Common 目录这一项在后续所有依赖 EhLib 的工程里都要生效建议把 Common 和包组所在目录都加进去。第三确认 Windows SDK 与 12.3 自带的工具链一致组件包一般不依赖第三方 SDK但如果你手动改过 IDE 的 Platform 配置先恢复默认再编译否则会看到一堆找不到单位文件的错误排查起来反而浪费时间。3. Delphi 12.3 编译安装 EhLibIDE 与 msbuild 两条路径3.1 用 IDE 包组一次编译打开 Delphi 12.3选择 File Open指向 Packages\Delphi12\EhLib.groupproj以实际文件名和目录为准找不到 groupproj 就直接打开同名 .dpk。项目树里会列出运行时包和设计时包先对运行时包执行 Build再对设计时包执行 Build。构建顺序不能反过来设计时包在 uses 里引用运行时包的单元运行时包还没生成时设计时包编译会直接失败。构建成功后对设计时包执行 Component Install Packages在对话框里点 Add定位到包组输出目录下刚生成的 .bpl 文件。添加成功的标志是列表中出现 EhLib 相关包名并且工具面板的 Search 框输入 DBGridEh 能搜到控件。到这里 IDE 层面已经能用但别急着关 IDE还要把 Common 目录加进 Library 搜索路径否则新建工程拖控件后编译会报找不到单位文件。常见做法是把输出目录也加进搜索路径这样 .dcu 和 .bpl 的查找都覆盖到。3.2 命令行构建rsvars.bat 加 msbuild团队环境或自动化构建里用 IDE 点鼠标不够可靠一条命令重建才是能重复执行的方式。Delphi 每个版本都自带 rsvars.bat它负责把编译器和 msbuild 的路径注入当前命令行环境12.3 对应的脚本在 Studio\29.0\bin 下call C:\Program Files (x86)\Embarcadero\Studio\29.0\bin\rsvars.bat cd /d D:\Components\EhLib\Packages\Delphi12 msbuild EhLib.groupproj /t:Rebuild /p:ConfigRelease /p:PlatformWin32第一行必须用 call 而不是直接执行因为 rsvars.bat 要往当前控制台环境变量里写内容第三行 /t:Rebuild 表示先删后建避免旧 dcu 干扰/p:Platform 可以换成 Win64 得到 64 位版本。命令行构建完设计时包的注册还需要 IDE 参与因为包注册本质是把信息写进 IDE 的注册表项所以自动化环境里一般做完编译构建再在开发机上手动做一次 Install Packages。注意rsvars.bat 里的路径如果遇到 Program Files 空格被截断通常是因为控制台编码或引号嵌套问题检查 call 那一行是否保留了完整引号即可。3.3 装完必须检查的 3 处路径组件能拖到窗体上不代表工程能编译也不代表运行时能找到包下面这张表是每次装完 EhLib 后我都会过一遍的配置。配置项位置推荐值单元搜索路径Tools Options Library加入 Common 与 Packages\Delphi12包输出目录包工程的 Project Options统一放到包的 Win32\Release 下工程级搜索路径Project Options Delphi Compiler不写死绝对路径用相对路径或环境变量要理解为什么有三处Options 里的 Library 路径服务于 IDE 全局所有工程都能找到控件单元包输出目录决定 bpl 和 dcu 落在哪跨机器拷贝时只带这一个目录工程级搜索路径则用来处理针对特定项目的额外源码目录。三者职责不同缺一个会在不同阶段报错。全局路径配好之后新建一个空 VCL 工程拖一个 DBGridEh 到窗体上直接 F9能跑起来说明组件部分已经完整。4. 用 DBGridEh 与 MemTableEh 把表格控件做到排序、合计、多选4.1 为什么是 DBGridEh 而不是 TDBGrid普通的 TDBGrid 是 VCL 自带控件编辑、排序、合计这些能力几乎为零程序员要靠 SQL 或第三方查询结果去弥补。EhLib 的 DBGridEh 把列头点击排序、底行合计、多选复选框、行高亮这些交互做成了属性开关几个参数一开就是企业级表格。它替换 TDBGrid 时保持 DataSource 接口不变原有 TField、TColumn 的绑定逻辑可以平移。对做进销存、后台管理类系统的团队来说这种“换一个控件、交互厚一层”的收益非常直接。4.2 最小可运行示例内存表驱动下面这段代码在窗体的 FormCreate 里配置一个 TMemTableEh 作为数据源再把 DBGridEh 接上去。TMemTableEh 是 EhLib 自带的内存数据集不需要数据库连接就能验证全部网格特性是最合适的学习 Delphi 入门起点。procedure TForm1.FormCreate(Sender: TObject); begin MemTableEh1.FieldDefs.Add(ID, ftInteger); MemTableEh1.FieldDefs.Add(Region, ftString, 20); MemTableEh1.FieldDefs.Add(Sales, ftFloat); MemTableEh1.CreateDataSet; MemTableEh1.AppendRecord([1, 华东, 12345.6]); MemTableEh1.AppendRecord([2, 华北, 9850.25]); MemTableEh1.AppendRecord([3, 华南, 15670.8]); DataSource1.DataSet : MemTableEh1; DBGridEh1.DataSource : DataSource1; DBGridEh1.AutoSort : True; // 点击列头排序 DBGridEh1.SortLocal : True; // 本地内存排序 DBGridEh1.FooterRowCount : 1; // 显示合计行 DBGridEh1.SumList.Active : True; // 激活统计列表 DBGridEh1.OptionsEh : DBGridEh1.OptionsEh [dghAutoSortMarking]; end;代码里的要点FieldDefs 先声明字段再 CreateDataSetTMemTableEh 会按这些定义生成真实的数据结构SortLocal 表示排序由 EhLib 在内存里完成不需要服务器参与FooterRowCount 与 SumList 组合起来网格底部会出现一个统计行数字型列自动求和。OptionsEh 里的 dghAutoSortMarking 会在排序列头画出箭头标记这是用户感知最强的交互点。4.3 高频属性参数表属性作用常用值AutoSort是否允许点击列头排序TrueSortLocal是否在本地排序配合 AutoSort 使用TrueFooterRowCount表尾合计行数1SumList.Active是否统计数字列TrueTitleParams.SortMarkerStyle排序箭头样式smstThemeDefinedOptionsEh.dghAutoSortMarking显示列头排序状态标记加入 OptionsEh这几个参数是所有 DBGridEh 工程的第一批配置。SortLocal 需要谨慎设定数据量大且数据库端已有索引时本地排序会把整表数据在内存里重排几十万行会卡顿此时应把 SortLocal 设为 False让排序动作以 SQL 形式回传数据库。4.4 从数据库取数MemTableEh 与 TDataSetDriverEh 的配合网格控件本身不关心数据从哪来所以实际项目里 TMemTableEh 通常不手工插数据而是从 FireDAC 或 ADO 查询结果装载。常见做法是使用 TDataSetDriverEh 把客户端数据集与 Provider 对接也可以直接调用 TMemTableEh 的装载方法MemTableEh1.Close; MemTableEh1.LoadFromDataSet(FDQuery1); MemTableEh1.Open;LoadFromDataSet 会把当前数据集的字段结构与数据一次性复制进内存表之后断开数据库连接仍可浏览编辑适合做离线编辑后统一回写。子控件间距、行高和字体这类外观问题统一在 DBGridEh 的 Columns 编辑器里按列设置不需要写代码。这套“查询取数进内存表、网格负责展示交互”的组合是 EhLib 在桌面应用里最常见的布阵方式。5. 源码版 EhLib 的 5 个高频坑与安装验证5.1 坑一旧版本 dcu 被当成新文件用源码包解压后有些版本会自带编译好的 dcu 目录直接把它拷进 12.3 的库路径会报 dcu 版本不兼容或找不到单位文件。排查时先删掉所有旧 dcu再用第 3 节的命令全量 Rebuild不要只 Build 单个包包组级重建才能保证依赖链全部刷新。5.2 坑二设计时包与运行时包顺序颠倒或漏装只装了运行时包IDE 面板搜不到控件只装设计时包拖控件时提示找不到运行时 bpl。注意先运行时后设计时的顺序并在 Install Packages 对话框确认两项都在列表里。组件装在哪个用户账户下也值得留意Delphi 12.3 以管理员权限安装时包注册信息写进对应账户的注册表区域切换用户后可能看到控件消失。5.3 坑三路径中文、空格与杀软误报bpl 输出目录一旦带中文部分版本在运行时会定位失败杀毒软件对 dcu/bpl 的实时扫描偶尔会把文件锁住导致 Build 中途失败报错没有具体单元名时优先怀疑这里把组件目录加入白名单再重跑。解压后的目录尽量保持安装包自带命名不要为了美观改成带有版本号中文备注的文件夹名。5.4 坑四Win64 目标没有单独编译EhLib 10.x 仍以 VCL 为主64 位目标需要单独构建一份 Win64 包否则工程切换平台时报找不到单元。命令行的写法就是把 /p:Platform 换成 Win64两个平台都构建一次。只做 32 位部署的团队可以暂时忽略但工程文件里残留的 Win64 配置会在某次切换时跳出来提前编译掉更省事。5.5 安装验证的最终检查清单IDE 的 Component Install Packages 里能看到 EhLib 运行时与设计时包工具面板 Search 输入 EhLib 或 DBGridEh 能列出控件随意拖 DBGridEh 到窗体F9 能编过并运行打开单元引用确认 DBGridEh 单元来自 Common 目录而非别处输出目录下存在对应版本的 bpl 文件且文件日期是本次构建时间最后一个技巧是部署层面的如果你希望最终 exe 不依赖客户端机器上的 bpl在程序开发结束后把工程配置里的“使用运行时包”勾掉重新编译一遍做完整静态链接反之多个小工具共享同一套 EhLib 时保留运行时包能显著减小 exe 体积。用静态链接跑一次冒烟测试验证数据库连接、排序与合计行都正常这次源码安装才算真正闭环。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进