ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Delphi 13.1 双框架控件 EhLib.VclFmx.13.0.015 安装配置与数据网格实战

Delphi 13.1 双框架控件 EhLib.VclFmx.13.0.015 安装配置与数据网格实战

简介:这份资源是面向 Delphi 13.1 开发者的 EhLib.VclFmx 13.0.015 组件集(无源码版),适合需要在 VCL 与 FireMonkey 双框架下快速构建数据感知界面的中高级开发者。它扩展了 Delphi 默认控件库,提供表格编辑、图表、数据驱动等控件,可减少从零搭建 UI 与数据处理逻辑的工作量。压缩包为 7z 格式,整体约 349.84MB,内含发布说明、readme、示例项目、帮助文档、样式文件、安装程序及数据驱动等模块,覆盖安装配置、API 查阅与效果预览等用途。目前已有 37 人学习关注。通过 Demos 示例可快速掌握控件用法,Hlp 帮助文件便于在 IDE 内检索接口,Installer 与 RADSpecific 则简化了在 RAD Studio 中的集成与注册流程,styles 与 DataDrivers 分别支撑界面统一与数据库交互,适合希望提升开发效率、专注业务逻辑的 Delphi 项目参考使用。

1. 拿到 EhLib.VclFmx.13.0.015 之后:这套 VCL/FMX 双框架控件到底能省多少事

如果你正在维护一套 Delphi 13.1 的老项目,又恰好被要求「表格要能分组、能过滤、能导出 Excel、还得在 FireMonkey 里跑起来」,那你大概率已经听过 EhLib 这个名字。这次流出的EhLib.VclFmx.13.0.015(no source).7z是一个不带源码的编译版控件包,同时覆盖 VCL 和 FMX 两套框架,版本号 13.0.015 对应的是 Delphi 13.1 的编译环境。它解决的核心问题很具体:把 TDBGrid 那套「能看不能打」的表格,升级成带排序、分组、过滤、汇总、打印、导出的一体化数据网格,而且同一套组件在 VCL 和 FMX 里都能用。

适合谁?一是手上压着 Delphi 13.1 存量项目、不想重写 UI 的维护型开发者;二是需要跨 VCL/FMX 复用表格逻辑的团队。不适合谁?如果你要改控件内部实现、做深度二次开发,no source 版本会让你很难受——这是后面避坑章要重点说的。先记住一句话:这套包的价值在「开箱即用的数据网格能力」,不在「可魔改的源码」。

2. 安装与包结构:从 7z 解压到 IDE 里出现 EhLib 面板

2.1 先看清压缩包里到底有什么

拿到 7z 之后别急着往 IDE 里装,先解压看目录结构。no source 版本的典型布局是:根目录下按框架分VCL和FMX两个子目录,每个子目录里再按 Delphi 版本分Delphi13之类的文件夹,里面是.bpl、.dcp、.dcu和设计期包。设计期包(通常叫EhLibVCLDesign.bpl或类似名字)负责在 IDE 里注册组件面板,运行期包负责实际功能。

目录/文件作用是否必须
VCL\Delphi13\*.bplVCL 运行期与设计期包是
VCL\Delphi13\*.dcu编译后的单元文件是
FMX\Delphi13\*.bplFMX 运行期与设计期包按需
*.dcp编译期依赖描述是
Readme/Install.txt安装顺序说明建议先读

常见做法是先把整个目录放到一个不带中文、不带空格的路径下,比如D:\Components\EhLib130。路径带空格或中文,是后面 IDE 找不到包的经典原因之一。

2.2 在 Delphi 13.1 里安装设计期包

安装分两步:先让 IDE 能找到编译产物,再加载设计期包。打开 Delphi 13.1,进Tools > Options > Language > Delphi > Library,在Library Path里把 VCL 和 FMX 对应的Delphi13目录都加进去。然后走Component > Install Packages > Add,选中设计期.bpl。

# 假设解压到 D:\Components\EhLib130 # 需要加入 Library Path 的两个目录(示例) D:\Components\EhLib130\VCL\Delphi13 D:\Components\EhLib130\FMX\Delphi13

逻辑说明:Library Path 是编译期查找.dcu的路径,不加进去,你自己的项目一uses EhLib就报找不到单元。设计期包加载后,组件面板会出现 EhLib 分类。参数上要注意:如果你同时装了旧版 EhLib,先把旧的设计期包卸载(Install Packages里 Remove),否则两个版本抢同一个单元名,编译时会出现「unit 重复」的玄学报错。

2.3 验证安装是否真的成功

