简介TMS VCL UI Pack v13.6.1.0 是 TMS 官方发布的 VCL 控件包完整源码版面向 Delphi 与 CBuilder 7~13 Florence 开发者覆盖数据网格、日程排程、富文本编辑、Ribbon 界面、图表、自动更新、过滤面板等高频业务组件。压缩包共 2000 个文件、105.53MB其中 502 个 pas 源码和 239 个 dfm 窗体文件可直接阅读或嵌入项目228 个 dproj 工程文件方便按模块编译另附 47 个 pdf 文档与 43 个 csv 示例数据便于对照学习。目前已有 75 人浏览学习。通过完整源码可深入理解 TAdvStringGrid 的排序过滤分组、TAdvRichEditor 的 HTML/Markdown 渲染、TAdvRibbon 的高 DPI 适配等实现机制同时 116 个 ico 图标与 46 个 dcr 组件资源可直接用于商业界面设计。适合希望扩展 VCL 功能、钻研控件底层实现或快速构建企业级桌面应用的 Delphi/CBuilder 工程师。1. TMS VCL UI Pack 源码包到底解决什么问题如果你接手过任何一个超过三年的 Delphi 项目大概率见过一堆用 TMS 控件拼出来的业务界面——网格、计划表、富文本编辑、仪表盘这些控件不是 VCL 自带的做 ERP、进销存、医疗系统的公司尤其爱用。TMS VCL UI Pack v13.6.1.0 是这个系列在 RAD Studio 11/12 时代比较成熟的一个大版本FullSource 完整源码版意味着你拿到的不是编译好的黑盒 BPL而是每个控件的 .pas 源文件都能打开、能下断点、能改。说白了这套东西解决的是两个实际问题一是让老项目在不重写的前提下把界面现代化二是当你需要控件按业务逻辑定制时不必去论坛跪求 Demo直接改源码重新编译就行。这篇笔记会从安装、跑通第一个控件、调试源码一路讲到常见的翻车点适合正在评估是否要投入这套控件的团队。2. 从 .7z 压缩包到 IDE 工具箱安装与 30 分钟跑通2.1 先搞清楚 FullSource 里有什么BPL、DCU 与 .pas 文件的分工拿到压缩包解压后你最先看到的是一堆按功能分组的目录。核心的东西有三类源码文件.pas、设计期包文件.dpk/.dpkg、以及一部分预编译的 DCU 或 BPL。初次使用很容易犯的错是直接把所有 .pas 文件加入 IDE 的搜索路径然后指望编译通过——这样大概率会撞上一堆重复定义和单元依赖错误。正确做法是先看目录里的分组比如网格、编辑、计划表、图表、仪表盘、Office 风格工具栏等各在自己的子目录里因为 TMS 包分得很细不是一次装完就所有控件都可用。安装前先做一件事确认你的 RAD Studio 版本。TMS VCL UI Pack 的 v13 系列通常覆盖 10.4 到 11.x部分组件对 CBuilder 支持不如 Delphi 完整。我一般会先在 Delphi 32 位平台装一套跑通后再加 64 位。因为一个项目里同时用两个平台时库路径里不能只放一份 DCU32 位和 64 位要分别输出否则经常出现IDE 里看得到控件编译时找不到 .dcu的诡异错误。目录规划也值得提一句不要把源码解压到 C:\Windows 或 Program Files 这类带权限的目录。我习惯建一个 C:\Libs\TMSVCLPack只读属性去掉方便后面重编译覆盖 DCU。针对 v13.6.1.0 这种带完整源码的版本你最终要的是能随时重新编译的源码树而不是一个装完就忘的第三方包。2.2 库路径与编译包的设置两处必须改动的地方打开 RAD Studio先不要急着双击 .dpk。我的步骤是先把源码目录加入 IDE 的库路径这样 IDE 才能在设计期找到控件对应的单元并在编译工程时自动按需编译。菜单路径是 Tools Options Delphi Options Library Library path把 C:\Libs\TMSVCLPack\Source 加进去具体子目录名以你解压后的结构为准。# Windows 命令行检查库路径配置的关键目录是否存在示例 cd /d C:\Libs\TMSVCLPack dir /b /s *.pas | find TMS tms_pas_list.txt这一步的意义在于先把你手里的源码文件盘一遍确认关键包文件的位置。比如计划表组件可能在 Schedule 或 Planner 目录下网格组件在 Grids 目录下。然后用 IDE 打开对应的运行时包文件比如 TMSVclPack.dpk在包的根目录附近右键点击 Project Manager 里的包节点选择 Compile再选 Install。// 以 TMS 包安装后的极小验证为例Delphi 单元声明 unit DemoMain; interface uses Vcl.Forms, Vcl.StdCtrls, Vcl.Controls, TMSAdvGrid; // TMS 网格单元 type TForm1 class(TForm) TMSAdvGrid1: TTMSAdvGrid; // 设计期拖入后 IDE 自动声明 end; implementation end.Compile 与 Install 的区别要弄清Compile 只是编译出 DCU/BPLInstall 才把控件注册到 Tool Palette。安装成功后打开一个空白 VCL 窗体左侧工具箱里就能看到 TMS 分类下的新控件。如果没看到多半是 IDE 缓存——重启一次 RAD Studio 往往比排查配置更省事这算是一条玄学但有效的经验。2.3 一个真实可用的最小示例TMS 网格控件的基本属性装好之后拖一个 TMSAdvGrid 到 Form 上。这个控件的特点是数据绑定能力很强它既可以用 StringGrid 的方式直接赋值也可以通过 Columns 属性配置多列显示。以我接手的进销存项目为例库存台账列表用 TMS 网格比标准 StringGrid 少写一半的事件代码。procedure TForm1.FormCreate(Sender: TObject); begin TMSAdvGrid1.ColCount : 4; TMSAdvGrid1.RowCount : 10; TMSAdvGrid1.Cells[0, 0] : 商品编码; TMSAdvGrid1.Cells[1, 0] : 品名; TMSAdvGrid1.Cells[2, 0] : 规格; TMSAdvGrid1.Cells[3, 0] : 库存数; // 合并单元格演示 TMSAdvGrid1.MergeCells(0, 1, 4, 1); end;这段代码里ColCount 和 RowCount 控制表格基础尺寸Cells 是直接访问单元格文本的入口。MergeCells 把指定区域合并常用于表头分组比如把基本信息分成两列显示。初次用时最需要注意的是 RowCount 是否开了固定行FixedRows默认第一行往往是固定表头这时 RowCount 包含表头行写入数据时下标要相应后移。不然你写数据总感觉第一行数据被吞了。3. 用 FullSource 版本真正干活从黑盒控件到源码级调试3.1 为什么完整源码版的学习成本值得付用预编译版控件遇到 bug你只能做一个黑盒实验换属性、试事件、搜论坛。而 FullSource 源码版最大的价值是当你怀疑控件自身有 bug 或想扩展功能时可以直接打开 .pas 文件看实现。比如 TMS 的日期选择控件在某些区域设置下弹窗位置不对你就可以在源码里找到弹窗定位函数看它用的是 Screen.Monitors 还是简单的 WorkAreaRect然后决定是自己改还是给官方报 issue。常见做法是把源码包里的 Search 目录或 Source 目录加入调试符号路径。这样调试时按 F11步入能直接进入 TMS 的源码而不是跳到 CPU 窗口或找不到源文件对话框。RAD Studio 里对应设置是 Tools Options Debugger Symbol Tables把源码路径加进去。配合 FullSource 版本这里的路径设置才会真正生效。我在一个项目里遇到过硬编码颜色的按钮控件TMS 默认主题风格和客户要求的品牌色不一致。当时就是打开按钮控件源码找到一个把 clHighlight 写死在绘图函数里的位置改成读属性值再重编译包问题解决整个排查加修改不到一小时。这种深度不是普通组件授权能给的。3.2 用 Debug DCU 下断点观察 TMS 控件绘制链路打开了 FullSource你还需要一套能跟入源码的 DCU。TMS 源码版带 Debug DCU 文件它们位于专门的 Debug 目录下。这些 DCU 编译时带调试信息符号表能找到源码对应行。在 IDE 工具选项里设置库路径时Debug 版路径优先放在 Release 版路径之前。// 在 TMS 源码的某个绘制函数内部下断点示例 procedure TTMSAdvGrid.DrawCell(ACol, ARow: Integer; ARect: TRect); begin // 这里下断点可以看当前绘制哪个单元格以及 Rect 是否正确 if ACol DebugCol then OutputDebugString(PChar(Format(Draw Cell %d:%d, [ACol, ARow]))); // 原有绘制逻辑 end;实际操作时先在 IDE 的 Events 里给 TMSAdvGrid 的 OnDrawCell 挂一个事件但要注意很多 TMS 网格的默认绘制不走 VCL 的 OnDrawCell而是内部 DirectDraw 逻辑。所以想找真实绘制点最好直接在源码里搜 Canvas.FillRect 或 DrawText 调用下断点再触发重绘。这样能观察到 TMS 自定义绘制引擎的执行时序理解它为什么比一般 StringGrid 快——它做了双缓冲和区域裁剪不是简单逐格重画。这里有一个常见误区有人把 Debug DCU 文件直接复制到 Release 目录覆盖结果发布时发现 EXE 体积变大、运行变慢。Debug DCU 带着完整调试符号只应加在 Debug 配置的 Search Path 中Release 配置用 Release DCU 或源码重新编译。3.3 修改属性默认值并重编译一次可复现的定制经历TMS 控件面的属性默认值有时不符合业务习惯。比如速度仪表盘控件默认最大值是 100而设备监控系统的转速范围是 3000。每次都手动改属性不是长久之计直接改源码里 published 属性的默认值更彻底。// 修改后的源码片段示意 published property MaxValue: Double read FMaxValue write SetMaxValue default 3000.0;改完后在 IDE 中重新打开 TMSVclPack.dpkCompile 再 Install。全部编译大概需要几分钟成功后新建的窗体上拖出来的仪表盘默认值就是 3000。这个技巧特别适合团队统一规范比如把按钮默认高度、网格默认字体统一写在源码里而不是靠每个开发手调。重编译后如果出现无法定位 BPL的报错一般是包文件还在被 IDE 占用关掉所有打开的窗体重新编译一次就好。4. 控件爆红、滚动卡顿与版本冲突四类典型排坑记录4.1 现象安装后工具箱里找不到任何 TMS 分类原因通常有三个一是只是 Compile 了没 Install二是注册表残留了旧版本 TMS 包新包注册被跳过三是 RAD Studio 用了 64 位 IDE 而包是 32 位编译的11 之前的版本可能遇到。解决方法是进入 Project Manager在包节点上右键选择 Install如果 Install 按钮灰色先删掉旧包再试。实在不行看 IDE 的 Packages 列表里是否出现了 TMS 条目有的话手动打勾。4.2 现象界面滚动时 TMS 控件区域明显闪烁或卡顿这个坑在表单里同时放多个 TMS 控件时尤其明显。原因是 TMS 部分控件默认开启了透明或渐变背景而 VCL 普通窗口在重绘时不会统一做双缓冲导致多个控件交界处闪烁。解决方向是给 Form 和 TMS 容器控件都设置 DoubleBuffered : True或者把一批 TMS 控件统一放在一个 TPanel 上只给这个 Panel 开双缓冲。这样重绘范围限制在局部性能提升很直观。// 解决闪烁的常见配置 procedure TForm1.FormCreate(Sender: TObject); begin Self.DoubleBuffered : True; // 窗体级双缓冲 pnlTMSHost.DoubleBuffered : True; // 承载多个 TMS 控件的容器 end;如果打开双缓冲后反而出现绘制残留或文字模糊原因就变成控件级缓冲与窗体级缓冲互相叠加。这时只保留窗体级缓冲关掉 TMS 控件自己的 Buffered 属性一般能恢复正常。4.3 现象重编译源码后运行时提示找不到 TMS 包的 BPL原因在于重编译生成的 BPL 名称带版本后缀而工程运行时按旧名字找包。解决路径有两个比较快的是在工程 Options 里找到 Runtime Packages在列表中加入新 BPL 名称去掉旧的。更稳妥的是把工程设置为 Release 模式且禁用 Runtime Packages这样编译出的 EXE 会把 TMS 代码静态链接进主程序不需要外部 BPL。上线部署时静态链接省去很多 DLL 地狱的麻烦代价是 EXE 体积会大十几 MB对桌面应用来说通常可以接受。4.4 现象TMS 网格、Edits 和第三方皮肤库如 VCL Styles同时启用后单元格文字模糊且底色不对这种问题经常出现在使用 VCL Styles 的系统皮肤覆盖了 TMS 控件自绘渲染的场景。TMS 控件的自绘逻辑和 VCL Styles 的钩子机制在重绘事件上互相干扰。解决方案是把 TMS 的 StyleElements 属性中不需要跟随系统样式的部分去掉比如TMSAdvGrid1.StyleElements : TMSAdvGrid1.StyleElements - [seBorder, seClient];这样保留字体跟随样式而边框和背景由 TMS 自己绘制。这个方法能解决绝大数新版组合下的显示异常。按现象、原因、解决三行排查效率比在论坛翻旧帖子高得多。5. 吃透 TMS 源码版后的高频复用技巧与行为验证这一章分享三个直接提升落地效率的技巧。第一统一控件风格的函数。团队多人开发时经常出现每个人拖出来的 TMS 按钮字体、颜色、边框各不相同。我在公共单元里写了一个工具过程专门批量设置 TMS 按钮与编辑框的风格procedure StyleTMSControls(AControl: TComponent); var i: Integer; begin for i : 0 to AControl.ComponentCount - 1 do begin if AControl.Components[i] is TTMSButton then begin TTMSButton(AControl.Components[i]).Font.Name : HarmonyOS Sans SC; TTMSButton(AControl.Components[i]).Height : 36; TTMSButton(AControl.Components[i]).Appearance.NormalColor : $00A05B51; end; end; end;这个函数在 FormCreate 末尾调用一次整个界面就统一了。第二利用 TMS 控件的持久化接口。TMS 很多新版控件实现了 Layout 文件的保存加载功能可以用来保存用户的列宽、排序状态、窗口位置本质是序列化成 XML。结合 FullSource 版你可以把自定义的业务设置混入这个保存文件而不需要额外写配置文件。第三用源码版做控件性能自查。TMS 文档里经常标注组件支持虚拟模式但实际启用时很多人忽略了关键属性。用 TMS 网格做大数据列表必须设置 RowCount 为实际数据行数然后只在 OnGetCellText 事件里返回指定行列的文本。这类回调模式下TMS 不会为每一行实际创建单元格对象内存占用能压到很低加载十万行数据基本可以秒开。检验方法也简单放一个按钮循环触发滚到底用 Task Manager 观察内存涨幅若涨幅近乎为 0说明虚拟模式真正生效了。// 虚拟模式下的数据回调 procedure TForm1.TMSAdvGrid1GetCellText(Sender: TObject; ARow, ACol: Integer; var Value: String); begin Value : FDQueryData[ARow, ACol]; // 从内存数据集直接取值 end;我自己的经验是把虚拟模式配上源码调试几乎所有大数据展示场景都能稳住。也吃过亏——曾经直接给 TMS 网格塞了 5 万行但不启用虚拟模式界面卡到怀疑人生后来追进源码看绘制逻辑才发现 TMS 在非虚拟模式下会为每个可见单元格创建独立绘制对象行数一多必然崩。最后说一个习惯升级 RAD Studio 后不要直接沿用旧版编译出的 TMS BPL。VCL 的消息结构和控件基类可能变了最稳的方法是打开源码包重新编译一次顺手跑一遍你的公共风格函数确认没有编译错误再继续业务开发。这套流程走下来TMS VCL UI Pack 的 FullSource 版才算真正变成团队的资产而不是一个随时可能爆雷的黑匣子。希望帮到你。本文还有配套的精品资源点击获取