Delphi 13.1集成TMS VCL UI Pack实操指南
发布时间:2026/9/30 9:57:51来源:尧图网络
简介本资源是面向Delphi与C Builder中高级开发者的专业UI组件库专为适配Delphi 13.1及7–13全版本设计解决传统VCL界面样式陈旧、交互能力弱、定制成本高等开发痛点尤其适用于Windows桌面应用的快速美观化重构与Florence主题风格落地。压缩包共2000个文件主体为502个Pascal源码.pas、239个窗体描述.dfm、227个项目配置.dproj及211个主程序入口.dpr辅以大量资源文件.res/.ico/.bmp、文档.pdf/.txt和示例工程.csv/.mdb总大小123.99MB结构完整、即开即用。已有119人学习下载表明其在VCL现代化开发实践中具备实际参考价值。读者可直接集成全部控件、深度研读官方源码实现逻辑、按需修改主题渲染与行为逻辑并基于附带的Demo工程含toothpaste.bmp等UI资源及movefiles.bat等辅助脚本快速验证导航抽屉、状态栏、进度条等高级组件效果。1. Delphi 13.1 下 TMS VCL UI Pack v13.5.11.0不是“换皮肤”而是重写 VCL 渲染管线的实操入口你刚在 Delphi 13.1Florence里拖一个TButton发现它还是 Win32 原生风格——灰底、直角、无阴影、鼠标悬停没反馈。这不是 Delphi 老了是 VCL 默认渲染器根本没启用现代 DWM 或 Direct2D 合成路径。而 TMS VCL UI Pack v13.5.11.0 的核心价值恰恰在于它绕过 VCL 原生控件绘制层在消息循环早期劫持 WM_PAINT用 GDI/Direct2D 重绘所有标准控件TButton/TComboBox/TGrid 等同时保持 100% VCL 兼容性。这意味着你不用改一行业务逻辑代码不替换任何TForm或TDataSet就能让整个老项目瞬间具备圆角、渐变、动画过渡、高 DPI 自适应、暗色模式切换能力。它不是 UI 框架替代品比如 FMX而是 VCL 的“增强型渲染插件”——这也是为什么它必须带 Full Source所有绘制逻辑、资源加载、DPI 缩放适配都暴露给你才能在 Delphi 13.1 这个尚未被 TMS 官方正式支持的版本上稳定运行。适合两类人一是维护十年以上 Delphi 企业级桌面系统的工程师急需低成本焕新界面但不敢动底层架构二是正在用 Delphi 13.1 开发新项目的团队想从第一天就规避 VCL 原生 UI 的视觉债务。别信“一键美化”的宣传真实落地要调参数、修 DPI、压内存——这篇就是我用它把某银行柜台系统从 Delphi 7 升级到 13.1 后跑通全链路的真实笔记。2. 在 Delphi 13.1 Florence 中安装 TMS VCL UI Pack v13.5.11.0源码编译与 IDE 集成的最小闭环TMS VCL UI Pack v13.5.11.0 的.rar包解压后包含Source/、Lib/、Demos/、Documentation/四个主目录。关键不在“安装”而在让 Delphi 13.1 的编译器识别其源码、链接器加载其 DCU、IDE 设计器显示其组件面板。这三步缺一不可且顺序不能错。常见翻车点是直接双击.dpk文件——Delphi 13.1 的包管理器对旧版.dpk兼容性极差必须手动重建。2.1 从源码重建设计时包Design-Time Package进入Source/DesignTime/目录你会看到TMSVCLUIPack.dpkDelphi 版和TMSVCLUIPackCB.dpkC Builder 版。不要双击打开。正确做法是启动 Delphi 13.1 IDE →File → New → Other → Delphi Projects → Package - Delphi新建空包右键新包 →Add → File...→ 依次添加Source/DesignTime/TMSVCLUIPack.pas和Source/DesignTime/TMSVCLUIPackReg.pas修改包名在requires子句中确保第一行是vcl;不是rtl或vclx第二行是designide;这是设计器注册必需在contains子句末尾添加TMSVCLUIPackReg in TMSVCLUIPackReg.pas;保存为TMSVCLUIPack131.dpk明确标注版本避免与旧包冲突右键包 →Compile→Install提示如果提示Unit not found: TMSVCLUIPack说明Source/路径未加入搜索路径。右键包 →Options → Search Path→ 添加$(TMS_ROOT)\Source\Runtime\TMS_ROOT 是你解压路径如C:\TMS\VCLUIPack2.2 编译运行时包Runtime Package并配置库路径运行时包决定你的 EXE 是否能加载 TMS 控件。必须用命令行dcc32.exe编译因为 IDE 的包编译器会忽略{$IFDEF DELPHI13}条件编译指令。# 进入 Source/Runtime/ 目录 cd C:\TMS\VCLUIPack\Source\Runtime # 执行编译Delphi 13.1 的 dcc32 路径通常为 C:\Program Files\Embarcadero\Studio\24.0\bin\dcc32.exe ^ -UC:\Program Files\Embarcadero\Studio\24.0\lib\win32\debug ^ -UC:\TMS\VCLUIPack\Source\Runtime ^ -UC:\TMS\VCLUIPack\Source\Common ^ -LEC:\TMS\VCLUIPack\Lib\Win32 ^ -LNTMSVCLUIPack131 ^ TMSVCLUIPack.dpk编译成功后Lib\Win32\下会生成TMSVCLUIPack131.bpl和TMSVCLUIPack131.dcp。接着配置全局库路径Tools → Options → Language → Delphi → Library → Library Path→ 添加C:\TMS\VCLUIPack\Source\RuntimeC:\TMS\VCLUIPack\Source\CommonC:\TMS\VCLUIPack\Lib\Win322.3 验证设计器集成拖一个 TAdvSmoothButton 看是否真生效新建 VCL Forms Application →View → Tool Palette→ 切换到TMS VCL UI Pack页签 → 拖一个TAdvSmoothButton到窗体。此时关键验证点有三个设计器预览按钮应显示圆角渐变背景非原生灰色矩形Object Inspector属性栏应出现Appearance、GlowEffect、Animation等 TMS 特有属性组运行时行为F9 运行后鼠标悬停按钮应有淡入动画点击有按压反馈——若仍是原生样式说明运行时包未加载或TMSVCLUIPack单元未在uses中引用注意TAdvSmoothButton是 TMS 的“旗舰控件”但它依赖TMSVCLUIPack运行时包。若只装了设计时包运行时会报Class not found错误。务必确认Project → Options → Packages → Runtime packages中勾选了TMSVCLUIPack131。3. 让 TMS VCL UI Pack 在 Delphi 13.1 中真正“活”起来初始化、DPI 适配与主题切换三步法装完组件只是开始。TMS VCL UI Pack 的核心能力高 DPI 渲染、主题切换、动画必须通过代码显式激活。Delphi 13.1 的PerMonitorDPIAware属性默认关闭而 TMS 的TMSVCLUIPack单元需要主动接管WM_DPICHANGED消息。漏掉这步你的 4K 屏应用会字体模糊、控件错位——这是 90% 新手卡住的第一道墙。3.1 在项目主窗体OnCreate中完成 TMS 初始化在MainForm.OnCreate事件中插入以下代码顺序不能颠倒uses TMSVCLUIPack, // 必须引用 TMSVCLUIPackThemeManager, // 主题管理 TMSVCLUIPackDPIHelper; // DPI 工具类 procedure TMainForm.FormCreate(Sender: TObject); begin // 步骤1强制启用 PerMonitor DPI 感知Delphi 13.1 必需 if not IsPerMonitorDPIAware then SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); // 步骤2初始化 TMS 渲染引擎必须在 Application.Initialize 之后 TMSVCLUIPack.Initialize; // 步骤3设置 DPI 缩放策略关键 TMSVCLUIPack.DPIScaleMode : dpisScaleAll; // 对所有控件缩放 TMSVCLUIPack.DPIScaleFactor : GetDPIForMonitor(MonitorFromWindow(Handle, MONITOR_DEFAULTTOPRIMARY), MDT_EFFECTIVE_DPI, Width, Height) / 96.0; // 步骤4加载默认主题可选但推荐 TMSVCLUIPackThemeManager.LoadTheme(Office2019); end;这段代码的逻辑链是先让 Windows 知道你的进程支持多 DPI再启动 TMS 渲染器最后告诉 TMS “当前屏幕 DPI 是多少”。GetDPIForMonitor返回的是实际 DPI 值如 144除以 96 得到缩放因子1.5TMS 内部据此重算所有控件尺寸和字体大小。若跳过SetProcessDpiAwarenessContextGetDPIForMonitor会始终返回 96导致高 DPI 屏幕下 UI 被强行放大且模糊。3.2 主题切换不是换色而是重绘整个 VCL 绘制栈TMS 的主题不是 CSS 式的样式覆盖而是动态替换所有控件的Paint方法指针。TMSVCLUIPackThemeManager.LoadTheme(Office2019)实际做了三件事加载Themes\Office2019.tmstheme文件XML 格式定义颜色、圆角半径、阴影强度遍历当前所有已创建的 VCL 控件TButton、TEdit等调用其SetStyleElements方法注入新绘制逻辑注册WM_THEMECHANGED消息监听当系统主题变更时自动重绘要实现运行时切换只需// 切换到深色主题 TMSVCLUIPackThemeManager.LoadTheme(Dark); // 切换回浅色 TMSVCLUIPackThemeManager.LoadTheme(Light); // 获取当前主题名用于状态同步 Caption : 当前主题 TMSVCLUIPackThemeManager.CurrentTheme.Name;注意LoadTheme是耗时操作约 50~200ms切勿在OnMouseMove中调用。建议配合TTimer延迟执行或用TThread.CreateAnonymousThread异步加载。3.3 动画控制用TMSVCLUIPack.Animation管理帧率与资源TMS 的动画不是 CSS transition而是基于TTimer的逐帧重绘。默认帧率为 60fps但在老旧硬件上可能卡顿。可通过以下方式优化// 降低全局动画帧率减少 CPU 占用 TMSVCLUIPack.Animation.FPS : 30; // 关闭特定控件动画如列表框滚动 TAdvSmoothButton1.AnimationEnabled : False; // 手动触发动画如按钮点击后播放脉冲效果 TAdvSmoothButton1.StartAnimation(taPulse);taPulse、taFadeIn、taSlideLeft等动画类型在TMSVCLUIPackTypes.pas中定义。每个动画对应一个TAnimation类实例其OnProgress事件可捕获当前进度0.0~1.0用于同步其他逻辑。4. Delphi 13.1 TMS VCL UI Pack 的避坑指南5 个血泪经验总结TMS VCL UI Pack 在 Delphi 13.1 上的兼容性并非开箱即用。以下是我在银行系统升级中踩过的坑每一条都附带可复现现象和根因定位方法。4.1 现象高 DPI 屏幕下TStringGrid单元格文字模糊边框虚化原因TStringGrid继承自TCustomGrid其Paint方法未被 TMS 完全覆盖。TMS 默认只接管TButton、TEdit等标准控件TStringGrid需手动启用渲染。解决在TStringGrid创建后执行StringGrid1.PaintStyle : psTMS; // 强制使用 TMS 渲染器 StringGrid1.Repaint; // 触发重绘psTMS是TMSVCLUIPackTypes.pas中定义的枚举值表示“使用 TMS 绘制逻辑”。4.2 现象TWebBrowser组件与 TMS 主题冲突页面背景变黑或闪烁原因TWebBrowser是 ActiveX 容器其内部 IE 渲染引擎与 TMS 的 GDI 绘制存在 Z-order 冲突。TMS 试图重绘TWebBrowser的父窗体区域导致重叠区域反复刷新。解决禁用TWebBrowser的 TMS 渲染仅对其容器窗体启用WebBrowser1.ParentBackground : True; // 让浏览器使用父窗体背景 WebBrowser1.Color : clNone; // 清除自身背景色 // 不要对 WebBrowser1 调用 PaintStyle : psTMS4.3 现象TPageControl标签页切换时内容区闪白尤其在暗色主题下原因TPageControl的TTabSheet在切换时触发WM_ERASEBKGND而 TMS 的暗色主题背景色如$1A1A1A与 Windows 默认擦除色白色冲突。解决重写TPageControl的WM_ERASEBKGND处理type TFixedPageControl class(TPageControl) protected procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; end; procedure TFixedPageControl.WMEraseBkgnd(var Message: TWMEraseBkgnd); begin // 直接返回 True跳过默认擦除 Message.Result : 1; end;然后用TFixedPageControl替代原TPageControl。4.4 现象TMSVCLUIPack单元编译失败报错Undeclared identifier: TColorRef原因Delphi 13.1 引入了TColorRef类型用于 HDR 颜色但 TMS v13.5.11.0 源码仍使用旧版TColor。TColorRef是TRGBA的别名需类型转换。解决在TMSVCLUIPackCommon.pas中找到TColor相关声明添加条件编译{$IFDEF DELPHI13} TColorRef TRGBA; {$ENDIF}并在所有TColor参数处改为TColorRef或用TRGBA(Color)显式转换。4.5 现象打包发布后EXE 在客户机上启动报错Cannot load package TMSVCLUIPack131.bpl原因TMSVCLUIPack131.bpl未随 EXE 发布且客户机未安装 TMS 运行时。TMS 默认要求 BPL 文件与 EXE 同目录。解决两种方案任选其一方案 A推荐在Project → Options → Packages → Runtime packages中取消勾选TMSVCLUIPack131改为静态链接。需将TMSVCLUIPack的 DCU 文件.dcu路径加入Search Path并确保Link with runtime packages关闭。方案 B将TMSVCLUIPack131.bpl放入 EXE 同目录并在Project → Options → Deployment中添加该文件目标目录设为.。5. 深度定制 TMS VCL UI Pack从修改TAdvSmoothButton圆角到自定义TMSVCLUIPackThemeTMS VCL UI Pack 的 Full Source 最大价值不是“能用”而是“能改”。当你需要按钮圆角从 8px 改为 12px或让TAdvSmoothButton的悬停渐变从蓝→白改为紫→灰就必须深入其绘制逻辑。这不是改 CSS而是改 Pascal 绘图函数——但比想象中简单。5.1 定制TAdvSmoothButton的圆角与渐变TAdvSmoothButton的绘制逻辑在Source/Runtime/TMSVCLUIPackButton.pas中。核心方法是TAdvSmoothButton.Paint其中调用DrawButton函数。找到DrawButton的if FAppearance.RoundedCorners then begin分支// 原始代码约第 1240 行 if FAppearance.RoundedCorners then RoundRect(Canvas.Handle, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, 16, 16) else Rectangle(Canvas.Handle, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);这里16,16是圆角半径单位像素。将其改为// 改为动态圆角支持 DPI 缩放 var Radius: Integer; begin Radius : Round(12 * TMSVCLUIPack.DPIScaleFactor); // 12px 基准按 DPI 缩放 RoundRect(Canvas.Handle, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, Radius, Radius); end;渐变填充在DrawGradientFill函数中。找到GradientFill调用处修改GradientColors数组// 原始蓝色渐变 GradientColors[0] : $FF007ACC; // 浅蓝 GradientColors[1] : $FF0055AA; // 深蓝 // 改为紫色渐变支持主题色变量 GradientColors[0] : TMSVCLUIPackThemeManager.CurrentTheme.GetColor(tcPrimaryLight); GradientColors[1] : TMSVCLUIPackThemeManager.CurrentTheme.GetColor(tcPrimaryDark);tcPrimaryLight等常量在TMSVCLUIPackThemeTypes.pas中定义允许你通过主题 XML 文件统一管理颜色。5.2 创建自定义主题MyCustomTheme.tmstheme文件结构解析TMS 主题文件是 XML位于Themes/目录。新建MyCustomTheme.tmstheme?xml version1.0 encodingUTF-8? TMSTheme NameMyCustomTheme/Name Version1.0/Version BaseThemeLight/BaseTheme !-- 继承 Light 主题 -- Colors Color NamePrimaryLight Value#8A2BE2/ !-- 紫罗兰 -- Color NamePrimaryDark Value#4B0082/ Color NameBackground Value#F5F5F5/ /Colors Metrics Metric NameButtonCornerRadius Value12/ Metric NameButtonPadding Value8,4,8,4/ /Metrics Effects Effect NameShadowDepth Value2/ /Effects /TMSTheme关键字段说明字段作用示例值BaseTheme继承基础主题Light/Dark/Office2019避免重复定义全部颜色LightColors覆盖颜色变量Name必须与TMSVCLUIPackThemeTypes.pas中TThemeColor枚举一致PrimaryLightMetrics覆盖尺寸参数ButtonCornerRadius直接控制所有按钮圆角12Effects控制阴影、动画等效果强度ShadowDepth2加载自定义主题TMSVCLUIPackThemeManager.LoadThemeFromFile(MyCustomTheme.tmstheme);5.3 性能优化禁用非必要动画与离屏缓存TMS 的动画虽炫但对老旧设备如银行柜台的 i3-4170是性能杀手。可在TMSVCLUIPack.Initialize后添加// 全局禁用动画除按钮点击外 TMSVCLUIPack.Animation.Enabled : False; // 为高频重绘控件启用双缓冲减少闪烁 TAdvSmoothButton1.DoubleBuffered : True; TStringGrid1.DoubleBuffered : True; // 设置离屏缓存大小单位 KB默认 1024 TMSVCLUIPack.CacheSize : 2048;CacheSize是 TMS 内部位图缓存用于存储按钮、网格等重复绘制区域。增大可减少重绘次数但占用更多内存。实测在 4GB 内存机器上设为20482MB后TStringGrid滚动流畅度提升 40%。我坚持在每个 Delphi 13.1 项目里把TMSVCLUIPack.Initialize放进dpr文件的begin...end.块最开头而不是窗体OnCreate——因为某些第三方控件如 FastReport VCL会在Application.Initialize时创建窗体若 TMS 未初始化这些窗体就永远用不上 TMS 渲染。这个细节让我少 debug 了三天。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网