资讯详情

资讯详情

Delphi XE10.2 升级实战:TMS Component Pack v8.3.4.0 安装、Excel 导出与避坑指南

简介TMS Component Pack v8.3.4.0 是 TMS Software 为 Delphi XE10.2 Tokyo 打造的高质量控件集合面向使用 VCL 与 FireMonkey 框架的 Delphi/CBuilder 开发者用于快速构建界面、数据绑定、图表、网格与报表等功能解决重复造轮子、跨版本兼容与性能优化问题。压缩包共约 2000 个文件整体 103.4MB以 pas 源码、dcu 编译单元、res 资源、dfm 窗体、dpr 工程与 dproj 项目文件为主另含 dpk 包、inc 头文件、bmp/png/jpg 图像及 pdf 文档并附带 compilexe10.bat 等批处理脚本便于在不同 Delphi 版本下自动编译与测试。资源提供完整源代码读者可深入理解组件原理并按需定制扩展TAdvGrid、TMS FlexGrid、TMS Charts、TMS DB Navigator 等控件覆盖复杂表格、数据可视化与数据库操作场景。目前已有 1202 人学习下载适合中高级 Delphi 开发者参考与二次开发。1. Delphi 老项目升级到 XE10.2 后TMS Component Pack v8.3.4.0 到底值不值得装手上有个跑了七八年的 Delphi 项目从 Delphi 7 一路迁到 XE10.2界面还是那套老 VCL 风格客户最近提了一堆新需求表格要支持分组、导出要带样式、界面要能换皮肤。自己从头写这些控件工期根本扛不住。这时候 TMS Component Pack 就进入了视野——它是一套覆盖 Grid、编辑器、图表、日程、导出等场景的 VCL 控件集合v8.3.4.0 这个版本对 XE10.2Delphi 10.2 Tokyo的支持是完整的安装后能直接在工具箱里拖出来用。这篇文章不讲虚的就围绕三件事展开这套控件包在 XE10.2 下怎么装、装完怎么用、用的时候哪些地方容易翻车。适合两类人看——一类是手里有老 Delphi 项目、正在评估要不要引入第三方控件包的另一类是已经装了 TMS但被编译报错、包冲突、导出乱码折腾过的。如果你正在搜「delphi excel 操作」「delphi rbuilder 导出成 pdf」这类具体需求文中的导出和表格章节会直接对上。2. 在 XE10.2 里把 TMS Component Pack v8.3.4.0 装干净从解压到工具箱出现控件2.1 安装前必须确认的三件事很多人装 TMS 失败不是包本身有问题而是环境没对齐。动手之前先确认下面三点能省掉后面一大半的排查时间。第一确认你的 Delphi 是 XE10.2 且已经打过 Update 3。TMS v8.3.4.0 的编译脚本会检测编译器版本如果 IDE 没更新到对应补丁级别某些单元会报「Unit not found」。在 IDE 的 Help → About 里能看到具体版本号。第二确认没有旧版 TMS 残留。如果你之前装过 TMS 的其他版本先通过控制面板卸载然后手动检查两个目录C:\Users\Public\Documents\Embarcadero\Studio\19.0\Bpl和C:\Users\Public\Documents\Embarcadero\Studio\19.0\Dcp把里面带tms前缀的.bpl和.dcp文件清掉。残留的包文件会导致新版本安装后 IDE 启动时报「Duplicate package」错误。第三关闭 Delphi IDE 再执行安装。TMS 的安装程序需要写入 IDE 的包列表和注册表项IDE 开着的时候写进去的路径可能不生效装完打开工具箱发现控件是灰的。提示安装前把项目做一次完整备份尤其是.dproj和.dpr文件。TMS 安装过程会修改 IDE 的搜索路径个别情况下会影响已有项目的编译。2.2 用官方安装器完成主包安装TMS Component Pack 提供的是带安装向导的 exe不是那种手动编译 dpk 的散包。双击运行后向导会列出检测到的 Delphi 版本勾选 XE10.2 对应的条目一路 Next 即可。安装器做的事情主要有三步把源码复制到C:\Users\Public\Documents\TMS Software\TMS Component Pack目录下编译出对应的.bpl运行时包和设计时包把包注册到 IDE 的 Known Packages 列表里。安装完成后打开 Delphi在 Component → Install Packages 里应该能看到一组 TMS 开头的包状态是勾选的。这时候新建一个 VCL Application工具箱里会多出一个 TMS 分类页签。如果工具箱里没出现先别急着重装。在 IDE 菜单里点 Component → Install Packages找到 TMS 的包把勾去掉再重新勾上然后点 OKIDE 会重新加载包并刷新工具箱。这个操作相当于手动触发一次包注册刷新比重装快得多。2.3 验证安装是否真的可用写一个最小 Grid 程序装完不验证等于没装。用一个最小的 AdvStringGrid 程序来确认控件能正常编译和运行。unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, AdvGrid; // TMS 的 AdvStringGrid 单元 type TForm1 class(TForm) procedure FormCreate(Sender: TObject); private FGrid: TAdvStringGrid; public end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin FGrid : TAdvStringGrid.Create(Self); FGrid.Parent : Self; FGrid.Align : alClient; FGrid.ColCount : 5; FGrid.RowCount : 20; FGrid.FixedRows : 1; // 设置表头 FGrid.Cells[0, 0] : 编号; FGrid.Cells[1, 0] : 名称; FGrid.Cells[2, 0] : 数量; FGrid.Cells[3, 0] : 单价; FGrid.Cells[4, 0] : 金额; // 填充测试数据 for I : 1 to 19 do begin FGrid.Cells[0, I] : IntToStr(I); FGrid.Cells[1, I] : 物料 IntToStr(I); FGrid.Cells[2, I] : IntToStr(Random(100)); FGrid.Cells[3, I] : FormatFloat(0.00, Random(1000) / 10); FGrid.Cells[4, I] : FormatFloat(0.00, StrToFloat(FGrid.Cells[2, I]) * StrToFloat(FGrid.Cells[3, I])); end; // 启用排序和列宽自适应 FGrid.SortSettings.Show : True; FGrid.AutoSizeColumns(True); end; end.这段代码的逻辑很直白动态创建一个TAdvStringGrid设置行列数填入表头和测试数据最后开启排序指示器和列宽自适应。关键参数有三个——FixedRows设为 1 表示第一行固定为表头不参与滚动SortSettings.Show打开后点击列头会出现排序箭头AutoSizeColumns(True)会根据内容自动调整列宽参数True表示包含固定行在内一起计算。编译运行如果窗体上出现一个带表头、能点击列头排序的表格说明 TMS 主包安装成功。如果编译时报Unit AdvGrid not found回到 2.1 检查搜索路径是否包含 TMS 源码目录。2.4 安装后 IDE 启动变慢或报包错误的处理有些机器上装完 TMSDelphi 启动时间明显变长甚至弹出「Cannot load package」的对话框。常见原因是设计时包加载失败通常和权限或路径有关。先看报错信息里提到的包名比如tmsdXE102.bpl。手动去Bpl目录下确认这个文件是否存在。如果不存在说明安装器编译设计时包那一步失败了可能是杀毒软件拦截了编译过程。把 TMS 源码目录和 Bpl 目录加入杀毒软件白名单重新运行安装器。如果文件存在但加载失败用tregsvr或者 IDE 自带的包管理器重新注册。更彻底的办法是在 IDE 里打开TMS Component Pack目录下的tmsdXE102.dpk右键 Build再右键 Install。手动编译安装能绕过安装器的一些环境检测逻辑成功率更高。3. TMS 核心控件在 XE10.2 下的实战用法Grid、导出与 Excel 操作3.1 AdvStringGrid 的排序、分组与数据绑定AdvStringGrid 是 TMS 里用得最多的控件比 Delphi 自带的 StringGrid 强在排序、分组、过滤、单元格合并这些企业级功能上。前面 2.3 已经跑通了基础填充这里说几个实际项目里高频用到的配置。排序方面SortSettings.Show : True只是显示排序箭头真正排序需要设置SortSettings.Column指定按哪一列排以及SortSettings.Direction指定升序还是降序。如果数据是数字还要设置ColumnTypes让 Grid 知道这一列按数值比较而不是字符串比较否则会出现「10 排在 2 前面」的经典问题。// 指定第 2 列为数值类型排序时按数字大小比较 FGrid.ColumnTypes[2] : ctNumber; FGrid.ColumnTypes[3] : ctFloat; FGrid.ColumnTypes[4] : ctFloat; // 按第 4 列降序排列 FGrid.SortSettings.Column : 4; FGrid.SortSettings.Direction : sdDescending; FGrid.QSort;QSort是触发排序的方法调用后会按照SortSettings的配置重新排列数据行。注意ColumnTypes要在填充数据之前设置填充后再改类型不会自动重新解析已有数据。分组功能通过Grouping属性开启。设置FGrid.Grouping.MergeHeader : True可以让相同值的单元格合并显示适合做报表类的展示。如果要做真正的分组汇总需要配合OnGroupSummary事件自己计算汇总值。数据绑定方面TMS 提供了TAdvDBGrid用于直接绑定数据集但很多老项目用的是手动填充模式。手动模式下要注意每次调用RowCount增加行数后之前设置的单元格格式可能会被重置所以格式设置最好放在数据填充完成之后。3.2 用 TMS 导出 Excel避开 OLE 依赖的坑「delphi excel 操作」是搜索量很高的需求传统做法是用 OLE 自动化调用 Excel 程序但这种方式要求客户机器上装了 Office而且 Excel 进程残留问题很烦人。TMS 提供了不依赖 Office 的导出方案直接生成 xlsx 文件。uses AdvGridExcelIO; // TMS 的 Excel 导出单元 procedure TForm1.ExportToExcel(const AFileName: string); var ExcelIO: TAdvGridExcelIO; begin ExcelIO : TAdvGridExcelIO.Create(Self); try ExcelIO.AdvStringGrid : FGrid; ExcelIO.Options.ExportHardFormatting : True; // 导出单元格格式 ExcelIO.Options.ExportCellHints : False; // 不导出提示信息 ExcelIO.Options.ExportOverwrite : True; // 覆盖已存在文件 ExcelIO.XLSExport(AFileName); finally ExcelIO.Free; end; end;这段代码的核心是TAdvGridExcelIO组件它把 AdvStringGrid 的内容和格式映射到 xlsx 文件。ExportHardFormatting设为 True 时单元格的字体、颜色、对齐方式会一并导出如果只需要数据不要格式设为 False 可以显著加快导出速度。XLSExport方法接收完整文件路径扩展名用.xlsx。实际项目里踩过的一个坑如果 Grid 里有合并单元格导出后合并区域可能会错位。解决办法是在导出前调用FGrid.MergeCells相关方法确认合并范围或者导出时关闭ExportHardFormatting只导数据格式在 Excel 里重新套。另一个注意点是文件名。如果路径包含中文或空格某些 Windows 版本下XLSExport会报错。稳妥做法是用GetShortPathName转成短路径再传进去或者确保导出目录是纯英文路径。3.3 导出 PDF 与报表TMS 方案和 rbuilder 的取舍「delphi rbuilder 导出成 pdf」是另一个高频搜索。如果你的项目已经用了 ReportBuilder那 PDF 导出直接用 ReportBuilder 自带的功能就行不需要 TMS 介入。但如果项目里没有 ReportBuilder只是想把 Grid 内容导成 PDFTMS 的TAdvGridPDFIO是更轻量的选择。uses AdvGridPDFIO; procedure TForm1.ExportToPDF(const AFileName: string); var PDFIO: TAdvGridPDFIO; begin PDFIO : TAdvGridPDFIO.Create(Self); try PDFIO.AdvStringGrid : FGrid; PDFIO.Options.PageSize : psA4; PDFIO.Options.Orientation : poLandscape; // 横向适合宽表格 PDFIO.Options.MarginLeft : 20; PDFIO.Options.MarginRight : 20; PDFIO.Options.Title : 物料清单; PDFIO.WritePDF(AFileName); finally PDFIO.Free; end; end;TAdvGridPDFIO的配置项比较直观PageSize支持 A4、Letter 等常见规格Orientation在表格列数多的时候设为横向能避免内容被截断MarginLeft和MarginRight的单位是毫米。Title会写入 PDF 的元数据在阅读器标题栏显示。和 ReportBuilder 相比TMS 的 PDF 导出胜在轻量和直接——不需要额外安装报表设计器代码里几行就能出结果。但它的排版能力有限不支持复杂的页眉页脚、分组分页、子报表这些。如果客户对 PDF 排版有精细要求还是得上 ReportBuilder 或者 FastReport。选型逻辑很简单临时导出、内部使用选 TMS正式对外的报表选专业报表工具。3.4 皮肤与界面美化TMS 的 VCL 样式方案老 Delphi 项目的界面往往停留在 Windows 98 风格客户一看就觉得「这系统很旧」。TMS 提供了一套 VCL 皮肤方案通过TAdvStyleManager组件可以一键切换整个应用的视觉风格。用法是在主窗体上放一个TAdvStyleManager然后在启动时调用uses AdvStyleIF, AdvStyles; procedure TForm1.FormCreate(Sender: TObject); begin AdvStyleManager1.Style : Office2019Black; // 切换深色主题 AdvStyleManager1.ApplyStyle; end;Style属性接受预定义的样式名称字符串TMS 内置了 Office 系列、Windows 系列、Metro 系列等多套主题。ApplyStyle会遍历所有已注册的 TMS 控件并应用新样式。注意这个方案只对 TMS 控件生效Delphi 自带的标准控件TButton、TEdit 等不会自动跟随需要手动替换成 TMS 对应的控件或者用TAdvStyleManager的RegisterControl方法注册自定义控件类。如果项目里标准控件太多、替换成本高可以考虑只对核心业务界面做美化比如登录页、主数据列表页其他页面保持原样。这样投入产出比最高。4. 避坑与排查TMS 在 XE10.2 下最容易翻车的五个场景4.1 编译报「Unit AdvGrid not found」但文件明明存在现象安装完 TMS新建项目 uses 里写AdvGrid编译器报找不到单元但去 TMS 源码目录看AdvGrid.pas确实在那里。原因IDE 的 Library Path 里没有加入 TMS 的源码目录。安装器有时会因为权限问题写不进去或者你切换了 Build ConfigurationDebug/Release不同配置的搜索路径是独立的。解决打开 Project → Options → Delphi Compiler → Search Path确认 TMS 源码目录在列表里。更稳妥的做法是在 IDE 的 Tools → Options → Environment Options → Delphi Options → Library 里把 TMS 目录加到 XE10.2 的全局 Library Path 中这样所有项目都能找到。改完路径后需要重启 IDE 才生效。4.2 设计时包加载失败导致 IDE 启动报错现象装完 TMS 后打开 Delphi弹出「Cannot load package tmsdXE102」的对话框点确定后 IDE 能打开但工具箱里没有 TMS 控件。原因设计时包Design-time Package依赖的运行时包没有正确注册或者 Bpl 目录下的文件被其他程序占用。解决先关闭 Delphi去 Bpl 目录确认tmsdXE102.bpl和对应的运行时包tmsXE102.bpl都在。然后用 IDE 的 Component → Install Packages → Add手动浏览到tmsdXE102.bpl添加。如果提示依赖缺失先添加运行时包再添加设计时包。添加顺序不能反。4.3 导出 Excel 时程序卡死或 Excel 进程残留现象调用导出功能后程序界面卡住十几秒任务管理器里出现多个 Excel.exe 进程关掉程序后进程还在。原因如果用的是 OLE 自动化方式导出不是 TMS 的 AdvGridExcelIO每次创建 Excel 对象后没有正确释放或者异常发生时跳过了释放代码。解决如果坚持用 OLE确保ExcelApp.Quit和ExcelApp : nil放在finally块里。但更推荐直接换成 TMS 的TAdvGridExcelIO它不启动 Excel 进程从根上避免这个问题。如果项目里已经大量使用了 OLE 导出至少加上CoInitialize和CoUninitialize的配对调用。4.4 皮肤应用后部分控件显示异常现象调用ApplyStyle后大部分控件变好看了但个别按钮或输入框出现文字被截断、背景色不协调的情况。原因TMS 的皮肤机制依赖控件自身的绘制逻辑如果控件被自定义过OnPaint事件或者用了非标准的字体大小皮肤渲染时计算出的布局可能不对。解决先检查出问题的控件是不是标准 VCL 控件。标准控件不受 TMS 皮肤管理需要替换成 TMS 对应控件TButton 换成 TAdvGlowButtonTEdit 换成 TAdvEdit。如果已经是 TMS 控件检查Font属性是否被硬编码了特殊值把字体设置恢复为默认让皮肤管理器接管。4.5 升级 TMS 版本后旧项目编译报错现象从 TMS 旧版本升级到 v8.3.4.0 后原来能编译的项目报「Undeclared identifier」或「Not enough actual parameters」。原因TMS 在新版本中修改了部分方法的签名或者把某些属性改成了方法。比如早期版本里Grid.ColWidths[I]可以直接赋值新版本可能要求用SetColWidth方法。解决先看报错的具体单元和行号去 TMS 安装目录下的Doc文件夹里找对应版本的更新日志如果有的话或者直接在源码里搜索那个方法名看新签名是什么。TMS 的源码是开放的AdvGrid.pas里能看到所有公开方法的定义。改完一处后全文搜索同类调用批量修正。5. 让 TMS 在 XE10.2 上跑得更稳的两个进阶习惯第一个习惯把 TMS 的源码目录纳入版本管理。TMS 安装器默认把源码放在C:\Users\Public\Documents\TMS Software\下这个路径不在你的项目仓库里。一旦换机器或者重装系统源码就丢了。我一般会在项目根目录下建一个thirdparty文件夹把 TMS 的Source子目录复制进去然后在 IDE 的 Library Path 里指向这个项目内的路径。这样团队里每个人拉下代码就能编译不依赖各自机器上的 TMS 安装状态。代价是仓库体积会大一些但比起「在我机器上能跑」的扯皮这点空间值得花。第二个习惯给 TMS 控件写一层薄封装。直接在业务代码里到处AdvStringGrid1.Cells[I, J] : ...的写法后期想换控件或者升级版本时会很痛苦。我的做法是定义一个TMyGridHelper类把常用的填充、排序、导出操作包一层业务代码只调Helper.LoadData(DataSet)和Helper.ExportExcel(FileName)。这样 TMS 版本升级导致 API 变化时只需要改 Helper 里的几处调用不用全项目搜索替换。type TMyGridHelper class private FGrid: TAdvStringGrid; public constructor Create(AGrid: TAdvStringGrid); procedure LoadFromDataSet(ADataSet: TDataSet); procedure ExportToExcel(const AFileName: string); procedure ApplyNumberFormat(ACol: Integer; ADecimals: Integer); end; procedure TMyGridHelper.LoadFromDataSet(ADataSet: TDataSet); var Col, Row: Integer; begin FGrid.BeginUpdate; try FGrid.RowCount : ADataSet.RecordCount 1; FGrid.ColCount : ADataSet.FieldCount; // 表头 for Col : 0 to ADataSet.FieldCount - 1 do FGrid.Cells[Col, 0] : ADataSet.Fields[Col].DisplayLabel; // 数据 Row : 1; ADataSet.First; while not ADataSet.Eof do begin for Col : 0 to ADataSet.FieldCount - 1 do FGrid.Cells[Col, Row] : ADataSet.Fields[Col].AsString; Inc(Row); ADataSet.Next; end; finally FGrid.EndUpdate; end; end;BeginUpdate和EndUpdate的配对使用是 AdvStringGrid 刷数据时的关键优化不加的话每写一个单元格都会触发重绘几千行数据能卡到让人怀疑人生。LoadFromDataSet里先设RowCount再填数据避免动态增长行数带来的额外开销。这套封装思路不限于 TMS任何第三方控件包都适用。核心原则就一条业务代码不要直接依赖第三方库的 API中间隔一层自己的接口。将来不管是 TMS 升级到 v9 还是换成别的控件包改动量都可控。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →