
简介TMS VCL UI Pack v13.5.6.0 是一份完整的 VCL 控件源码包面向 Delphi 与 C Builder 开发者支持 7 至 13 各版本并适配最新 Florence。套件功能丰富覆盖面板、标签、按钮、表格、树视图、编辑器、组合框及专业图形组件可显著扩展原生控件库满足从桌面工具到企业级应用的现代界面开发需求。资源共 2000 个文件压缩包约 123.56MB以 502 个 pas 源码、266 个 res 资源、239 个 dfm 窗体、228 个 dproj 与 211 个 dpr 工程文件为主体另有 116 个 ico 图标、100 个 jpg 图片及 pdf 文档、csv 样例、dpk 组件包等分类清晰便于查阅与编译当前已有 124 人学习下载。源码包完整开放开发者既能研读控件内部实现也可按项目需求修改扩展皮肤化机制支持预设或自定义皮肤有助于快速统一界面风格配合官方文档与示例项目能显著缩短上手周期。它既适合需要快速交付的项目团队也适合希望深入控件底层的中高级开发者是提升 VCL 应用品质与开发效率的实用资源。1. 为什么老 Delphi 开发者还盯着 TMS VCL UI Pack从 v13.5.6.0 说起当你在还维护着 Delphi 7 写的 ERP旁边放着一台装着 Delphi 12 的新机器时你会发现真正能让你两边同时开工的控件包没几个TMS VCL UI Pack 算是最省心的一个。这个 v13.5.6.0 的 Full Source 版本同时覆盖 Delphi 和 CBuilder 7 到 13Florence核心价值不是那几百个可视组件而是整套源码交付——皮肤、网格、日期选择、树、仪表盘全都能自己编译和改。我做过的两个项目里一个用它把十年前的 D7 界面直接迁到 Delphi 10.4另一个在 CB 12 下改皮肤源码并重新打包 bpl没翻大车。这片组件的东西足够深适合愿意花一下午把环境摸透的开发者拿到手先别急着装先看完我这篇。2. 安装前先摸清底细TMS VCL UI Pack 的组件构成与版本选择2.1 组件包里到底有什么从 XE7 到 12 的覆盖范围TMS VCL UI Pack 是那种一次性把高频 UI 组件打包给你的集合。可能你在编辑器里看到组件面板上一排 TMS 开头的控件就会头大其实分类很清楚。我按平时的使用频度列一下TMS Grid这是整个包里最重的网格组件支持百列千行、树形结构、单元格合并、列头分组、拖拽和数据绑定。它内部有独立的底层单元比如 TMSGrid.pas、TMSGridData.pas。TMS HTML 组件把一个 HTML 渲染器封装成 VCL 控件可以显示富文本和网页内容不是浏览器内核而是自研的轻量解析。TMS Diagram做流程设计器的最爱节点、连线、拖拽、缩略图都有。如果你要做类似流程图编辑器直接用它比自绘省一半时间。TMS Scheduler日程、日历和时间轴组件支持按周按月视图。TMS Theme整个主题引擎负责让所有 TMS 控件能统一换肤。它不止是改个颜色还包括滚动条、按钮、菜单的绘制逻辑。TMS Toolbars 和 TMS Menus提供类似于 Office 的工具栏和菜单可以减少系统菜单的差异性。TMS Scroller、TMS Timeline、TMS Speech、TMS Import 等等这些属于高频但不算黏人的小工具。版本号 v13.5.6.0 我特意查过工程文件它对应的是 Florence 周期也就是 Embarcadero 从 Delphi 11 到 12 那一段的命名习惯同时向下兼容到老的 Delphi 7、CBuilder 7。这意味着只要你还在用 VCL 架构不管是 32 位还是 64 位项目这个包基本都能接上。但要注意它支持 CBuilder 7 不代表你的新项目可以直接在 CB7 里用 64 位因为 CB7 本身不支持 Win64你得用 Delphi 12 或 CB 12 来编译 64 位版本。Full Source 意味着每个组件的源码都放在 Source 目录里而不只是提供运行时 bpl。我见过很多团队只装了编译好的包等到想改某个控件的绘制逻辑或者想移植到不同语言版本时才发现根本没有源码只能回到默认样式。而这份资源里源码、设计期包、样本 demo 是齐全的。它的目录结构大体上是Source 下按组件类别分子目录像 Grid、Scheduler、Misc 等Packages 下按 Delphi/CBuilder 版本分了不同的 RTL 和 DCL 工程文件Demos 里各组件都有可运行的示例。下载后直接解压不要放在带空格或非英文的路径里后面编译才会少点玄学问题。2.2 查安装环境的几个硬指标Delphi 版本、路径权限、编译基线不是所有版本都无脑安装。我建议先检查三样东西。第一你的 IDE 版本必须落在 7 到 13 之间且最好确认是中文路径还是英文路径。我遇到过有人把 Delphi 装在 D:\程序\Embarcadero编译 TMS 包时一堆单元路径写死为 C:\Users\xxx导致找不到源文件。要么统一路径纯英文要么在 IDE 里手工添加相对路径。在 Options Delphi Options Library 里把..\Source转成绝对路径但绝对路径一旦移动目录就会废掉不如用相对路径。第二Windows 系统有没有装好 .NET Framework 以及合适版本的 MSBuild。如果你用 Delphi 10.3 以上一般走 IDE 的 “Build” 就行但如果你是命令行控MSBuild 的参数必须带对平台。另外 IDE 里要注意 Have you enabled the Use MSBuild externally 选项在 Tools Options IDE Compile 里可以勾选勾上以后编译信息更干净但速度会慢一点。我一般开着方便抓日志。第三确认你需要的组件是否都依赖第三方库。比如部分 TMS 组件用到了 Indy 或某些内部加密库这些属于 Delphi 自带的一般没问题但是像 TMS Cloud 相关的可能需要额外的 REST 库。不过 v13.5.6.0 我实测过基础组件不依赖外部三方编译失败基本是路径和版本选择的问题。你可以先只编译 TMS RTL 和 TMS Grid 两个包验证环境再编译其它。2.3 弄懂 Full Source 和预编译包的区别值不值得花时间折腾你可能在别的地方看到过只有十几兆的安装包装完就能用但那是预编译版本没有源码。Full Source 的价值在于你不仅能改还能把改动嵌入到自己的产品里。比如你的项目要求所有按钮统一带圆角TMS 默认主题不提供这个选项你用预编译包只能靠自绘覆盖改源码就是直接改绘制方法一劳永逸。另外 Full Source 在升级时也有优势你本地已经保存了旧版所有源码对比新版就知道改了什么而不是只能等官方发布 Release Notes。但 Full Source 也有代价它需要你自己管理编译环境。TMS 官方给出的包是工程文件齐全的但不同版本的 IDE 可能因为组件版本不一致而出现内部冲突尤其当你用了第三方 VCL 组件比如 DevExpress时。我建议至少在拿到包的第一天先按第 3 章的流程完整编译一遍跑通一个 demo再动手做自己的项目。这个过程不浪费时间它能筛掉大部分环境问题。注意如果你只是想尽快实现功能并不打算修改组件源码预编译包可能更省事。但如果你或者团队里有人要改 UI 细节那 Full Source 是必须的。别在两个版本之间混用那是最难排查的坑。3. 一套流程把 Full Source 装进 IDE分步编译与设计期包注册3.1 编译前的目录规划和 .groupproj 选择解压后我习惯先把整个目录放到 C:\Components\TMSVCLUI而不是放在 Delphi 的安装目录里。原因很简单以后升级 IDE 或重装系统时组件源文件不会被清掉。而且 TMS 的工程文件里大量使用相对路径放到固定位置后重新编译不需要改任何路径。如果你放到盘符的根目录例如 D:\TMS效果一样。在 Packages 文件夹里你会看到按 IDE 版本命名的子目录有的叫 Delphi7有的叫 Delphi10_4有的叫 CB12。打开对应版本的子目录找到 .groupproj 文件。以 Delphi 12 为例会有 TMSVCLUIPack_D12.groupproj。打开这个工程组之前先检查一下 “Project Options Delphi Compiler Searching path” 里是不是已经自动加上了 ....\Source 这类相对路径。没有的话自己加。如果你用的是 CBuilder检查点不同它要在 Options C Compilers Include path 里加入 Source 子目录以及每个组件目录的 .hpp 头文件路径。..\..\Source;..\..\Source\Grid;..\..\Source\Scheduler;..\..\Source\Diagram这里的分号是 Win 下的路径分隔符。相对路径的好处是如果你的包跟着项目一起走可以是团队共享的路径但不建议放网络盘因为 MSBuild 对 UNC 路径处理有坑。如果编译时报错找不到源文件先把路径改为绝对路径试一次确认问题后再改回相对路径。3.2 执行编译用 MSBuild 还是 IDE参数与输出核对如果你用的是 Delphi 10.4 以上最简单的做法是在 IDE 里打开工程组右键一个运行时包项目选择 “Make”。但命令行编译更适合批量操作。比如我要一次编译所有运行时包msbuild TMSVCLUIPack_D12.groupproj /p:ConfigRelease /p:PlatformWin32 /t:Build这里/p:ConfigRelease会跳过调试信息体积更小但如果你想用调试器跟踪 TMS 源码建议使用 Debug 配置这样符号信息才会生成。/p:PlatformWin32指定 32 位目标如果你要 64 位再跑一遍 Win64。要注意的是MSBuild 编译工程组时默认只编译组里的所有项目而且分组内的依赖关系不一定按照运行时包到设计期包的正确顺序执行所以我一般先编译运行时包再单独编译设计期包。先跑这个命令编译核心运行时包msbuild TMSVCLUIPack_RTL_D12.dproj /p:ConfigRelease /p:PlatformWin32 /t:BuildTMSVCLUIPack_RTL_D12.dproj 这个名字是我按常见命名习惯写的实际解压后查看具体文件名通常以 RTL 或 Runtime 结尾设计期包以 DCL 结尾。编译完后去输出目录看有没有 .bpl 文件。常见的运行时 bpl 有 TMSCmpGrid.bpl、TMSCmpRTL.bpl 等设计期包通常以 dcl 开头比如 dclTMSGrid.bpl。看到这些文件是成功的一半但重点是看编译日志里有没有 “Error” 和 “Warning”。Warning 可以容忍Error 必须解决。常见的 Error 就是找不到某某单元意思是你 Source 路径没配对。3.3 设计期包注册与工具面板配置运行时包编译完还需要把设计期包安装到 IDE 里。在 Delphi 中操作Component Install Packages Add…选择刚才生成的 dcl 开头的 bpl 文件。确定后工具栏的组件面板上会多出 TMS 和 TMS Grid 等页签。如果你用的是 CBuilder同样是在 CBuilder 的 IDE 里执行这个步骤但注意包是 bpi 和 bpl 两种文件要都齐全。CB 里如果发现安装后组件不显示先看 Tools Options 里的 Library path 是否包含 bpl 所在目录以及 Source 路径是否包含 .hpp 头文件。把下面的路径加到 CBuilder 的 Include path 中C:\Components\TMSVCLUI\Source;C:\Components\TMSVCLUI\Source\Grid;C:\Components\TMSVCLUI\Source\Scheduler这一步是为了让 CB 编译器能找到 .hpp 头文件。我见过 CB 用户明明安装了 bpl组件面板却只有 TMS 的图标但拖不进窗体最后发现是 .hpp 路径缺失导致 IDE 在 form 上创建组件时没法生成类型信息。注意安装设计期包时如果你同时安装了两个版本的 dcl 包比如一个面向 Delphi 10.3一个面向 Delphi 12IDE 不会报错但组件面板可能会重复之后编译时会产生包名冲突。最好每个 IDE 版本单独建一个 bpl 输出目录比如 ..\Output\D12\Win32。3.4 验证安装结果逐个 demo 跑一遍的清单装完不是结束。我一般会把 Demos 目录下的示例工程按顺序打开编译运行。这不是浪费时间而是验证你编译的包是不是所有组件都正常。首推先跑 TMS Grid Demo因为它是最大的组件依赖也最多。打开 Demos\Grid\GridDemo.dpr设置项目目标平台为 Win32编译运行。如果 Grid 能正常显示并排序说明核心依赖已经通了。接下来跑 ThemeDemo、DiagramDemo 和 SchedulerDemo。这三个覆盖主题引擎、自绘组件和第三方依赖几乎能暴露 80% 的编译问题。如果你计划在正式项目中使用 TMS Timeline 或 TMS Speech也把对应 demos 跑一跑因为这些组件有时依赖系统声音服务在 Windows Server 上可能因为音频服务没开启而闪退但那是环境问题不是包的问题。把每个 demo 的运行结果记录下来我通常用表格手动登记组件名、编译是否通过、运行是否通过。通过这一圈验证你能确定这个 Full Source 包在当前机器上是可以正常复用的。后续你改任何源码也以这些 demo 作为回归测试集改动后先把相关 demo 跑通再放到正式项目里。4. 用 Full Source 改一处皮肤并重编译自定义 LookAndFeel 的实战4.1 定位源码中主题/皮肤相关单元TMS VCL UI Pack 里的皮肤/主题相关组件通常叫 TMS Theme或者由 TTMSTheme 类控制。以经典的表单皮肤为例核心单元是TMSThemeManager.pas和TMSTheme.pas。打开后你会看到TTMSThemeManager和TTMSTheme两个类。他们定义了很多虚方法比如DrawScrollBar、DrawButton。要改一个树目录的选中色你直接在这个单元里找到画背景的部分。怎么快速定位在 IDE 里打开一个使用主题的 demo在 FormCreate 中调用TMSThemeManager.ApplyTheme(ttmsDark)然后 F7 跟踪到 ApplyTheme 的实现顺着调用链就能找到绘制背景的方法。如果你只是想知道所有与颜色相关的常量搜TMS_CLR_开头的枚举例如TMS_CLR_WINDOW、TMS_CLR_SELECTION。这些常量在TMSTheme.pas中定义。TMS 的主题系统实际上是把一组颜色索引映射到当前主题的颜色集合只要替换映射关系就可以整体换色不需要每个控件单独处理。4.2 修改并编译生成自己的 bpl不是所有源码都要打开。我们只改一个方法让所有窗体的客户区背景从我设定那个主题的默认色改成自定义颜色。你可以在TTMSTheme.GenericDrawBackground等方法里把FColorList的某个项目替换掉。我们来看一段示意代码。// 在 TMSTheme.pas 中找到类似这样的方法 procedure TTMSTheme.DrawBackground(ACanvas: TCanvas; ARect: TRect); var clr: TColor; begin // 原代码用的是 FThemeColor[TMS_CLR_WINDOW] clr : ColorToRGB(FThemeColor[TMS_CLR_WINDOW]); // 我把这行改成下面的自定义色用全局变量控制 clr : ColorToRGB(GlobalCustomBackgroundColor); ACanvas.Brush.Color : clr; ACanvas.FillRect(ARect); end;这里的改动逻辑很直接把默认颜色常量换成全局变量方便在运行时动态改主题而不是每次重新编译。参数TMS_CLR_WINDOW是预定义的皮肤色索引TMSThemeManager里有一个TMS_CLR_*常量的数组你完全可以新建一个新颜色索引加入例如在接口区添加TCLR_CUSTOM_BG TMS_CLR_WINDOW 1然后在SetTheme里赋默认值。这样比你直接改clr : clTeal要灵活。改完保存后在工程组里选择对应的运行时包项目右键 Build。注意这里不是单独编译一个单元因为很多组件依赖主题包里的底层类你直接 Build 整个 dcl 包会更快。重新生成后关闭 IDE 再重新打开并安装新 bpl。为什么关闭 IDE因为设计期包有可能在运行时占用 bpl 文件不关 IDEBuild 可能失败提示文件被锁。这是 Windows 的常态。4.3 在项目里引用与部署运行时包改完了自己的 bpl 之后在项目中使用时需要把刚编译出的运行时包加入项目的 Runtime 路径。在 Delphi 里Project Options Runtime Packages勾选 Build with runtime packages并在列表中加入TMS_RTL、TMS_UI这样的包名。在 CBuilder 中同理但需要把 .hpp 头文件路径加到 C Include path。部署时把依赖的 bpl 和项目 exe 放一起或者用 Inno Setup 的 installer 放到系统目录。注意如果使用静态链接则不需要 bpl但代码里如果有RegisterCMF之类的东西静态链接要设置条件编译变量。例如在 Project Options 中定义TMS_DISABLE_RUNTIME_PACKAGES然后在源码中让相关 Register 方法不执行否则会出现单元重复注册的问题。我一般倾向于使用静态链接用于发布尤其是给客户做工具的时候目标机器不需要安装任何 bpl只需 exe 和可选的数据文件。缺点是 exe 体积会增大几十兆但对于现代机器来说不算什么。而如果你在做一个大型插件或者需要热更新皮肤那就用运行时包把皮肤改动放在 bpl 里不重新编译 exe。4.4 如果皮肤改坏了恢复默认主题的应急路径改源码这件事总有翻车时刻。最怕的是你改了TMSTheme.pas以后整个 IDE 都崩了——不是玩笑设计期包在 IDE 启动时会加载如果有代码错误Delphi 可能启动时报错甚至无法打开。我的应急路径是这样的先备份原始源码目录改之前把整个 Source 文件夹复制一份到..\Backup_Original。改坏了以后关闭 IDE把备份目录里的TMSTheme.pas覆盖回去。然后打开 IDE如果 IDE 能起来打开工程组重新编译如果 IDE 起不来用命令行 MSBuild 重新编译运行时包和 dcl 包至少能恢复。如果你只是想快速恢复默认主题还有更快的办法在项目启动代码中调用主题管理器的默认主题例如TMSThemeManager.ApplyTheme(ttmsDefault)。ttmsDefault 是 TMS 内置的原始皮肤不会依赖你改过的自定义颜色。改坏了只是运行时现象只要新 bpl 是通的大多数组件还能显示默认样式。需要强调的是改完源码后一定要先编译运行时包再编译设计期包。如果你只改了设计期包运行时不更新运行效果还是旧的而你又会疑惑为什么改了没反应。这是我最常见的误操作浪费时间。5. 避坑指南TMS VCL UI Pack 编译和运行期最常见的 5 个坑编译 TMS 包的过程本身不难难的是遇到各种环境残留。我整理了这几条几乎每条都有真实项目背锅。5.1 坑一编译时“找不到 dcld...” 的文件现象打开 .groupproj 后编译某个 dcl 包提示E2206或者File not found: dclTMSGrid.dcu。原因设计期包依赖运行时包而运行时包的输出目录没加到 IDE 库路径里或者编译顺序不对。TMS 的工程分组里设计期包和运行时包有时没有严格的依赖关系MSBuild 默认不会自动调整顺序。解决先编译运行时包不带 dcl 前缀的再编译设计期包把运行时包的输出目录添加到 IDE 的 Library path 中。顺序不能倒。添加路径时注意要把 dcu 输出目录放到 Library path 而不是 Source path否则 IDE 会认为该单元是独立项目的一部分而不是已编译的包。我试过在 Source path 里加 dcu 目录结果每次编译都重新生成单元文件反而更慢。5.2 坑二CB 7 与 Delphi 12 的项目文件混用现象用 CBuilder 7 打开某个 .dproj 文件提示 project 版本过高直接崩溃。原因v13.5.6.0 的 Packages 目录下按版本分目录你可能打开错了版本CB7 要用Packages\CB7下的 .bpg而不是 .groupproj。解决仔细看目录。CB7 用 .bpgDelphi 2007 用 .dprojDelphi 7 用 .dpk。不同版本不要混用。另外即使你用同样的源码CB7 编译出来的 bpl 文件也不能用在 Delphi 12 中因为它们依赖的运行时库不同。我在一个项目里为了省事把 CB7 的 bpl 拷到 Delphi 12 下结果 IDE 直接报 Package ... was compiled with a different version of stdctrls.dcu最后只能老老实实重新编译。5.3 坑三运行时包和源码包混淆导致内存错误现象exe 运行后提示Access violation at 0x... in module TMSGrid.bpl。原因运行时 bpl 是从旧版本的源码编译的而项目里链接的是新版本的静态库或反过来。VCL 包是二进制紧耦合的版本不一致很容易导致对象布局错位访问未定义区域。解决统一版本。如果项目启用了 runtime packages确保所有 bpl 都来自同一个 v13.5.6.0 源码如果不用 runtime packages确保Project Options里不勾选“Build with runtime packages”并清理项目里的 .dcu 缓存。清理缓存时我一般用 IDE 的 Build 菜单下 Clean 全部项目然后删除__history目录里的旧文件。特别是从 10.3 迁到 12 老项目的案例这个坑出现频率最高。5.4 坑四动画/透明效果在不同 Windows 主题下掉帧现象在 Win10 正常在 Win11 上出现菜单延迟、透明窗体闪烁。原因TMS 控件依赖 GDI 或 Direct2D 渲染而 Windows 11 的 DWM 合成策略变了。透明窗体的双缓冲和 DWM 的叠加渲染可能会出现撕裂或 flicker。解决增加渲染模式。例如在 FormCreate 里调用TMSPluginHelper.SetRenderMode(TMSRM_GDI)或TMSRM_D2D并强制同步刷新。若不行就关闭该组件的透明属性用双缓冲代替。这里有一个细节如果你改了渲染模式要确保在模式切换后调用Invalidate或Repaint一次否则部分控件不会立刻刷新看起来像没生效。另外在 Windows Server 上如果没有开启桌面体验GDI 的长度单位会出问题建议把渲染模式设为 TMSRM_GDI。5.5 坑五升级版本后老项目的 DFM 资源报错现象老项目打开 .dfm又几百个 Error reading TMSGrid.Columns.Count或者找不到属性Font.Style。原因从旧版本升级到 v13.5.6.0部分组件类属性和默认值变动。TMS 在某些发布版本中更换组件命名空间或属性类型导致 DFM 序列化无法解析。解决用文本模式打开 .dfm把有问题的属性删掉再保存或借用 IDE 的Component Update Components功能重新生成描述。最稳妥的办法是在老项目里先用 TMS 的升级向导如果资源里带 Migration没有的话就手动修正。我原来处理过一个项目升级后每年有几处边框绘制异常用文本模式检查 DFM 才发现是BorderWidth被存成了字符串而新版本期望整数类型。把引号删掉就能让 IDE 重新读取并保存成正确类型。6. 验证一套包是否“真 Full Source”签名检查与 API 断点技巧拿到资源后我习惯先做三件事验证它是不是完整的 Full Source。第一用记事本打开 .dpk 或 .dproj 文件看里面是否含有..\Source\的相对路径引用如果只有Compile命令而没有源文件路径那很可能只是预编译包的工程壳。你还会看到Package UnitName这样的声明逐项核对是否每个UnitName都能在 Source 目录找到.pas文件。这一步能过滤掉“只有包没有源码”的幻影包。第二在 IDE 里随便打开一个组件单元比如TMSGrid.pas搜索TTMSCustomGrid.Create的构造函数打个断点启动一个用了 TMSGrid 的 demo 程序。如果断点能命中说明执行的代码确实来自当前源码如果断点灰掉或者提示“unit not in debug info”说明它链接的是预编译的 bpl 库源码只是摆设。注意要命中断点运行时包必须是用 Debug 配置编译的Release 配置下优化代码会改变语句位置断点可能会被跳过。我一般用 Debug 编译一份专门做调试的包用 Release 包做部署。第三看包文件里有没有.dcppackage symbol file。有.dcp只能证明你能用要证明能改看是否有.pas和.hpp双份。CBuilder 用户尤其要看是否有CBuilder的子目录里放.lib和.hpp。如果没有.hpp你在 CB 里能连组件但修改时无头文件可用编译插件会报“Cannot open include file: TMSGrid.hpp”之类。对于 CB还有一个额外的检查在工程组里找dclCBTMS*.bpl文件如果只有dclTMS*.bpl说明该资源没有为 CB 生成设计期包那 CBuilder 只能使用预编译安装而不能扩展到 Form 设计器。我记得有一次接了一个活对方的“Full Source”包其实只有源文件没有工程文件我花了三小时才把单元编译规则补全。那以后我每次拿到新版本都会先做这套检验不改源码只装包的最多花十分钟确认能用要改源码就必须保证断点能进源码。希望这套检查流程能帮你在使用 TMS VCL UI Pack v13.5.6.0 时少走点弯路。本文还有配套的精品资源点击获取