尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Delphi 12高效开发:TMS VCL UI Pack Full Source安装与实战

发布时间:2026/9/29 10:10:23

资讯中心
01
ARTICLE

Delphi 12高效开发:TMS VCL UI Pack Full Source安装与实战

Delphi 12高效开发:TMS VCL UI Pack Full Source安装与实战
简介面向 Delphi 与 C Builder 开发者的《TMS VCL UI Pack v13.4.0.1》完整源代码压缩包聚焦 Windows 应用界面开发提供表格、按钮、菜单等界面控件的高级封装并附多种视觉样式与主题覆盖 Delphi 7 至 12 及 Athens 主题适合中高级桌面开发人员快速搭建现代 UI 并扩充控件行为。包内共 2000 个文件以 pas 源码、dfm 窗体、res 资源文件为主辅以 dproj/dpr 工程文件、ico/jpg 图标图片与 pdf 示例文档整体约 123MB目录模块划分清晰便于按需检索和引用。由于包含完整源码开发者可深入调试控件实现修改视觉样式或增加业务逻辑减少重复开发成本也方便维护旧版本项目或平滑迁移至新版 Delphi 12并有利于多语言界面与团队组件库的长期建设。目前已有 76 人学习下载是一份兼顾源码学习与实际工程控制的控件资源库也为组件二次开发提供了常见范例。1. 先说结论TMS VCL UI Pack 不是锦上添花是 Delphi 12 开发效率的底牌很多人问我 Delphi 和 CBuilder 现在到底是什么处境——不温不火但存量项目和企业级工具链一直没断过。而在 Delphi 12 Athens 这个版本上TMS VCL UI Pack v13.4.0.1 几乎是绕不过去的一套东西。它不是那种装完就忘的第三方美化控件而是从窗体标题栏、按钮、表格、树、仪表盘到文件监控、网络通讯、异步任务调度把 VCL 原生控件在用户体验层面补完的一套全集。Full Source 版本的意义更大你能看源码、能调试、能在 Delphi 12 和 CBuilder 7 到 12 之间自由移植不再把控件当黑匣子。这篇笔记适合刚下载完准备安装的人也适合已经装上但被编译、链接和平台问题折腾过的人。我尽量把安装路径、使用方法和踩坑点一次讲透。2. 装对版本才能踩对坑Delphi 12 Athens 下的安装与组件注册2.1 安装前先分清包类型源码包、DCU 包和运行时包的区别TMS VCL UI Pack 的 Full Source 包拿到手后里面通常不是只有一个安装文件而是一整套带 .pas、.bpl、.dcu、.res 的工程目录。安装前先搞清楚三种包类型否则后面一定会乱。设计时包Design Time Package负责把控件注册到 IDE 的工具面板上让你能在窗体编辑器里直接拖拽。它的文件名通常是 xxxDesign.bpl安装后你在 Delphi 12 的 Component Install Packages 里能看到它。运行时包Runtime Package是程序真正调用的那个 BPL运行时要随 exe 一起发布或者用静态链接方式编进 exe。源码包Full Source是 .pas 和 .dfm 的原始工程你可以在里面加代码、改设计、重新编译。三种包的对应关系是安装时 IDE 会自动注册设计时包但运行时包需要你自己确认搜索路径。Full Source 版本的额外工作在于——你不需要等官方给你编好的 DCU你自己就能用 Delphi 12 的命令行编译器把整个包重新编译一遍连 CBuilder 的 .lib 和 .bpi 也能一起生成。这也是 Full Source 比普通安装包贵得多的原因。提示安装前建议把杀毒软件和 Windows Defender 的实时扫描暂时关闭TMS 的安装器和批量编译脚本会被误报。这不是 TMS 的问题是很多注册机误报引发的一刀切行为。我碰到过三次安装到一半文件被锁重装两遍才反应过来是杀毒软件把 BPL 隔离了。2.2 在 Delphi 12 Athens 里安装 TMS最小步骤与两个必改设置Delphi 12 对应 IDE 内部版本号是 23.0安装器会自动识别注册表里的安装路径。但如果你用绿色版、精简版或者把 Delphi 装在非默认盘符自动识别会失败。我一般不依赖自动识别直接手动做三件事。第一步把源码包解压到一个稳定路径不要放在 C 盘根目录也尽量不要放在桌面。路径里不要有中文也不要带空格。我习惯放在D:\Components\TMSVCLUI下这样后面配置搜索路径时不容易出怪问题。第二步打开 Delphi 12进入Tools Options Environment Options Delphi Options Library - Win32在 Library path 里加上 TMS 的源码目录。然后进入Component Install Packages点击 Add找到 TMS 的运行时 BPL 和设计时 BPL 逐个添加// 这是一段说明不是代码别复制进终端 // 需要点 Add 并选择的文件一般长这样 // TMSVCLUIPkg_D12.bpl —— 运行时包发布时必须带上 // TMSVCLUIDesign_D12.bpl —— 设计时包只在 IDE 里加载 // 如果你的版本是 CBuilder 12包名里的 D12 会变成 C12 或类似写法第三步确认两个必改设置。第一个是 Library path 里要把$(BDSCOMMONDIR)\Bpl放在 BPL 输出目录否则 IDE 找不到新装的设计时包。第二个是 Project Options 里的 Runtime Packages把 TMS 的运行时包名加进去否则项目编译时会跳出找不到 TMSVCLUIPkg_D12.bpl 的错误。安装完成后打开新建 VCL Forms Application 的窗体在控件面板里应该能看到一个 TMS 或 TMS VCL UI Pack 的选项卡。看不到的话不用重装检查 Install Packages 里有没有勾选Library path 有没有把源码目录放在最前面。2.3 跨版本安装到 CBuilderCB 7 到 CB 12 的兼容路径标题里写了支持 Delphi 和 CBuilder 7-12 Athens Full Source这是这套包最有吸引力的地方之一。但跨版本安装不是双击一下就能共用的每个版本的 IDE 内部版本号、编译器路径、BPL 平台格式都不一样。常见做法是在 Delphi 版本下先编译一遍整个源码包生成对应版本的 BPL、DCP 和 CBuilder 需要 的 .bpi/.lib 文件然后在 CBuilder 的 IDE 里做组件注册。CBuilder 12 和 Delphi 12 共用同一个 IDE 底座安装路径和包管理逻辑是一致的所以先装 Delphi 再装 CB 或者反过来都行但不要在同一 IDE 环境里混用两套不同版 本的 TMS。CBuilder 7 是老古董98% 的新项目不会选它但存量项目维护场景中仍然有需求。CB7 使用的是老式 Borland 编译器TMS v13.4.0.1 的源码需要它在编译时忽略一些较新的指令才能过。我遇到过的典型现象是 CB7 报EOLeException或者链接器超过 2GB 虚拟内存限制。解决办法是安装时选择完整源码编译不要用预编译 DCU然后单独给 CB7 建立一套源码副本让两个版本之间的搜索路径隔离。其实真正值得注意的只有一条不要把 Delphi 12 下编译出的 DCU 直接拿给 CBuilder 用。这两套编译器的对象文件格式不同运行时库也不同跨用轻则编译报警重则直接抛 Access Violation。3. 从拖拽到运行把 TMS 控件真正用进项目3.1 用 TAdvTitleBar 与面板体系重构窗体标题栏TMS VCL UI Pack v13 里的 UI 类控件里标题栏和面板体系是日常开发用得最频繁的部分。原生 VCL 的标题栏样式固定想要改背景色、加按钮、放进度条就必须用 OwnerDraw 自己画而 TMS 的 TAdvTitleBar 把这层封装好了。我通常的做法是窗体上放一个 TAdvTitleBar 置顶Caption 留空自己往上叠 TAdvToolBar 或 TAdvButton。用代码控制 Merge 模式来和原生标题栏合并这样 Windows 的系统按钮还能用。procedure TMainForm.FormCreate(Sender: TObject); begin AdvTitleBar1.Enabled : True; AdvTitleBar1.SystemButtons : [sbMinimize, sbMaximize, sbClose]; AdvTitleBar1.TabOrder : -1; AdvTitleBar1.Height : 40; // 关闭原生标题栏标题避免双标题 Caption : ; // 合并模式让 TMS 标题栏接管非客户区绘制 AdvTitleBar1.MergeMode : True; end;这段代码里SystemButtons决定保留哪些系统按钮MergeMode : True是最关键的一个参数设为 True 时 TMS 会把自己绘制的标题栏与 Windows 原生非客户区合并阴影和边缘拖动仍然由系统接管设为 False 就是完全自绘标题栏适合做无边框窗口。但这里有一个坑MergeMode 开启时TMS 标题栏和原生标题栏的高度会叠加计算如果你的窗体在设计时设置了 BorderStyle : bsSingle运行后高度会比预期大十几像素。所以使用 MergeMode 的窗体建议统一用bsSizeable并且在 FormResize 事件里重新设置标题栏宽度。3.2 数据感知控件与数据库开发的组合用法TMS VCL UI Pack 里有一组数据感知控件它们不是简单地把 DBGrid 换个皮肤而是直接嵌入了数据绑定逻辑。以 TAdvDBGrid 为例它除了常规的列编辑、排序、过滤外还支持下拉筛选、多选行、复选框列而且关键是这些功能都做成了原生的数据感知能力不用你写额外的布 局代码。真实项目里最省时间的组合是TAdvDBGrid TAdvPanel TAdvGlowButton。用 TFDQuery 作为数据集然后通过 TDataSource 绑定到网格。这样一个带搜索框、筛选条件的查询页面代码量可以控制在 150 行以内。具体写法如下FDQuery1.SQL.Text : SELECT OrderID, CustomerName, OrderDate, TotalAmount FROM Orders WHERE OrderDate :D1 ORDER BY OrderDate DESC; FDQuery1.Params.ParamByName(D1).AsDate : Date - 30; FDQuery1.Open; AdvDBGrid1.DataSource : DataSource1; AdvDBGrid1.Options : [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgConfirmDelete, dgFilterWidget]; // dgFilterWidget 是 TMS 扩展的筛选下拉这里dgFilterWidget是 TMS 在原生 Options 基础上加的筛选小部件启用后每一列的表头右侧会多一个漏斗样式的筛选按钮用户点击后弹出输入条件。参数说明方面dgIndicator控制最左侧的行指示器列dgConfirmDelete控制 CtrlDelete 删除行时要不要弹确认框。做得久了你会发现TMS 这套组件里真正值钱的是它的TAdvGridExcelIO和TAdvGridExport这类导出类控件。把网格内容导出到 Excel 或 CSV 只需要一行调用不需要引入额外的 Excel 组件。但要注意导出时会按照列的 DisplayFormat 来处理数字和日期格式显示格式没有设置的列导出后可能变成带时间戳的日期需要用代码预设。3.3 多线程与异步场景常用组件选型说到 Delphi 多线程原生 TThread 够用但不够方便。TMS 里提供了一组异步与定时任务相关的控件我在项目里最常用的是TAdvTaskDialog、TAdvSmoothProgress和TMSAsyncTask不同版本里命名可能略有区别。它解决的核心痛点是UI 线程不能卡死但你又不想每个界面都去手写 TThread.Synchronize。用 TMS 的异步任务组件做后台执行步骤大致如下// 异步执行一个耗时的数据加载任务 TMSAsyncTask1.Execute( procedure begin // 后台线程执行耗时操作 SQLDataModule.LoadLargeDataSet; end, procedure begin // 回到 UI 线程更新界面 AdvSmoothProgress1.Visible : False; AdvDBGrid1.RefreshData; end);第一个匿名方法是后台线程执行的逻辑这里放数据加载、文件解析、网络请求这些阻塞操作第二个匿名方法通过主线程调度回到 UI 上下文可以安全地访问窗口上的控件。参数上如果第二个参数为 nil就只执行后台逻辑不通知界面。在实际项目里TMS 的异步机制比原生 TThread 安全得多它内部做了主线程调度缓冲不会出现连点按钮导致两段代码交错执行的情况。但要注意后台线程里不要勾住 VCL 窗口句柄做操作哪怕是Form1.Caption : ...这种看似安全的语句后台线程访问 VCL 组件是典型的内存非法访问来源。4. Full Source 的价值手工编译源码包的完整路径4.1 为什么 full source 包值得处理调试、兼容、定制TMS VCL UI Pack 的安装版只给 BPL 和 DCUFull Source 版额外给你所有 .pas 源码。两者的区别不在功能上而在四个场景里第一处理兼容性问题时你能直接翻 TMS 源码看某个控件的内部实现而不是盲猜报错原因第二Delphi 12 这种大版本升级后控件包往往要等官方发布补丁用源码可以先自己修第三项目组有自己的界面规范时可以直接改控件默认属性而不用每 个窗体手工设置第四调试时能单步进入控件的内部方法很多 Access Violation 一眼就能定位。但这不意味着你可以拿到源码就把整套 UI 包的逻辑全部改一遍。TMS 的架构是基于多级继承的直接改公共父类的行为影响面会扩散到所有控件。所以我的习惯是源码只用于编译和调试业务层需要修改的地方用子类继承而不是去改 TMS 的原始文件。4.2 用命令行编译 TMS 源包的步骤手工编译是 Full Source 包最核心的用法也是很多人不敢碰的部分。其实用 Delphi 自带的命令行编译器 dcc32.exe 就能完成整套编译不需要打开 IDE。REM 先设置 Delphi 12 Athens 的环境变量 set BDSC:\Program Files\Embarcadero\Studio\23.0 set PATH%BDS%\bin;%PATH% REM 进入 TMS 源码目录 cd /d D:\Components\TMSVCLUI\source REM 编译运行时包输出目录指向 IDE 的 BPL 文件夹 dcc32.exe -B -Q -JL -E%BDS%\bin TMSVCLUIPkg_D12.dpk-B表示全量重编译-Q是安静模式-JL指示编译器同时生成 CBuilder 需要的 .obj/.lib/.bpi 文件-E指定输出目录。注意-JL这个参数如果你不在 CBuilder 里用 TMS可以不加但加了也没有副作用顶多多生成几个文件。编译过程中如果报缺少某个单元通常是因为 Library path 没配好。dcc32 不像 IDE 里有图形化的路径管理它只认环境变量里的 Library 路径。一个更省事的方式是直接把搜索路径放在 dcc32.cfg 文件里REM dcc32.cfg 文件中的配置示例 REM 放在用户目录下dcc32 启动时自动读取 -UD:\Components\TMSVCLUI\source -UD:\Components\TMSVCLUI\packages-U参数追加单元搜索路径编译 TMS 之前至少要把它的 source 根目录加进去。如果你在编译时遇到大量F1026 File not found错误不要怀疑源码有问题99% 是缺路径。编译完成后回 IDE先关掉所有已加载的 TMS 包再把新编译的 BPL 重新添加一遍。这里有个先后顺序问题必须先把 IDE 里的旧包移除再加载新编译的 BPL否则 IDE 会锁定旧 DLL 导致文件占用BPL 根本写不进去。4.3 配置 IDE 搜索路径与 BPL 输出到正确位置很多人编译成功后新建项目还是报找不到控件——因为编译输出和 IDE 搜索路径没对上。BPL 输出到 IDE 的 bin 目录只是第一步第二步是让每个项目都能在编译时找到 DCU 和 DCP 文件。实践里比较可靠的配置是在 Delphi 的 Library path 里加上 TMS 源码根目录和编译输出目录在 Browsing path 里加上源码目录这样 Ctrl点击单元能跳转到源码在 Debug DCU path 里加上 DCU 目录这样调试时能单步进源码。三个路径分开写不要偷懒只加一个// IDE 配置路径Tools Options Library 中填写 // Library path 追加 // D:\Components\TMSVCLUI\source // D:\Components\TMSVCLUI\dcu\win32 // D:\Components\TMSVCLUI\dcu\win64 // Debug path 追加 // D:\Components\TMSVCLUI\source参数说明Library path 决定编译器的单元查找顺序把 TMS 源码放在系统自带的 VCL 源码之后Debug path 只影响断点的显示不影响编译结果而 DCP 文件路径通常由 IDE 自动从 BPL 所在目录猜不需要手填。还有一个容易忽略的坑桌面版 Windows 上编译 64 位项目时必须确认 win64 目录下的 DCU 也编译过否则切到 64 位编译平台会报「Unit xxx was compiled with a different version of yyy」。Full Source 包里通常带了一个 BuildAll 批处理或 IDE 项目组建议先在 IDE 里把 Win32 和 Win64 两个平台各全量编译一次再切到命令行操作。5. 源码包安装避坑5 条最常见的翻车记录5.1 安装器找不到 Delphi 12注册表路径缺失现象运行安装程序时让它自动检测 IDE 版本结果只列出了 Delphi 10.4 或 11漏掉了 Delphi 12 Athens。原因安装器读的是注册表HKEY_CURRENT_USER\Software\Embarcadero\BDS\23.0下的安装路径键。某些精简版、绿色版、或者之前装过又卸载的 Delphi 12注册表项不完整安装器没扫到。解决手动在注册表里补齐路径。不要乱填按这个方式补在HKEY_CURRENT_USER\Software\Embarcadero\BDS\23.0下新建字符串值RootDir值设为 Delphi 12 的实际安装目录例如D:\Embarcadero\Studio\23.0再建一个Bin值指向D:\Embarcadero\Studio\23.0\bin。补完之后重新打开安装器通常能识别出来。如果还不行放弃自动安装按上面提到的Component Install Packages手动添加 BPL。5.2 64 位平台编译失败缺 Win64 DCU现象项目切到 64 位 Debug 配置后编译时大量报错提示找不到TMSVCLUIPkg_D12.dcp或者某个.dcu是 32 位版本链接器直接退出。原因TMS 安装器默认只往 Win32 的 Library 路径里塞 DCUWin64 需要单独导入。很多人在 32 位模式下一切正常一换 64 位就懵了。解决先确认你自己的项目平台是 Win32 还是 Win64然后在 Delphi 的Library - Win64配置里把上面提到的搜索路径和 DCU 路径全部加一遍。注意是 ** 加在 Win64 的配置页里**不是 Win32 那页。加完后重新全量编译 TMS 源包确认生成了独立的 64 位 DCU 文件。命令行编译时也别忘了给 dcc32 加-P参数指定 64 位目标。5.3 CBuilder 下链接器报错BPI/LIB 不匹配现象在 CBuilder 12 中调用 TMS 控件编译阶段正常链接时报unresolved external TMSVCLUI...或提示类型库不兼容。原因CBuilder 链接的不是 .pas 而是 .lib/.bpi这两个文件必须在 Delphi 侧用-JL参数生成。如果你的 TMS 源包只编译了 Delphi 版本没有生成 CBuilder 的导入库文件链接自然失败。解决回到 Delphi 12 的环境下重新执行dcc32 -JL TMSVCLUIPkg_C12.dpk确保 .lib 文件输出到 CBuilder 能搜索到的目录。随后把 .lib 所在路径加到 CBuilder 的Project Options Linker Library Path里。如果还报错把 .bpi 和 .lib 文件同时拷到项目输出目录链接器优先搜索本地目录。5.4 运行时包和设计时包装错IDE 启动报错现象IDE 启动时弹出「Package ... 已加载但找不到初始化单元」或「Cannot load package ... 它已经被加载」的错误窗口。更诡异的是点确定后 IDE 还能用但控件面板里的 TMS 菜单消失了。原因设计时包带 Design 后缀的 BPL被误装到了运行时包的位置或者同一套 BPL 在不同 IDE 版本间混用了。TMS 的包分成 Install 到 IDE 的设计期组件和随程序分发的运行期组件混装之后 IDE 在启动加载时发生冲突。解决在Component Install Packages里把带 Design 后缀的包卸载只保留运行时包然后重启 IDE。注意设计时包在项目运行时不需要发布运行时包在 IDE 里也不要尝试卸载二者分工不同。如果重启后还是报错打开 Windows 目录下的ComponentWrapper文件夹或 IDE 的KnownIDE缓存文件删掉旧包记录再重装。5.5 旧版配置覆盖新版安装顺序导致控件版本回退现象电脑上原本装了 TMS v13.3后来拿到 v13.4.0.1 后直接安装升级完发现部分控件还是旧版行为甚至编译时提示单元版本不一致。原因TMS 的源包和 BPL 是分目录存放的安装器不会自动清掉上一次版本的残留文件。新版的 Unit 名和旧版完全一样但二进制文件不同。编译器搜索路径时先找到了旧版的 DCU于是旧版胜出。解决升级前先把旧版 TMS 的 BPL/DCP/DCU 文件全部清掉。做法是在 IDE 里卸载所有 TMS 包关闭 IDE删除 Library path 里所有指向旧 TMS 的路径再删除旧目录下全部文件。最后用新版源包重新走一遍编译与注册流程。不要图省事在原目录上覆盖安装这个坑我踩过三次每次都要多花半小时排错。6. 验证安装的最后一招写一个自检 demo把控件在真实项目中跑一遍装完控件包后很多人习惯新建一个空窗体拖一个 TMS 按钮进去能显示就认为大功告成。但这样其实验证不到 64 位编译、搜索路径、运行时包是否正常更验证不到 Full Source 是否真正生效。我每次装完都会用一个固定模板来验证。新建一个 VCL 项目放一个按钮写一个最简单的动态创建 TMS 控件的测试代码然后一键切换到 Win64 平台编译运行。动态创建的目的不是炫技而是为了绕过 IDE 设计时的包加载——如果动态创建能成功说明运行时包和搜索路径正确如果失败肯定是运行时包版本或路径问题。procedure TForm1.btnTestClick(Sender: TObject); var pnl: TAdvPanel; bar: TAdvTitleBar; begin // 动态创建淡入淡出面板 pnl : TAdvPanel.Create(Self); pnl.Parent : Self; pnl.Left : 20; pnl.Top : 20; pnl.Width : 300; pnl.Height : 120; pnl.Color : clSkyBlue; pnl.Visible : True; // 动态创建标题栏并挂到面板上 bar : TAdvTitleBar.Create(Self); bar.Parent : pnl; bar.Align : alTop; bar.Height : 24; bar.Caption : TMS Self-Test; bar.Visible : True; Memo1.Lines.Add(TMS VCL UI Pack loaded. ClassName: pnl.ClassName); end;这段代码里TAdvPanel和TAdvTitleBar都用了 TMS 的完整类名如果编译通过且运行后能看到面板和标题栏说明安装流程没问题。Memo1是一个普通的 TMemo用来输出一个证明信息。如果你拿到的是 Full Source 版本这时候再做一个动作在TAdvTitleBar.Create那一行下断点按 F7 单步如果跳进了 TMS 的源码文件说明 Full Source 的调试路径配置正确如果跳到 DCU 就直接出来说明调试路径没配好需要回头检查 Debug DCU path。验证完这个 demo 后再确认两件事把项目 Release 配置复选掉「Use runtime packages」看看把 TMS 静态编译进 exe 是否正常再把 32 位和 64 位各编一次看是不是都能跑。这两个通过基本可以放心拿它开工了。每次装好控件包我都习惯把这个测试代码保存成一个工程模板以后换电脑、换版本、给人排错都用它。装控件最怕的就是装完觉得好了结果写到一半发现某个核心组件有问题那才是真后悔药都没处买。几分钟的验证能省下来后面至少一两天的排查时间希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。