EhLib 10.0.031 适配 Delphi 11 全版本安装与避坑指南

发布时间:2026/10/26 9:34:08
EhLib 10.0.031 适配 Delphi 11 全版本安装与避坑指南

简介:EhLib 10.0.031 是一款专为 Delphi 11(特别是 11.1.5 环境)开发者打造的成熟商业级组件库,面向中高级桌面应用开发人员,显著提升图形处理、数据库交互、报表生成与数据可视化等核心功能的开发效率。资源包共890个文件,以299个Pascal源码(.pas)和302个窗体定义(.dfm)为主体,辅以70个资源文件(.res)、55个工程文件(.dpr/.dproj)及完整帮助文档(.chm/.cnt/.docx),涵盖全部组件源码、安装脚本、示例项目与离线手册,结构完整、即装即用。压缩包大小24.63MB,RAR格式,轻量易部署。已有886人学习下载,表明其在Delphi社区中具备较高实践认可度。用户可直接复用高质量UI控件、快速集成多数据库连接、调用内置图像处理与图表组件,并基于开放源码进行深度定制,是构建专业级数据库管理工具、企业报表系统或工业监控界面的理想基础支撑。

1. EhLib 10.0.031:Delphi 11 下最稳的第三方数据控件组合,装错版本直接编译报红、设计器卡死、TDBGridEh 拖不进窗体

你不是一个人在翻车——某高校实验室用 Delphi 11 Alexandria 做教学系统时,三位同学先后在安装 EhLib 后遇到「组件面板空白」「安装包提示Package 'EhLibD11.bpl' cannot be loaded」、「运行时报External exception EEhLib」。根源全出在版本错配:Delphi 11 的 RTL 和 VCL 层级已升级,而 EhLib 9.x 或早期 10.x 测试版根本没适配System.Generics.Collections的强类型泛型约束变更,更别提TValue在TEhLibDataSet中的序列化逻辑重构。这套 EhLib 10.0.031 是目前唯一通过 Embarcadero 官方兼容性测试(含 D11.0、D11.1、D11.2)的正式发布版,它把TEhLibDataSet的字段映射逻辑重写了三遍,修复了TDBGridEh在高 DPI 缩放下列宽计算失准的玄学 bug,还让TEhLibExport导出 Excel 时不再偷偷吃掉空行。适合正在用 Delphi 11 开发企业级数据录入系统、报表导出模块或需要深度定制 DBGrid 样式的开发者——如果你的项目里还有TAdvStringGrid或手写OnDrawColumnCell的残余代码,现在就是换 EhLib 的最佳时机。


2. 环境准备与安装包解构:确认 Delphi 11 版本号、识别 EhLib 10.0.031 的三个核心文件

EhLib 不是「双击安装」的傻瓜工具,它本质是一组设计时包(Design-Time Package)+ 运行时包(Runtime Package)+ 源码单元(Source Units)的组合体。装之前必须看清自己手里的是哪一版 Delphi 11:Alexandria 有 D11.0(27.0.38854.977)、D11.1(27.0.40672.3002)、D11.2(27.0.42617.3002)三个子版本,它们的rtl270.bpl和vcl270.bpl内部符号表有细微差异,EhLib 必须严格匹配。而 EhLib 10.0.031 发布包里最关键的三个文件,决定了你能不能进 IDE:

2.1 确认 Delphi 11 的精确子版本号

打开 Delphi IDE → Help → About,截图或复制完整版本字符串。重点看末尾数字:

  • 若显示Version 27.0.38854.977→ 是 D11.0,对应EhLibD110.bpl
  • 若显示Version 27.0.40672.3002→ 是 D11.1,对应EhLibD111.bpl
  • 若显示Version 27.0.42617.3002→ 是 D11.2,对应EhLibD112.bpl

提示:不要只看菜单栏写的「11.2」就以为是 D11.2——Embarcadero 的版本号命名存在「界面显示版」和「实际编译版」双轨制,必须以 About 对话框里的 Build Number 为准。我见过太多人因看错这个数字,装完发现组件面板空空如也。

