ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TMS Smart Setup控件包安装全攻略:从Delphi编译到IDE部署

TMS Smart Setup控件包安装全攻略:从Delphi编译到IDE部署 简介Delphi 12.3控件包tmssoftwaresmartsetup-main.zip是TMS Software推出的SmartSetup组件集专门面向使用Delphi或C Builder开发桌面应用的工程师用于快速制作专业的安装与卸载程序。组件高度可定制支持安装向导设计、多种安装选项、多语言界面、脚本处理和卸载功能开发者可直接参考或集成免去从零编写安装脚本的繁琐工作。压缩包共321个文件整体仅1.51MB体量虽小但类型清晰以188个Pascal源文件pas为核心同时包含dproj、dpk、groupproj等工程与包定义文件dfm窗体文件res/rc/ico等资源与图标文件以及bat构建脚本、md说明文档和少量yaml配置便于研究组件内部实现和模块划分。目前已有51人浏览学习无论是集成到自己的Delphi项目中还是作为学习SmartSetup工作原理的完整样例都能帮助开发者提升安装程序品质、加快发布流程是一份值得收藏的实用资源。1. 拿到 tmssoftwaresmartsetup-main.zip 之后这包控件到底解决什么问题如果你最近刚把 RAD Studio 升级到 Delphi 12.3又恰好从 TMS Software 的仓库里拉下来一个叫 tmssoftwaresmartsetup-main.zip 的压缩包那你大概率是在找一套能一次性把常用第三方控件装齐的办法。Smart Setup 是 TMS 系控件包的集中安装入口它不直接提供某个具体的控件而是把 TMS 旗下十几个产品线Business、Cloud Pack、UniGUI 集成、Component Pack 等统一塞进一个安装调度器里再通过 IDE 的包注册机制装进 Delphi。对刚从 C# 切过来的 Delphi 新手或者手上有三四台机器都要配环境的团队来说这包能省掉大量逐个装控件的重复操作。本文就围绕这个 zip 展开讲清楚它的安装结构、实际用法、常见翻车点和批量部署的可行路径。2. 拆开 Smart Setup 的安装结构为什么要先搞清楚 BPL 和 DCU 的编译链路2.1 它和普通控件包的区别不是解压就能用而是一个构建调度器普通 Delphi 控件包比如你单独下载一个 TMS Component Pack解压后往往是一个 dpk 工程文件加上一堆源码手动在 IDE 里打开编译即可。tmssoftwaresmartsetup-main.zip 不太一样它的根目录下一般是一个调度项目里面会引用若干子项目的 dpk 文件并且按 run-time 包和 design-time 包做了分层。你如果直接双击某个 dpk 就编译大概率会撞上一堆找不到 DCU 的报错因为 run-time 包还没先编译design-time 包依赖的 .bpl 文件还不在 Library 路径里。我一般会先打开根目录里的 install.txt 或 readme 扫一眼确认它支持的 Delphi 版本区间。这个 zip 既然带 12.3 的标识说明至少 RAD Studio 12.3 是它的目标版本之一。但要注意Delphi 从 10.4 开始把 32 位和 64 位的 Windows 平台分开编译同一个 dpk 要分别用 Win32 和 Win64 各编一次否则你在 64 位项目里引用控件时会看到“无法解析单元”的提示。2.2 包名后缀的约定dpk、bpl、dcu、dcp 各自扮演什么角色要理解 Smart Setup 的构建流程得先分清楚这几个后缀。.dpk 是 Delphi 包工程文件它描述一个包的编译单元列表.bpl 是编译后生成的二进制包运行时被 IDE 或应用程序加载.dcu 是编译出的单元文件供其他项目引用.dcp 是包编译时生成的互操作文件当项目要引用某个包里的组件时链接器通过它解析符号。Smart Setup 在编译时通常会先生成 run-time 包再生成 design-time 包最后把 design-time 包注册到 IDE 里。这里有个常见误区有人把 dcu 文件手动丢进项目目录就以为装好了但 Delphi 的组件面板是靠 design-time 包注册才出现的。没有把带 Dsgn 后缀的包装进 IDE你连一行代码都拖不出来。所以用 Smart Setup 安装后还得回到 IDE 的 Component Install Packages 里确认那个 TMS 的 design-time 包出现在已安装列表。2.3 编译顺序为什么会决定成败TMS 的控件之间有不少互相依赖关系函数Cloud Pack 可能会引用核心包里的 JSON 解析器UniGUI 集成又依赖网络通讯层的包。如果你只选中某个产品线单独编译它的 dpk 引用了另一个还没编译的包编译器就会停下来报“找不到 xxx.dcp”。Smart Setup 的价值就在于它把依赖顺序写进了构建脚本通常从核心包开始逐级往上编。所以我的建议是别自作聪明去手动挑包编译直接跑它的安装批处理或 msbuild 脚本让调度器按既定顺序处理。:: 以 PowerShell 调用 msbuild 编译 Smart Setup 的 run-time 包先编核心再编组件 msbuild tmssmartsetup.core.dproj /t:Build /p:ConfigRelease /p:PlatformWin64 msbuild tmssmartsetup.components.dproj /t:Build /p:ConfigRelease /p:PlatformWin64这里第一条命令编译核心包第二条编译组件集。为什么要分两次因为 components 包依赖 core 包生成的 dcp 文件如果一口气把两个工程塞进同一个 msbuild 命令行构建系统可能并行处理导致第二个包在找不到依赖时就报错。分开执行能确保先编译的 core 包把 .dcp 和 .bpl 完整落到输出目录。另外Config 和 Platform 参数要和你后续 IDE 里的项目配置保持一致比如你项目要用 Win64 Release那这里就必须先编出 Win64 Release 版本的包。3. 装进 IDE 的完整流程从 zip 解压到组件面板出现 TMS 页签3.1 第一步规划安装目录和 Library 路径解压 zip 之前先想清楚两件事目录路径里不要带中文、不要带空格这是 Delphi 包编译的老大难问题。bpl 文件在运行时要被 IDE 加载路径一复杂加载器偶尔会抽风。我习惯把目录放在 D:\Components\TMS\SmartSetup 这种纯英文短路径下。解压之后在 IDE 的 Tools Options Environment Options Delphi Options Library 里把源码目录通常是 Source 或 src 子目录加进 Library path。这一步很多人会漏结果编译时提示找不到单元其实就是因为搜索路径里没有源码。Library path 的设置直接影响 dcu 文件的解析。Delphi 在你打开一个项目时会按 Library path 的顺序查找单元文件。Smart Setup 的源码目录里有多层子文件夹建议把根目录整个加进去这样所有子目录都会递归参与搜索。Windows 平台下还要确认 Win32 和 Win64 两个平台分支的路径都配了不要只配一个。3.2 第二步用管理员权限执行安装脚本大多数情况下zip 里会带一个 install.bat 或 setup.cmd。按以往 TMS 工具的习惯它内部会逐一调用 msbuild 编译所有 dpk然后用一个 regsvr32 或者 IDE 命令行工具注册 design-time 包。如果你不放心可以先打开安装脚本看看里面的包注册命令是什么。有一个值得留意的细节如果你机器上装了多个 Delphi 版本脚本可能需要通过参数指定版本号比如 /D:12.3 或者通过环境变量指向 BDS 的根目录。执行脚本时务必右键选择以管理员身份运行。这不是玄学因为设计期包注册时往往要写注册表项以及 Program Files 下的 IDE 插件目录权限不足时bds.exe 启动后根本看不到新增的包。另外如果系统开了 UAC脚本弹出提权窗口时别急着关掉等着它跑完。运行完脚本后不要立刻开 IDE先去安装目录里确认关键产物是否存在:: 检查核心 bpl 是否生成文件名以版本号结尾 dir D:\Components\TMS\SmartSetup\output*.bpl3.3 第三步在 IDE 里验证包是否注册成功重新启动 Delphi 12.3打开一个 VCL 项目右键组件面板看看是否多了一个 TMS 开头的页签。如果页签存在随机拖一个 TMS 按钮到窗体上试试编译运行。如果页签没出现先别急着重新跑安装脚本。去 Component Install Packages 里检查列表里是否有 TMS Smart Setup 相关条目如果没有点右边的 Add 按钮手动指向输出目录里的 design-time bpl。另外要注意Delphi 12.3 默认启动时只加载 Win64 的 design-time 包如果你刚才编译安装的只有 Win32 版本在 64 位 IDE 里是看不到组件的。所以我要强调一遍Win32 和 Win64 两个平台的包都要编译安装否则组件面板上要么什么都看不到要么只能在特定平台的项目里用。4. 核心控件能用在哪用 TMS 组件十分钟搭一个带圆角面板的配置界面4.1 TMS Component Pack 里最常用的几类控件装好 Smart Setup 后真正会被高频使用的是 TMS Component Pack 里的 VCL 控件。和 C# WinForm 里常见的控件对照着看TMS 的好处是很多组件自带皮肤和属性面板不需要额外换肤控件。比如 TAdvPanel 可以直接设置圆角属性 CornerRadius在设计期就能预览效果TAdvListView 内置了分组视图和图标视图切换TAdvGroupBox 可以设置子控件间距避免手动对齐的重复劳动。对做桌面工具类软件的团队来说这类控件能省下大量 UI 布局时间。工具栏按钮、状态栏、左侧导航树、右侧内容面板这是桌面应用最常见的布局模板。TMS 提供了一个叫 TAdvDockPanel 的停靠面板体系可以把窗口拆成多个可拖拽区域类似 IDE 自己的布局。我在做一个设备调试工具时用过这套体系比原生 VCL 的 Panel 嵌套清爽很多代码量至少少了一半。4.2 一个最小可用示例圆角卡片面板 带复选框的列表下面这个例子展示了如何在一个空窗体上放一个圆角面板并在里面塞一个带复选框的列表控件。代码是按 Delphi 12.3 的 VCL 框架写的所有组件都来自 TMS 包。procedure TForm1.FormCreate(Sender: TObject); var CardPanel: TAdvPanel; CheckList: TAdvCheckListBox; i: Integer; begin // 创建圆角卡片面板 CardPanel : TAdvPanel.Create(Self); CardPanel.Parent : Self; CardPanel.Align : alClient; CardPanel.CornerRadius : 16; // 设置圆角半径 CardPanel.Padding.SetBounds(12, 12, 12, 12); // 创建带复选框的列表控件 CheckList : TAdvCheckListBox.Create(CardPanel); CheckList.Parent : CardPanel; CheckList.Align : alClient; CheckList.BorderStyle : bsNone; // 去掉边框更贴合卡片风格 for i : 0 to 4 do CheckList.Items.Add(通道 IntToStr(i 1)); end;代码里的 CornerRadius 属性就是标题相关热搜词里“panel控件圆角”的直接落点。TAdvPanel 在默认情况下是矩形设置 CornerRadius 后面板的背景绘制会自动裁切成圆角矩形Padding 控制了面板内部控件与边框的间距这相当于 C# WinForm 里 Padding 属性的效果但 TMS 的 Padding 是 TAdvPanel 内建的不依赖外部布局容器。TAdvCheckListBox 是 TMS 对原生 TCheckListBox 的增强版支持自定义绘制和禁用状态。设计期操作的话从面板拖一个 TAdvPanel 到窗体在 Object Inspector 里改 CornerRadius 为 16再把 Padding 展开设四个方向的值然后拖 TAdvCheckListBox 到面板上Align 设为 alClient。全程不需要写代码这就是设计期控件的价值。4.3 调整子控件间距和控件过多时的性能权衡热词里有一条“子控件间距”和一条“c#控件多致winfrom卡”虽然是 C# 语境但 VCL 里同样存在类似问题。TMS 的 TAdvPanel 内部用的是组件自绘逻辑不像 WinForm 那样依赖原生句柄。所以在一个面板里放上百个子控件时TMS 的绘制性能通常比原生 VCL 好但也不是无限量的。我见过有人在一个 TAdvPanel 里动态创建了五百多个 TAdvCheckListBox结果窗体打开要好几秒。这个问题的根源不是 TMS 本身慢而是每个控件都有独立的 Windows 消息循环。解决方案有两个一是用虚拟列表代替大量真实控件TAdvListView 在 ViewStyle 设为 vsList 时可以只创建可见行对应的绘制单元数据量上万也不卡二是把不常更新的控件分组放在不同的 TAdvPanel 里利用面板的 Visible 属性按需加载。血的教训是不要用循环创建成百上千个按钮或复选框虚拟列表永远比堆控件更符合“控件过多卡顿问题解决方案”的诉求。5. 避坑记录装不上、控件失踪、编译报错与卸载残留的排查路径5.1 安装脚本跑完但组件面板没有 TMS 页签现象msbuild 输出了 Build succeededIDE 里却没有新增页签。原因八成是 design-time 包没有注册成功。Smart Setup 脚本里注册包的步骤依赖 BDS 环境变量如果你是在普通 CMD 窗口运行脚本这个变量可能没被设置导致注册动作定位到了错误的 IDE 版本。另外如果你机器上同时装有 Delphi 11 和 12.3脚本有可能把包注册到了 11 里。解决先在命令行里手工设置 BDS 路径再重新注册set BDSC:\Program Files (x86)\Embarcadero\Studio\23.0 %BDS%\bin\bds.exe /Register 或使用 delphi 自带的 rsvars.bat 初始化环境后 msbuild tmssmartsetup.install.dproj /t:Install5.2 编译项目时提示找不到 xxx.dcu现象组件在 IDE 里显示正常但一编译项目就报找不到单元文件。原因Library path 里没有包含 TMS 源码目录或者包含的是 32 位输出目录而项目在编 64 位。解决打开 Tools Options Library在 Win64 分支下把 D:\Components\TMS\SmartSetup\Source 加进去。如果还不行检查项目文件里的 DCU 输出目录是否覆盖了全局 Library path将项目选项里的 Search path 留空让它走全局配置。5.3 反复安装后出现两个版本的重复控件现象组件面板上出现两组同名控件拖到窗体时随机报错。原因卸载旧版本时只删除了源码目录和 dcu 文件没有清理 IDE 里的 bpl 注册信息。TMS 的包注册项还残留在注册表和 IDE 配置里重装后新注册条目和残留条目重复。解决去 Component Install Packages 里找旧版本的 TMS 条目点 Remove 移除关键一步是许多人会跳过的“后悔药”机会然后关闭 IDE再删除 IDE 根目录下的注册缓存文件最后重新打开 IDE执行一次安装脚本。5.4 Win32 编译通过但 Win64 报链接错误现象编译 32 位项目正常切到 64 位就报“无法定位 .obj 文件”。原因只编译安装过 Win32 的 bplWin64 输出目录是空的。解决用 msbuild 按 Win64 平台重新编译一次并确认 Win64 的 Library path 已配置。在 64 位 IDE 里工作design-time 包也必须是 64 位版本。5.5 使用 ActiveX 版本的 TMS 控件时报“不能实例化”现象Project 里可以引用 TMS 的 ActiveX 控件运行时创建对象失败。原因ActiveX 控件没有注册到系统或者注册的 DLL 与当前项目平台位数不匹配。这一问题在 TMS 的 FlexCel 导出组件里比较常见它底层是 COM 对象。解决在系统里注册对应的 ActiveX DLL。注意 32 位可执行文件必须用 32 位版本的 regsvr32不要用 64 位系统目录里的那个去注册 32 位 DLL否则你会看到“模块已加载但找不到入口点”的诡异报错。注册命令如下regsvr32 D:\Components\TMS\FlexCel\Bin\Win32\FlexCel.ocx6. 批量部署与验证用命令行把 5 台机器的 Delphi 环境一次装齐如果你要给团队里多台开发机装同一套 TMS 控件手动一台台点安装脚本太磨人而且每台机的 Delphi 安装路径可能略有差异逐台排查太磨人。更实际的做法是把 Smart Setup 的 msbuild 命令写成一个 PowerShell 脚本配合参数化路径和日志输出跑完自动发通知。这个方案不仅适合 TMS也适合团队里其他控件包的批量安装。先定义一组安装参数然后统一执行在脚本里用数组承载 Win32/Win64 两个平台逐个跑 msbuild$BDS ${env:ProgramFiles(x86)}\Embarcadero\Studio\23.0 $SourceDir D:\Components\TMS\SmartSetup $Config Release $Platforms (Win32, Win64) foreach ($plat in $Platforms) { Write-Host Building core package for $plat $BDS\bin\msbuild.exe $SourceDir\tmssmartsetup.core.dproj /t:Build /p:Config$Config /p:Platform$plat | Out-File install_$plat.log if ($LASTEXITCODE -ne 0) { Write-Host Build failed for $plat, check install_$plat.log exit 1 } } Write-Host All platforms build OK$BDS 路径从注册表读取效果更好。RAD Studio 的安装路径在 HKLM\SOFTWARE\Embarcadero\BDS\23.0 里有一个 RootDir 值下面这段函数是兼容性较好的读法function Get-BDSRoot { $reg Get-ItemProperty HKLM:\SOFTWARE\Embarcadero\BDS\23.0 return $reg.RootDir } $BDSRoot Get-BDSRoot为什么要从这里读而不是直接写死团队里有人装在 C 盘有人装在 D 盘写死路径会让脚本在部分机器上翻车。从注册表读取是通用且稳定做法属安装类脚本的基本功。脚本里每个平台单独写日志失败时能精准定位到那一台机器上到底是哪个平台未通过。等到 msbuild 全部通过后再执行一次脚本实现 design-time 包的注册。验证装没装好也有自动化的写法。Delphi 的 IDE 可以带参数启动并执行一次项目编译但更直观的是用 grep 去查注册表的包列表执行/r参数查询已注册的 TMS 包能判断当前机器是否已安装。另一个验证方式是编译一个预先写好的示例项目把示例工程放在共享目录里每台机器跑完安装脚本后执行一次 msbuild 编译示例只要编译不报错就说明该机器环境符合要求。所有输出写到一个汇总文件里$LogName $env:COMPUTERNAME _ (Get-Date -Format yyyyMMdd_HHmmss) .log $Summary Machine $env:COMPUTERNAME checked. $LASTEXITCODE $Summary | Out-File D:\DeployLogs\$LogName将这些脚本保存为 .ps1 或 .cmd 放到共享目录后在新的开发机上直接右键管理员运行即可。整个过程跑完大约十分钟比逐台安装节省的时间非常可观。我自己现在配新机器第一件事就是先跑一遍这样的脚本再打开 Delphi 做手工确认。经验就是控件安装这种事看似简单但坑全在细节里。每次报错时我都会先追问一句“路径对不对、平台对不对、注册了没”。顺着这三个方向排查多数问题五分钟内就能定位。希望这套从解压到部署的流程能帮你避开那些我踩过的坑省下半天时间去做正事。本文还有配套的精品资源点击获取
返回列表