尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

EhLib VCL 11.1.015 安装实战:DBGridEh 表格控件从配置到排坑全指南

EhLib VCL 11.1.015 安装实战:DBGridEh 表格控件从配置到排坑全指南 简介在桌面数据库开发中表格控件是数据展示与交互的核心载体。Delphi 开发者常面临原生 TDBGrid 功能单薄、界面老旧、交互不便等痛点而第三方 VCL 控件库 EhLib 通过其核心组件 DBGridEh 提供了下拉选择、日期编辑、表头合并、自动合计、冻结列等丰富能力显著提升开发效率与用户体验。本文从基础概念出发解析 EhLib 的组件构成与工作原理并聚焦其在 Delphi 12.3 环境下的安装配置、版本迁移及常见问题排查。结合实际工程场景演示如何通过 FireDAC 动态 SELECT 查询、PDA 扫码数据接入及查找列联动构建高可用数据管理界面。无论你是从老项目迁移还是正在应对控件版本冲突这篇指南均能提供可落地的参考方案。1. EhLib.VCL 是什么——老 Delphi 开发者的“数据库显示神器”先聊个实际场景。你用 Delphi 写一个管理软件需求很简单主从表左面是客户列表右面是对应订单订单要能下拉选产品分类日期字段最好带日历选择金额列要能按千分位显示还能原地排序、合计。你打开 Delphi 自带的 TDBGrid拖上去一看只能绑个 DataSource显示出来的效果跟二十年前没区别想要下拉框、日历、统计栏得自己写一堆派生类。这时候你就知道为什么绝大多数 Delphi 数据库项目里几乎都跑不掉一个第三方控件包——EhLib.VCL。EhLib.VCL 是一套基于 VCL 框架的数据库表格控件库核心控件是 DBGridEh极大增强了原生 TDBGrid 的能力。它解决了 Delphi 开发者在数据库表格展示与编辑场景里的长期痛点原生控件功能薄、界面老旧、交互单一、按列头排序要自己写事件、合并单元格要自己画。EhLib 把这些能力全部集成到控件自身你只要拖进来、设置几个属性就能得到一个像 Excel 一样灵活的表格。标题里给的是 EhLib.VCL 11.1.015 (Professional Edition)Professional 版本比免费版多了报表设计器、条码支持、TreeView 等高级模块。在这个时间点Delphi 12.3 已发布11.1.015 版本对 Delphi 12.3 的 IDE 集成、RTL 编译支持都做了完整适配Windows 11 下的显示效果也处理得不错。这篇文章就是基于这个版本结合我实际操作经验分享从安装到实战再到排坑的全过程。适合谁来读正在用 Delphi 12.x 做桌面数据库开发的人正打算把老项目的 DBGrid 迁移到 DBGridEh 的人以及所有被原生 DBGrid 限制折腾过的 VCL 开发者包括做 C Builder 的因为 EhLib 同样支持。2. 安装与环境配置——从压缩包到 IDE 正常显示控件栏2.1 解压后的目录结构怎么看你拿到的 EhLib.VCL 11.1.015 (Professional Edition).rar先解压。注意不要解压到中文路径或者带空格的深层目录我习惯放在 D:\Libs\EhLib_VCL_11_1_015路径短、无中文后面编译省心。解压后你会看到这几个核心目录Common公共单元和图像资源几乎所有包都依赖这里面的代码。Lib编译后 dcuh 文件默认输出目录还有 IDE 注册用的 dcp。Packages各版本 Delphi 对应的包工程.dpk都在这个目录下。Source核心源码目录里面按功能分成多个子目录比如DBGridEh、DBTreeEh、Reports等。Resources菜单图标、窗口图标等运行设计期编辑器要用到。Demos大量示例工程这是最好的学习入口我强烈建议你至少把 Demo\DBGridEh 下面的示例跑一遍。Professional 版本资源里还带了报表相关单元如 Reports 目录下的EhLibReports.pas等如果只是常规表格开发用不到这些可以先不管等真正需要报表功能时再研究。2.2 安装步骤——以 Delphi 12.3 为例安装 EhLib 这类控件本质就是编译它自带的包工程然后在 IDE 里注册设计期包。流程并不复杂但有个地方最容易踩坑我先说清楚。第一步打开 Delphi 12.3关闭当前所有项目然后通过File Open Project打开Packages目录下的Delphi 12.3子目录实际目录名是Delphi_12.3之类里面有几个.dpk文件EhLib.dpk设计期包负责把控件装进 IDE 组件面板。EhLibRuntime.dpk运行期包存放控件真正的实现代码。打开设计期包时 IDE 会提示“此包包含设计期代码是否安装到 IDE”点Install等编译完成工具栏上就会多出EhLib Controls或EhLib标签页里面排着 DBGridEh、DBComboBoxEh、DBDateTimeEditEh、DBTreeViewEh、DBLookupComboboxEh 等一系列控件。第二步要保证运行期包也被正确编进去顺序上通常让运行期包先编译。你可以先打开 EhLibRuntime.dpk点Compile编完之后再打开 EhLib.dpk点Install这样不容易出现依赖异常。我一开始图省事只安装了设计期包结果 IDE 一重启控件变成灰色——因为运行期包一直没注册进去。第三步把Common、Source下的路径加到 IDE 的 Library Path 中。Tools Options Environment Variables里加一个用户变量EhLib指向 D:\Libs\EhLib_VCL_11_1_015再到Tools Options IDE Library添加$(EhLib)\Common、$(EhLib)\Source、$(EhLib)\Lib这些路径。这一步的目的是让你后续自己写代码时能直接 uses 到 EhLib 的单元并找到对应的 dcuh 文件。表安装后必查的关键路径项配置项推荐值说明包工程路径Packages\Delphi_12.3\确认你的 Delphi 版本对应目录Library Path 追加D:\Libs\EhLib_VCL_11_1_015\Common公共单元头文件所在Library Path 追加D:\Libs\EhLib_VCL_11_1_015\Source各模块源码Library Path 追加D:\Libs\EhLib_VCL_11_1_015\Lib编译后 dcuh/dcp 输出目录Project OptionsInclude路径老项目迁移时常忘记配2.3 安装不到二十秒就报错的排查清单我见过很多人在安装阶段卡住其实无非那几类找不到System.Deployment.dll或Vcl.Imaging.jpeg等单元本质是 Library Path 没配全Delphi 自带的源码头路径被删过去 IDE Library 里加回$(BDS)\source\vcl这类。编译到一半提示E1026 File not found: Controls.dcu说明 IDE 找不到 VCL 相关 dcuh一般是Library Path里缺少了标准路径需要点Add Default恢复默认路径。安装成功后组件面板看不到设计期包未正确 Install重新打开 EhLib.dpk确认底部状态显示 “Package ... installed” 而不是 “compiled”。如果实在不行还有一个笨办法看看Packages\Delphi_12.3里的 README 或 Config 文件有时候会有针对特定版本说明。多看Demos里提供好的项目它们能保证在你这个环境里编译过。3. DBGridEh 核心实操——从“能显示”到“好用”的三个层次3.1 最简单的接入绑库、用字段、显示中文列名无论你用TFDQuery、TADOQuery还是TUniQueryDBGridEh 的使用方式和原生网格一样仍然是“数据源 数据集 网格”的连接模式放一个TFDConnection配置驱动为 MSSQL/MySQL/SQLite 等。放一个TFDQuerySQL 里写SELECT * FROM orders注意你最终发布时最好显式给字段列表不要SELECT *尤其这个项目里热搜词有 “delphi select查询”我在这里刻意提一句DBGridEh 对 SELECT 的字段名和字段类型非常敏感SELECT *在频繁刷新时会导致列重建交互体验很差。放一个TDataSource把DataSet指向FDQuery1再把数据源的AutoEdit设为 False防止一敲键盘就进入编辑态。放一个TDBGridEh把DataSource指向DataSource1运行你就能看到数据了。这时候列名可能是英文字段名。你可以在设计期把 DBGridEh 的列自动生成右键Columns Editor Add All Fields然后逐个改Title.Caption为中文。实际项目中推荐在数据集字段TField的DisplayLabel上设置中文名这样多个网格复用同一数据源时列名自动统一。3.2 让列更友好下拉框、日期选择、按钮列DBGridEh 的核心能力在列的ColumnDefValues和单元格编辑器配置上。比如一个“订单状态”列你是想让用户直接敲字还是让他从下拉列表里选直接敲程序要写一堆校验用下拉数据一致性有保障而且录入速度快。实现方式很简单选中这一列设置ColumnDefValues.AutoDropDown : True然后设PickList属性在值编辑器里添加未处理、已发货、已签收几项。运行后该列单元格出现下拉箭头选择即填值完全不用写代码。这是我给所有初学者的第一个推荐技巧。日期列就用DBDateTimeEditEh做列编辑器。怎么挂在列的EditButtons里添加按钮设置Style : ebsMinusEh或ebsDropDownEh然后OnEditButtonClicked里DBDateTimeEditEh1设置给网格列。或者更简单用TColumnEh的DateEdit属性设置DBDateTimeEditEh1作为默认编辑器。设置后该列自动带一个小日历图标点击就弹出日期选择。如果想做按钮操作比如“查看详情”在列的ButtonStyle设为cbsAuto然后在OnCellClick里判断Column.FieldName Action弹出对应窗口即可。不要用TButtonColumn这种直接做因为它的按钮宽度、事件回调有时不如OnCellClick灵活。3.3 表头合并、自动合计、冻结列——界面高级感就靠这三个功能这三个功能是 DBGridEh 最有辨识度的地方。表头合并先设置DBGridEh1.Height加大然后右键网格选择Columns Editor在空白处右键Add MultiTitle这时网格上方多了一行“空标题”结构。你可以在这一行里按列合并比如把“客户信息”这个标题跨多列合并成一个大的表头。操作非常简单选中要合并的多列右键Merge Title Cells输入标题文本即可。运行后表头出现了两行结构上面大标题下面小列名。很多管理系统的报表页就是这种结构。自动合计在网格底部显示统计行。设置FooterRowCount : 1然后每一列的Footer.ValueType可以选fvtSum、fvtCount、fvtAvg。比如“金额”列设fvtSum运行后表格底部自动出现汇总数值而且随数据更新自动重算。这个功能在财务报表里几乎每天都会用到。冻结列方式和 Excel 类似在Columns集合中把要冻结的列的Index排在前面并设置网格FixedCols : 1或2就能让前几列在横向滚动时始终保持可见。配合DBGridEh1.OptionsEh.dghAutoFitRowHeight设置行高自适应长文本列显示效果立刻好很多。这些功能不需要额外安装任何控件全部内置于 EhLib 之中这也是大家选择它的核心原因。4. 版本迁移与工程整合——从老项目到 Delphi 12.34.1 为什么你需要关注版本兼容很多项目并不是从零开始而是“我有个 Delphi 7 / XE2 的老项目装了 EhLib想迁移到 Delphi 12.3 上继续维护”。这时候最容易踩的坑是控件版本不一致、编译路径错乱、运行期包加载失败、代码里 uses 的单元名变化。Delphi 7 时代用 EhLib 5.x 的代码直接拿到 Delphi 12.3 EhLib 11.1.015 里编译大概率会报错因为很多单元被重命名或拆分过。比如老版本里的DBGridEhImpExp单元新版分成了导入导出相关的多个模块老版ToolCtrlsEh的部分函数也挪到了Common的EhLibConsts里。你没有必要把报错都硬改掉正确做法是借助编译器的错误信息逐个把 uses 列表更新到新单元名。可以在新版本 Demo 里搜相同用途的代码看看官方推荐怎么引用。还有热搜词里反复出现 “delphi 控件版本问题 导致 每次进入ide都丢失控件” 这样的描述——这个问题我在老项目迁移时也遇到过。根本原因是机器上同时装了两个版本的 EhLib或者系统路径中存在旧版的.bpi/.dcp文件IDE 加载工程时找到了错误的包。解决办法有几个层面项目打开时IDE 会按“工程引用的包名 全局包的版本号”来加载包。如果旧包和新包同名但版本不同IDE 可能记录的是旧包的 GUID就会加载失败。你需要在Project Options Packages里移除旧包引用只勾选新包的运行期包复选框。全局层面打开Component Install Packages在列表里找到 EhLib 相关包确保只有 11.1.015 一个版本被勾选。老版本包先 uninstall 或直接把旧版本的 dcp/bpl 从 Search Path 里清掉。默认情况下 Delphi 会缓存.dcu旧.dcu文件可能残留。在Tools Options IDE Library里把旧版本 EhLib 的路径移除然后在系统盘上搜索*.dcu中带Eh的旧文件比如DBGridEh.dcu只保留属于新版路径的文件。也可以在干净环境下重新全量编译项目让 IDE 重新生成所有 dcuh。4.2 老工程代码兼容性的三个典型修复点下面这些是我迁移代码时常用的修复点很多是从编译错误里总结出来的。uses 语句改写。老代码可能写DBGridEh, DBTables, Provider新版本里DBTablesBDE已经不再默认支持需要换成 FireDAC 或 ADO。如果你的业务代码用了 TQuery那迁移量会大一些因为 FireDAC 的 API 和 BDE 差异很明显。我的建议是如果项目仍用 BDE在没有完整测试之前不要贸然升级到 Delphi 12.3。停留在可用的版本可能比强行升更好。数据集类型适配。EhLib 的网格本质是数据感知控件不管后端是 BDE、ADO、DBX、FireDAC只要你的DataSource.DataSet是TDataSet子类它就能工作。因此老代码中大量针对 DBGridEh 的属性和事件调用比如DBGridEh1.SelectedRows、DBGridEh1.DataSource.DataSet.FieldByName(...)等都可以原样保留。真正需要改动的是数据集创建部分的代码。资源文件和本地化字符串。EhLib 11.1.015 的很多界面文字比如排序提示、查找对话框按钮文字默认是英文的。Professional 版本带了多语言资源在Resources目录下可以找到多个语言版本的 .pas 资源单元例如EhLibConsts_ChineseSimplified.pas。如果你希望查找对话框、右键菜单显示中文需要在工程最开始的地方uses这个中文本地化单元而不是自己在运行时去改每个按钮的 Caption。4.3 结合 FireDAC 使用 EhLib 的推荐配置如果你是新项目我建议直接使用 FireDAC 作为数据访问层配合 DBGridEh 使用这套组合在稳定性与性能上都很平衡。连接配置示例FDConnection1.Params.Add(DriverIDSQLite); FDConnection1.Params.Add(DatabaseC:\Data\MyApp.db); FDConnection1.Connected : True; FDQuery1.Connection : FDConnection1; FDQuery1.SQL.Text : SELECT ID, CUSTOMER_NAME, ORDER_DATE, AMOUNT FROM ORDERS ORDER BY ORDER_DATE DESC; FDQuery1.Open; DataSource1.DataSet : FDQuery1; DBGridEh1.DataSource : DataSource1;注意SQLite 的日期字段和数值类型映射到 Delphi 后默认可能显示为浮点字符串或时间戳你需要在字段的OnGetText事件或列属性DisplayFormat里处理格式。比如金额列设置DisplayFormat : #,##0.00日期列设置DisplayFormat : yyyy-mm-dd运行后显示效果才正常。5. 常见问题与避坑实录——这些坑我基本都踩过5.1 表格显示问题显示“内存不足”或卡顿DBGridEh 在数据量大、设置了自动加粗统计行、列头有图标时偶尔会报内存不足。多数原因是行缓存设置不合理。网格的属性里有一个RowHeight和RowAutoHeight还有OptionsEh下的dghAutoExtendVertLines这些值如果过大会导致网格需要保存的绘制信息变多。我的经验是大数据量分页展示比一次性加载全部更可靠。用 FireDAC 的话建议开启FetchOptions.Mode : fmOnDemand然后在网格的ScrollData事件里动态加载更多数据。如果不想分页就把 DBGridEh 的Options.Datasource里的DataSource与DataSource.AutoEdit设为 False减少后台自动编辑缓存。5.2 显示异常列头出现“两个排序箭头”或“三角符号不消失”这种情况通常是设置了TitleSort但未设置SortMarker。在列属性里把Title.SortMarker设成smUpEh/smDownEh/smNoneEh并且保证每个列的Title.TitleButton要么为 True 要么为 False。如果你开启了OptionsEh.dghAutoSortMarking还要保证每个列都有SortMarked事件处理否则点击后箭头状态会很奇怪。我个人习惯是只使用OnTitleBtnClick事件自己做排序设置SortMarker为smDownEh表示当前排序方向并把 DBGridEh 的OptionsEh.dghAutoSortMarking设为 False避免双重排序标记。5.3 数据库更新报错提示“Field ID cannot be modified”这是因为 DBGridEh 未正确设置为UpdateAll模式导致它试图把主键字段也列入 UPDATE 语句。解决办法正确配置KeyField必须存在于数据集另外设置 DBGridEh 的UpdateOptions.UpdateStatus为usModified只更新被修改的字段。同时在列级别把主键列的ReadOnly设为 True防止用户改主键。5.4 与第三方控件冲突LODOP 打印、NTKO 上传等场景热词里反复出现 LODOP 打印控件和 NTKO 上传控件的问题。实际场景是Delphi 程序里通过 WebBrowser 调用 LODOP 打印网页内容或者用 NTKO 控件做公文上传。这些控件在 IE 内核环境下依赖 ActiveX 的安全配置与你使用 EhLib 本身没有冲突但会给人一种“一起装了就出错”的错觉。我的建议是在 Delphi 里集成 WebBrowser 时把 IE 版本设为最新注册表里设置FEATURE_BROWSER_EMULATION为你本机的 IE 最高版本调用 NTKO 上传时确保用户机器上安装了对应 ActiveX并且 IE 安全设置里“允许运行未签名 ActiveX”已开启。这和 DBGridEh 没有直接关系但项目交付时如果一起用别把错误归因到不相关的控件上。5.5 子控件间距、焦点框不显示问题DBGridEh 默认的焦点框FocusRect样式是实线或虚线如果你发现选中单元格后看不到焦点框检查OptionsEh里dghShowFocusRect是否为 True同时GridLineWidth不能为 0否则网格线会把焦点框盖住。还有部分主题下Color和高亮色设置过近会导致看不清调整OptionsEh.dghHighlightFocus相关的高亮颜色即可快速修复。5.6 每次打开 IDE 控件都丢失的完整解决方案这是热词里常被提到的话题实际原因就是“多个版本的包冲突 系统路径残留”。针对 Delphi 12.3 EhLib 11.1.015 的组合我推荐以下步骤打开Component Install Packages先卸载所有 EhLib 相关包。关闭 Delphi删除 Delphi 对应版本的用户配置目录下的*.bpl和*.dcp引用缓存。具体路径是%APPDATA%\Embarcadero\BDS\23.0\Known IDE Packages因为 Delphi 12.3 的版本号是 23.0。重新打开项目再重新安装一次新包确保系统里只有 11.1.015 的 BPL。如果这条做完了还是丢失多半是机器上装了其他版本的 EhLib比如 9.x、10.x 在老目录需要全局搜索EhLib*.bpl把旧版本 BPL 移到备份目录不要直接删除方便后面确认问题。6. 面向高频热词的实战案例——把“SELECT 查询”“PDA 扫码”“MD5 计算”结合到 DBGridEh 项目里6.1 用 FDQuery 配合 DBGridEh 做动态 SELECT 查询热搜词里有 “delphi select查询” 和 “delphi 10.4 md5计算” 等。实际最多的场景是做一个查询界面用户输入关键字点搜索DBGridEh 刷新数据。我写一个带参数查询的示例procedure TForm1.BtnSearchClick(Sender: TObject); begin FDQuery1.Close; FDQuery1.SQL.Text : SELECT CUST_ID, CUST_NAME, PHONE, ORDER_DATE, AMOUNT FROM ORDERS WHERE CUST_NAME LIKE :CustName ORDER BY ORDER_DATE DESC; FDQuery1.ParamByName(CustName).AsString : % EditName.Text.Trim %; FDQuery1.Open; DBGridEh1.ResetColumnWidths; end;要点有两个一是使用参数查询防止 SQL 注入二是ResetColumnWidths每次新查询列宽如果不重置前面留下的列宽会延续到新数据显示错乱。DBGridEh1.ResetColumnWidths会把所以列宽重置为默认宽度然后再根据列内容自动优化。6.2 Delphi FireMonkey PDA 扫码结合 DBGridEh 的服务端数据结构PDA 扫码在 FireMonkey 下常见于仓库、物流场景。热词里提到 “delphi firemonkey pda 编程实现扫码结果接受”。虽然 FireMonkey 本身不能直接用 VCL 版本的 DBGridEhVCL 和 FMX 是两套体系但很多项目实际是“PDA 端用 FireMonkey 扫码PC 端用 VCL DBGridEh 显示扫码结果”。我的做法是PDA 扫码后通过 REST API 或 MQTT 把条码发送给 PC 服务端PC 端收到后把条码追加到一个内存表再由 DBGridEh 绑定并显示// 服务端接收扫码后的处理 var tbl: TFDMemTable; begin tbl.CreateDataSet; tbl.AppendRecord([scannedCode, Now]); FDQuery1.Close; FDQuery1.SQL.Text : SELECT CODE, SCAN_TIME FROM SCAN_RECORDS WHERE CODE :Code; FDQuery1.ParamByName(Code).AsString : scannedCode; FDQuery1.Open; DBGridEh1.DataSource : DataSource1; end;这个例子更重要的点是无论扫码端用 VCL 还是 FMX数据最终落到统一的数据集然后在 DBGridEh 中展示。DBGridEh 只认 DataSource不关心数据来自哪里这让前后端解耦变得很自然。6.3 用 EhLib 自带查找列实现带出关联信息的填写体验有时你有主表比如订单表里只存产品编号但界面上要同时显示产品名称和规格还得允许用户从下拉里选产品选完自动带出名称和规格。DBGridEh 的DBLookupComboboxEh就能干这个。操作思路是数据集FDQuery1查订单表包含字段PRODUCT_ID但要显示的列不止这一个你可以在 SQL 里 join 出PRODUCT_NAME、PRODUCT_SPEC。在网格的列集合里将PRODUCT_ID列设为DBLookupComboboxEh的类型把LookupDataset指向产品表KeyField设为产品编号ListField设成“编号名称规格”拼接。用户从下拉中选择产品后订单表里的PRODUCT_ID被写入而PRODUCT_NAME等展示列直接读 join 的结果。这样既保证了录入便利又不会把冗余数据存到库里。对于需要维护大量编码主数据的企业系统来说这种下拉方式比手打编码可靠得多。7. 常用功能速查表——关键属性、事件、方法一图对照功能核心属性/事件/方法备注统计合计FooterRowCount : 1 列Footer.ValueType : fvtSum多列均可独立设置排序OnTitleBtnClickSortMarker需要配合数据集排序一般用 SQL ORDER BY下拉选择ColumnDefValues.AutoDropDown : TruePickList轻量级下拉带查找下拉DBLookupComboboxEh适合主数据关联日期选择DBDateTimeEditEh挂到列EditButtons自带日历表头合并MultiTitleMerge Title Cells多行表头冻结列FixedCols : 1或更多垂直滚动时保持自动调整列宽ApplyBestFit方法别忘了ResetColumnWidths复制到 ExcelDBGridEh1.SaveToExcelProfessional 支持多种格式当前行高亮OptionsEh.dghHighlightFocus : True让当前行醒目表里的每一项都是日常高频用到的。如果你只是做简单列表展示掌握第一行到第三行就够用如果你要做完整的数据维护界面往下一直用到第七行基本都能覆盖。我自己做项目时会把这张表贴在工位上开发时看着它写代码省很多时间。8. 实操总结与收尾经验最后想分享一个我长期使用 EhLib 总结出来的心得安装控件和升级版本并不是最花时间的真正花时间的是把你的业务数据结构设计好。DBGridEh 再强大它也只负责展示和交互你后端数据查询、索引更新、字段合法性、主外键关系决定了一个系统最终好不好用。比如说如果你每天都要做多条件组合筛选与其在界面上拼 SQL不如在查询层做参数化并让 DBGridEh 的OnFilterRecord事件配合筛选条件把筛选逻辑交给控件管理这样性能会明显好很多。再比如录入时一定要处理 控件焦点移动 和 强制校验DBGridEh 允许你设置列的ReadOnly、Required、Visible但依赖这些属性还不够最好在BeforePost或OnUpdateRecord里做一次业务校验防止脏数据进入数据库。还有一个容易被忽略的细节EhLib 的授权问题。Professional 版本是有许可保护的虽然压缩包安装后能正常运行但如果你要把程序分发出去必须确保公司购买了足够数量的开发许可。免费版本没有报表和部分高级功能但在个人学习、内部工具场景下完全够用。这个钱不建议省毕竟控件本身帮你省下的重复开发时间早就超过它的价格了。写到这里我觉得该结束的都讲清楚了。从安装到最后实战你能把这篇里的流程跑通再结合自己的项目去扩展DBGridEh 在手里就能玩得很转了。本文还有配套的精品资源点击获取
返回列表