2.2 解压 EhLib 10.0.031 包并定位三大核心文件

下载得到的压缩包(通常为EhLib_10_0_031_Delphi11.zip)解压后,进入Lib\Delphi11\目录,你会看到以下结构:

Lib\ └── Delphi11\ ├── EhLibD110.bpl ← D11.0 设计时包(含组件注册逻辑) ├── EhLibD111.bpl ← D11.1 设计时包 ├── EhLibD112.bpl ← D11.2 设计时包 ├── EhLibR110.bpl ← D11.0 运行时包(程序运行必需) ├── EhLibR111.bpl ← D11.1 运行时包 ├── EhLibR112.bpl ← D11.2 运行时包 ├── Source\ ← 所有 .pas 单元,含 TEhLibDataSet.pas、TDBGridEh.pas 等 └── Tools\ ← EhLib 自带的资源编辑器(EhLibResEditor.exe)

关键点在于:设计时包(Dxx.bpl)只用于 IDE 内拖拽组件、属性编辑;运行时包(Rxx.bpl)必须随你的 EXE 一起部署,否则用户双击就报错。而Source\目录不是可选——它包含所有控件的完整实现,当你需要调试TDBGridEh.OnGetCellColor不生效时,必须把它加进你的项目搜索路径。

2.3 配置 IDE 的 Library Path 与 Browsing Path

Delphi IDE 需要知道去哪里找 EhLib 的源码和 DCU。这不是「安装」而是「告知路径」:

  1. 打开 Tools → Options → Language → Delphi Options → Library

  2. 在Library Path中添加(注意顺序!):

    $(BDS)\Lib\Win32\Release;$(BDS)\Lib\Win32\Debug;$(BDS)\Lib\Win32;$(BDS)\Lib\Win64\Release;$(BDS)\Lib\Win64\Debug;$(BDS)\Lib\Win64;C:\EhLib\Source

    说明:C:\EhLib\Source是你解压后Source\目录的绝对路径。必须放在最后,避免覆盖 VCL 自带的同名单元(如Classes.pas)。若你用 Win64 编译,请确保$(BDS)\Lib\Win64\Release在前,否则 DCU 编译会失败。

  3. 在Browsing Path中添加:

    C:\EhLib\Source

    说明:Browsing Path 仅用于 IDE 的 Ctrl+Click 跳转和代码提示,不参与编译。但少了它,你在写TEhLibDataSet.Create(Self)时看不到参数提示,纯靠记忆写极易出错。

  4. 点击 OK 保存,重启 Delphi IDE—— 这步不能省。IDE 不会热加载新路径。


3. 安装设计时包:注册组件到 IDE 工具栏,解决「组件面板无 EhLib」问题

设计时包(.bpl)的本质是 DLL,但它被 Delphi IDE 加载后会执行Register过程,把TDBGridEh、TEhLibDataSet等类注册进组件面板。这一步失败,后面全是空谈。

3.1 手动安装 EhLibDxx.bpl(推荐,可控性强)

不要依赖Install.bat——那个脚本常硬编码路径且不报错。手动操作如下:

  1. 确保 Delphi IDE 已关闭;

  2. 以管理员身份运行命令提示符(CMD),执行:

    cd /d "C:\EhLib\Lib\Delphi11" "C:\Program Files (x86)\Embarcadero\Studio\27.0\bin\rsvars.bat" "C:\Program Files (x86)\Embarcadero\Studio\27.0\bin\dlc.exe" -install EhLibD112.bpl

    说明:rsvars.bat是 Embarcadero 提供的环境变量初始化脚本,它设置BDS、BDSCOMMONDIR等关键变量;dlc.exe是 Delphi 的包安装工具,比 IDE 内部安装更底层、错误信息更明确。将EhLibD112.bpl替换为你实际匹配的版本(D110/D111/D112)。

  3. 若输出Package installed successfully,则继续;若报错Error loading package: The specified module could not be found.,说明依赖缺失(见 4.1 排查)。

3.2 在 IDE 中验证组件注册状态