别只看面板出现了就以为成了。新建一个 VCL 应用,拖一个TDBGridEh上去,连一个TDataSource和一个内存表(TFDMemTable或TClientDataSet),编译运行。能正常显示、能点列头排序,才算运行期包也通了。FMX 侧同理,拖TDBGridEh的 FMX 版本,在 FMX 应用里跑一遍。这一步能提前暴露「设计期能拖、运行期报错」的问题——no source 版本最常见的翻车点就是运行期包和设计期包版本不匹配。

3. TDBGridEh 核心能力落地:排序、分组、过滤、汇总怎么配

3.1 列级配置:把普通网格变成可操作数据表

TDBGridEh的能力几乎都挂在列对象上。双击网格打开Columns编辑器,每个TColumnEh都有一组开关。排序靠TitleButton和SortMarker,过滤靠STFilter(Smart Title Filter),分组靠Title上的拖拽区域。下面是一段典型的运行期配置代码。

// 假设 DBGridEh1 已绑定 DataSource1 procedure TForm1.ConfigGrid; var Col: TColumnEh; begin // 开启标题按钮,允许点击排序 DBGridEh1.TitleParams.SortMarkerStyle := smDefault; DBGridEh1.OptionsEh := DBGridEh1.OptionsEh + [dghColumnResize, dghColumnMove]; // 逐列配置 for Col in DBGridEh1.Columns do begin Col.Title.TitleButton := True; // 显示排序按钮 Col.STFilter.Visible := True; // 显示过滤下拉 Col.Footer.ValueType := fvtSum; // 页脚显示求和 end; // 开启分组面板(拖列头到此处分组) DBGridEh1.GroupPanel.Visible := True; end;

逻辑说明:TitleButton控制列头是否可点排序,STFilter.Visible打开智能过滤下拉,Footer.ValueType决定页脚是求和、计数还是平均。参数上,OptionsEh是个集合,dghColumnResize允许拖拽列宽,dghColumnMove允许拖动列顺序,按需加。分组面板GroupPanel.Visible打开后,用户把列头拖进去就自动分组,底层走的是数据集的分组逻辑,所以你的数据集得支持相应操作。

3.2 过滤与分组背后的数据流

很多人以为过滤是网格自己做的,其实 EhLib 的 STFilter 最终会转成数据集的Filter表达式或OnFilterRecord事件。也就是说,如果你的数据集是只读的、或者 Filter 属性被禁用,过滤下拉点了没反应。常见做法是给数据集设Filtered := True,并确保FilterOptions里包含foCaseInsensitive之类你需要的选项。

分组同理,它依赖数据集的排序。你拖列头分组时,EhLib 会尝试按该列排序再分组。如果数据集不支持排序(比如某些只进游标),分组会失败或表现异常。这一点在 FMX 侧尤其要注意,因为 FMX 的数据集绑定链路和 VCL 不完全一样。

3.3 汇总行与页脚

汇总有两种:页脚汇总(Footer)和分组汇总(GroupFooter)。页脚汇总针对整列,分组汇总针对每个分组。配置分组汇总时,要在DBGridEh1.SumList里加TSumItem,指定Column和SumType。

// 添加一个分组汇总项 var SumItem: TSumItem; begin SumItem := DBGridEh1.SumList.ActiveSumItems.Add; SumItem.Column := DBGridEh1.Columns[2]; // 第三列 SumItem.SumType := stSum; // 求和 SumItem.GroupLevel := 0; // 第一级分组 end;

逻辑说明:SumList.ActiveSumItems是当前生效的汇总集合,GroupLevel对应分组层级,0 是顶层。参数上,SumType支持stSum、stCount、stAvg等。注意:汇总项要生效,对应列必须参与分组或页脚显示,否则它算了也没地方显示。

4. 导出与打印:把网格数据落到 Excel 和纸张上

4.1 导出到 Excel 的两种路径

EhLib 自带导出能力,常见的是SaveToXLS系列方法,或者通过TDBGridEhExport组件。no source 版本里这些方法依然可用,因为它们编译在包里。典型调用:

// 导出当前网格到 xls procedure TForm1.ExportToExcel; begin DBGridEh1.SaveToXLS('D:\export\grid.xls', True); end;

逻辑说明:第二个参数True通常表示「带格式导出」,即保留列宽、字体、汇总行。参数上,如果你要导出 xlsx,得看这个版本是否支持SaveToXLSX,no source 版本不一定带最新格式支持,导出前先小数据量试一次。另一个坑是路径:导出目录必须已存在,方法不会自动建目录,路径不存在直接抛异常。

4.2 打印与打印预览

打印走DBGridEh1.Print或PrintPreview。打印前要配PrintParams,包括页边距、标题、页脚、是否打印分组。常见做法是先弹预览让用户确认,再真打印。