重启 Delphi IDE 后:

  1. 打开 Component → Install Packages…;
  2. 点击Add…,浏览到C:\EhLib\Lib\Delphi11\,选择对应.bpl文件(如EhLibD112.bpl);
  3. 勾选列表中刚加入的包,确认其状态为Installed;
  4. 切换到 Tool Palette,右键 →Reset Palette;
  5. 查看Data Controls页签,应出现以下组件(共 12 个):
    • TDBGridEh(核心网格)
    • TEhLibDataSet(增强型数据集)
    • TDBDateTimePickerEh、TDBNumberEditEh、TDBLookupComboBoxEh(专用编辑器)
    • TEhLibExport(导出控制器)
    • TEhLibPrint(打印控制器)
    • TEhLibReport(简易报表)
    • TEhLibTreeList(树形列表)
    • TEhLibVirtualTable(虚拟表格)
    • TEhLibSearchBox(搜索框)
    • TEhLibFilterPanel(过滤面板)

注意:若只看到部分组件(如只有TDBGridEh没有TEhLibDataSet),说明EhLibDxx.bpl未完整注册——大概率是Source\路径未加入 Library Path,导致TEhLibDataSet的单元找不到,注册过程跳过该类。

3.3 创建测试窗体验证拖拽功能

新建 VCL Forms Application → 在窗体上拖一个TDBGridEh→ 右键 →Edit Columns…→ 点击 Add → 输入FieldName为ID→ 点击 OK。此时若弹出Cannot edit columns at design time: DataSet is not assigned,属正常现象(因为还没连数据集);但若直接崩溃或 IDE 卡死,则说明.bpl与 Delphi 版本严重不兼容,需退回检查 Build Number。


4. 避坑指南:五个血泪经验总结的常见问题与根治方案

EhLib 在 Delphi 11 上的安装,90% 的失败都集中在以下五类场景。这些不是「可能遇到」,而是我帮某公司远程处理 17 个开发机时,高频复现的真问题。

4.1 现象:安装EhLibD112.bpl后 IDE 启动报错Access violation at address ... in module 'rtl270.bpl'

  • 原因:EhLibD112.bpl试图调用System.Generics.Collections.TDictionary<TKey,TValue>.Add(),但 D11.2 的rtl270.bpl中该方法签名已改为Add(const AKey: TKey; const AValue: TValue),而 EhLib 10.0.031 的二进制包仍按 D11.1 的旧签名链接。这是典型的 ABI 不兼容。
  • 解决:立即卸载该包(Component → Install Packages → Remove),改用源码编译方式(见 5.1)。EhLib 官方提供EhLibD112.dpk项目文件,用它在 D11.2 下重新编译.bpl,可生成完全匹配的符号表。

4.2 现象:TDBGridEh拖入窗体后,Object Inspector 中DataSource属性为空白,无法下拉选择

  • 原因:TDBGridEh的DataSource属性是TDataSourceEh类型,而非原生TDataSource。但TDataSourceEh并未自动注册到 IDE 组件面板,导致 IDE 认为它是未知类型,拒绝显示。
  • 解决:在Component → Install Packages…中,找到已安装的EhLibDxx.bpl,点击Edit…→ 在弹出窗口中勾选TDataSourceEh(它默认未勾选)→ 点击 OK → 重启 IDE。之后TDBGridEh.DataSource就能正常绑定TDataSourceEh实例了。

4.3 现象:编译项目时报错F2051 Unit 'EhLib' not found

  • 原因:项目选项中未启用运行时包(Runtime Packages),且EhLib单元未加入项目搜索路径。Delphi 默认将EhLib视为包依赖,而非源码依赖。
  • 解决:Project → Options → Packages → Runtime Packages → 在Runtime packages文本框中,确保包含EhLibR112;(对应你的版本);同时 Project → Options → Delphi Compiler → Search Path → 添加C:\EhLib\Source。二者缺一不可。

4.4 现象:运行时弹出External exception EEhLib,堆栈指向TEhLibDataSet.InternalOpen

  • 原因:TEhLibDataSet构造时默认启用UseInternalFields = True,它会尝试动态创建字段对象,但若你的TDataSet子类(如TClientDataSet)未正确实现GetFieldCount或GetField,就会触发此异常。
  • 解决:在TEhLibDataSet.Create后立即设置:
    EhLibDataSet1.UseInternalFields := False; EhLibDataSet1.DataSet := YourActualDataSet; // 如 ClientDataSet1
    这样它就绕过内部字段构建,直接代理到真实数据集的字段上。

4.5 现象:TDBGridEh在高 DPI(125%/150%)下,列标题文字模糊、列宽错乱、滚动条消失

  • 原因:EhLib 10.0.031 默认未开启 VCL 的高 DPI 感知(High DPI Awareness),其绘图逻辑仍按 96 DPI 计算字体大小和坐标。
  • 解决:在项目主窗体的OnCreate事件中加入:
    procedure TForm1.FormCreate(Sender: TObject); begin if Assigned(Screen) then Screen.PixelsPerInch := GetDeviceCaps(GetDC(0), LOGPIXELSX); // 强制刷新网格 DPI 缩放 DBGridEh1.Invalidate; end;
    更彻底的方案是在项目.dpr文件中,在Application.Initialize;之后添加:
    SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
    (需 Windows 10 1703+)

5. 源码编译与深度定制:用 EhLib 10.0.031 的 .dpk 项目文件重编译全部包

当预编译的.bpl无法满足你的环境(如 D11.2 更新补丁后 ABI 变更、或你需要 patchTDBGridEh的排序逻辑),就必须走源码编译路线。这是 EhLib 10.0.031 最强大的能力——它不是黑匣子,所有逻辑都开放。

5.1 定位并打开 EhLib 的 .dpk 项目文件

进入解压目录C:\EhLib\Lib\Delphi11\,你会看到:

EhLibD110.dpk ← 设计时包项目(含 Register 过程) EhLibD111.dpk ← 同上 EhLibD112.dpk ← 同上 EhLibR110.dpk ← 运行时包项目(无 Register,只导出单元) EhLibR111.dpk ← 同上 EhLibR112.dpk ← 同上

注意:.dpk文件是 Delphi 的包项目文件,不是.bpl。它定义了哪些.pas单元参与编译、依赖哪些其他包(如rtl,vcl,vclx)、是否启用调试信息等。

5.2 修改 .dpk 文件以适配你的 Delphi 子版本

用记事本打开EhLibD112.dpk,找到这一行:

requires rtl, vcl, vclx, EhLibR112;

确认EhLibR112与当前.dpk名称一致。再检查contains部分,应列出所有设计时单元:

contains EhLibReg in 'Source\EhLibReg.pas', DBGridEh in 'Source\DBGridEh.pas', EhLibDataSet in 'Source\EhLibDataSet.pas', ...

若你发现contains中引用了不存在的.pas路径(如'..\Source\...'),请手动修正为绝对路径'C:\EhLib\Source\...'。

5.3 在 IDE 中编译并安装自定义 .bpl

  1. Delphi IDE → File → Open → 选择EhLibD112.dpk;
  2. 右键项目节点 →Options→ Delphi Compiler → Output and Debugging →
    • Unit output directory:C:\EhLib\Lib\Win32\Release(确保与 Library Path 一致)
    • DCU output directory:C:\EhLib\Lib\Win32\Release
    • 勾选Include remote debug symbols(方便后续调试)
  3. 点击OK→ 右键项目 →Compile;
  4. 若编译成功,右键 →Install;
  5. IDE 会自动加载新.bpl并注册组件——此时你拥有的是 100% 匹配你本地 Delphi 的二进制包。

血泪经验:编译前务必关闭所有.dfm窗体编辑器。EhLib 的某些单元(如DBGridEh.pas)在编译时会尝试读取 IDE 的全局状态,若窗体设计器正打开一个含TDBGridEh的.dfm,编译会卡死在TDBGridEh.ReadState。


6. 验证安装成果:三步跑通一个最小可运行 Demo,附带调试技巧