procedure TForm1.PrintGrid; begin DBGridEh1.PrintParams.Title := '数据报表'; DBGridEh1.PrintParams.Footer := '第 &p 页 / 共 &P 页'; DBGridEh1.PrintPreview; // 先预览 end;

逻辑说明:&p和&P是页码占位符,分别代表当前页和总页数。参数上,PrintParams里还能控制Margins、Orientation。注意:打印宽度受纸张限制,列太多时要么缩放到一页宽,要么分页。no source 版本里打印引擎是编译好的,遇到复杂分组打印错位,基本只能调列宽和分组层级,改不了内部逻辑。

4.3 导出与打印的边界

导出和打印都依赖网格当前的数据视图。也就是说,如果你在网格上做了过滤,导出的就是过滤后的数据;如果做了分组折叠,折叠掉的行是否导出取决于参数。这一点在交付给业务方前一定要确认,否则「我明明看到 100 行,导出只有 30 行」就是典型的血泪经验。建议在导出前给用户一个确认提示,说明当前是「导出全部」还是「导出当前视图」。

5. 避坑与排查:no source 版本最容易翻车的五个点

5.1 现象:装完包,组件面板有,但一编译就报找不到单元

原因:Library Path 没加全,或者加了但顺序不对,IDE 先找到了旧版 EhLib 的.dcu。解决:检查Tools > Options > Library里 EhLib 路径是否在旧路径之前,必要时把旧版目录整个移走。另外确认你加的是Delphi13目录,不是Delphi12。

5.2 现象:设计期能拖控件,运行期一跑就报「包加载失败」

原因:设计期包和运行期包版本不匹配,或者运行期.bpl没在系统 PATH 或应用目录里。解决:把运行期.bpl复制到编译输出目录,或在项目里设Runtime Packages指向正确路径。no source 版本尤其容易出这个问题,因为你看不到包内部版本号,只能靠目录名判断。

5.3 现象:STFilter 过滤下拉点了没反应

原因:数据集Filtered为 False,或FilterOptions不允许。解决:设DataSet.Filtered := True,并检查FilterOptions。如果数据集是只读游标,过滤本身就不支持,得换数据集或改用内存表。

5.4 现象:FMX 下网格显示空白或列错位

原因:FMX 的渲染链路和 VCL 不同,某些 VCL 专属属性在 FMX 下无效,或者 FMX 包没装全。解决:确认 FMX 设计期包和运行期包都装了,且项目引用的 FMX 单元版本一致。FMX 下尽量用 FMX 专属的配置项,别照搬 VCL 的属性设置。

5.5 现象:导出 Excel 报「无效路径」或文件打不开

原因:导出目录不存在,或导出格式与扩展名不匹配(比如用 xls 方法存了 xlsx 扩展名)。解决:导出前用ForceDirectories建目录,扩展名和方法保持一致。导出后如果 Excel 提示「文件格式与扩展名不符」,就是格式和方法对不上。

6. 进阶技巧:用事件和自定义绘制把网格调到「能用」以上

no source 版本虽然改不了内部,但事件和自定义绘制给了足够的扩展空间。最实用的两个入口是OnDrawColumnCell和OnGetCellParams。前者让你控制单元格怎么画,后者让你控制单元格的状态(颜色、只读、字体)。

procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumnEh; State: TGridDrawState); begin // 根据数据值改变行背景色 if Column.Field.AsFloat < 0 then begin DBGridEh1.Canvas.Brush.Color := clRed; DBGridEh1.Canvas.FillRect(Rect); end; DBGridEh1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end;

逻辑说明:先判断条件改画刷颜色,填充背景,再调DefaultDrawColumnCell画默认内容,否则内容会被覆盖掉。参数上,State里包含gdSelected、gdFocused等,可以据此区分选中行和普通行。这个模式在 VCL 下很稳,FMX 下要用 FMX 的画布接口,写法不同但思路一致。

另一个进阶点是OnGetCellParams,它能在绘制前改单元格的字体和颜色,比在OnDrawColumnCell里硬画更轻量。我一般会优先用OnGetCellParams做条件着色,只有需要画进度条、图标这类非文本内容时才上OnDrawColumnCell。

验证方法:改完事件后,别只看静态截图。用键盘上下键快速滚动,看有没有闪烁或错位;用鼠标拖列宽、拖分组,看事件是否被正确触发。no source 版本下,事件是你能控制的最后一层,把这一层用足,大部分业务需求都能覆盖。

从那以后我每次装这类 no source 控件包,都强制先在一个空白项目里跑一遍「拖控件、连数据、排序、过滤、导出」的最小闭环,确认运行期包真的通了,再往正式项目里引。希望帮到你。

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

返回列表