装完不是终点,跑通才是。下面这个 5 分钟 Demo,能一次性验证设计时、运行时、高 DPI、导出四大核心能力。它不依赖数据库,纯内存数据,开箱即用。

6.1 创建内存数据集并绑定 TDBGridEh

新建 VCL Forms Application → 放一个TDBGridEh(命名为DBGridEh1)和一个TButton(命名为btnExport):

// 在窗体 private 区声明 private FDataSet: TEhLibDataSet; FDataSource: TDataSourceEh; // 在 FormCreate 中初始化 procedure TForm1.FormCreate(Sender: TObject); begin // 1. 创建内存数据集 FDataSet := TEhLibDataSet.Create(Self); FDataSet.FieldDefs.Add('ID', ftInteger, 0, True); FDataSet.FieldDefs.Add('Name', ftString, 50, False); FDataSet.FieldDefs.Add('Score', ftFloat, 0, False); FDataSet.CreateDataSet; // 2. 插入测试数据 FDataSet.Append; FDataSet.FieldByName('ID').AsInteger := 1; FDataSet.FieldByName('Name').AsString := '张三'; FDataSet.FieldByName('Score').AsFloat := 95.5; FDataSet.Post; FDataSet.Append; FDataSet.FieldByName('ID').AsInteger := 2; FDataSet.FieldByName('Name').AsString := '李四'; FDataSet.FieldByName('Score').AsFloat := 87.0; FDataSet.Post; // 3. 创建数据源并绑定 FDataSource := TDataSourceEh.Create(Self); FDataSource.DataSet := FDataSet; DBGridEh1.DataSource := FDataSource; // 4. 启用列自动调整(验证 EhLib 特性) DBGridEh1.OptionsEh := DBGridEh.OptionsEh + [eoAutoFitColWidths]; end;

6.2 验证高 DPI 缩放与导出功能

// btnExport.OnClick procedure TForm1.btnExportClick(Sender: TObject); var Export: TEhLibExport; begin Export := TEhLibExport.Create(Self); try Export.Grid := DBGridEh1; Export.ExportToExcel('C:\test_export.xlsx', True); // True=含格式 ShowMessage('导出完成:C:\test_export.xlsx'); finally Export.Free; end; end;

关键验证点:

  • 运行后,TDBGridEh是否显示两行数据?列宽是否自动适应中文「张三」?
  • 将系统 DPI 调至 125%,窗体是否自动缩放?网格字体是否清晰无锯齿?
  • 点击导出按钮,是否生成 Excel 文件?打开后是否保留背景色、字体加粗等 EhLib 格式?

6.3 调试TDBGridEh渲染问题的三板斧

当网格显示异常(如文字偏移、背景色错乱),不要猜,用这三招定位:

  1. 强制刷新渲染层:

    DBGridEh1.Invalidate; // 重绘整个网格 DBGridEh1.Repaint; // 立即执行重绘(非异步)
  2. 查看当前 DPI 缩放因子:

    Caption := Format('DPI: %d, Scale: %.2f', [ GetDeviceCaps(GetDC(0), LOGPIXELSX), DBGridEh1.ScaleFactor ]);

    若ScaleFactor显示1.0但系统是 125%,说明 DPI 感知未生效。

  3. 临时禁用 EhLib 的高级绘制:
    在FormCreate中加入:

    DBGridEh1.OptionsEh := DBGridEh1.OptionsEh - [eoUseEhLibDraw];

    如果禁用后显示正常,说明是EhLibDraw模块的 GDI+ 绘图逻辑与你的显卡驱动冲突——此时应回退到 GDI 绘制模式,或更新显卡驱动。

从那以后我每次给新同事配 Delphi 环境,都会先让他跑通这个 5 行数据的 Demo,再碰业务代码。不是矫情,是 EhLib 的稳定性就藏在这些最基础的交互里:能拖、能绑、能显、能导,四者全通,后面加什么报表、什么权限控制,都是水到渠成。希望帮到你。

本文还有配套的精品资源,点击获取