Delphi/C++ Builder 10.3.3 安装 TMS 控件避坑指南:从源码到UI Pack的完整流程
Delphi/C++ Builder 10.3.3 安装 TMS 控件全流程避坑指南
第一次在RAD Studio里装TMS控件时,我盯着空荡荡的组件面板发呆了半小时——明明按照教程操作了,为什么我的C++ Builder里就是找不到TAdvStringGrid?后来才发现,原来Delphi和C++ Builder的安装路径配置有微妙差异。这份指南会带你避开我踩过的所有坑,从源码编译到UI Pack部署,手把手实现零失败安装。
1. 环境准备与基础配置
安装TMS控件前,确保你的开发环境已经正确配置。很多人跳过这步直接安装控件,结果遇到各种路径问题。打开RAD Studio 10.3.3时,注意区分三种启动方式:
- RAD Studio:完整IDE环境(推荐)
- Delphi:仅Delphi开发环境
- C++ Builder:仅C++开发环境
提示:TMS控件通常需要先在Delphi环境下安装,即使你主要使用C++ Builder
检查Library Path是否包含必要路径。在Tools → Options中:
Delphi Options → Library → Library Path 应包含: 1. $(BDS)\TMS 2. $(BDS)\TMS\XlsAdapter 3. $(BDS)\bin C++ Options → Paths and Directories 需额外配置: - Include Path:添加上述相同路径 - Library Path:添加上述相同路径常见错误排查表:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 编译时找不到.dcu文件 | Library Path未正确配置 | 检查路径是否包含TMS源码目录 |
| 设计时控件不显示 | 未以管理员身份安装 | 关闭所有杀毒软件后重装 |
| 运行时提示bpl缺失 | BPL输出路径错误 | 确认BPL文件生成在Public Documents对应目录 |
2. 源码安装深度解析
从源码安装TMS控件能获得最大灵活性,但也是坑最多的方式。我推荐使用TMS Component Pack (SRC) v9.2.4.0版本,兼容性较好。解压后建议将整个TMS文件夹放在RAD Studio安装目录下,例如:
D:\Program Files\Embarcadero\RAD Studio\20.0\TMS关键操作步骤:
- 关闭所有工程:File → Close All,避免锁定bpl文件
- 加载组项目:打开tmsdXE12group.groupproj(不要直接打开单个bpl项目)
- 编译顺序:先编译TMSBaseGroup,再编译其他组件组
- 安装技巧:右键点击tmsdXE12.bpl选择Install,而非直接运行
注意:如果遇到"[Fatal Error] Could not create output file"错误,是因为之前的安装残留锁定了文件。彻底关闭IDE后删除以下目录内容:
- C:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl
- C:\Users\Public\Documents\Embarcadero\Studio\20.0\Dcp
C++ Builder用户特别注意:源码包默认只包含Delphi工程文件,必须通过Delphi环境安装后,才能在C++ Builder中使用。这就是为什么很多C++开发者单独安装时控件不显示的根本原因。
3. UI Pack安装的利与弊
TMS VCL UI Pack是更简单的安装选择,它包含了TAdvStringGrid等所有控件的一键安装包。但要注意版本匹配——UI Pack 10.1.6.1是专门为RAD Studio 10.3.3设计的版本。
安装流程差异对比:
| 步骤 | 源码安装 | UI Pack安装 |
|---|---|---|
| 准备工作 | 需下载源码包 | 只需exe安装包 |
| 安装时间 | 15-30分钟 | 5分钟 |
| 自定义能力 | 可修改源码 | 固定功能 |
| 更新难度 | 需重新编译 | 直接覆盖安装 |
UI Pack安装后需要特别处理bpl文件:
- 将Crack/Win32下的bpl文件复制到:
C:\Users\Public\Documents\Embarcadero\Studio\20.0\Bpl - 同名文件选择覆盖
- 重启RAD Studio
实测发现,UI Pack安装后偶尔会遇到设计时控件显示但运行时出错的情况。这时需要检查:
- 项目Options → Packages → Runtime Packages是否包含TMS组件
- 项目Options → Delphi Compiler → Unit scope names是否添加TMS
4. TAdvStringGrid专项配置
作为TMS套件中最受欢迎的网格控件,TAdvStringGrid的配置有其特殊性。安装成功后,在组件面板的TMS分类下应该能看到它。如果找不到,尝试:
procedure TForm1.FormCreate(Sender: TObject); begin // 手动注册组件(仅在极端情况下需要) RegisterComponents('TMS', [TAdvStringGrid]); end;常用属性快速参考表:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| FixedCols | Integer | 1 | 固定列数 |
| FixedRows | Integer | 1 | 固定行数 |
| GridLineColor | TColor | clSilver | 网格线颜色 |
| Version | string | '5.0.0.0' | 控件版本检测 |
性能优化建议:
- 大数据量时设置
BeginUpdate和EndUpdate - 禁用
DoubleBuffered可提升渲染速度 - 使用
VirtualMode处理超百万行数据
5. 跨版本迁移实战技巧
当需要将项目迁移到新版本RAD Studio时,TMS控件的处理需要格外小心。我总结的迁移三部曲:
备份阶段:
- 导出当前Library Path配置
- 备份所有自定义的TMS控件设置
- 记录项目使用的具体TMS版本号
清理阶段:
# 管理员权限运行 del /f /q "%PUBLIC%\Documents\Embarcadero\Studio\20.0\Bpl\TMS*.bpl" del /f /q "%PUBLIC%\Documents\Embarcadero\Studio\20.0\Dcp\TMS*.dcp"重建阶段:
- 在新环境安装匹配版本的TMS
- 仅添加必要的Library Path
- 逐个项目测试控件兼容性
迁移后常见问题解决方案:
- 如果提示版本不匹配,检查.dproj文件中的版本号
- 设计时出现乱码通常是编码问题,设置
TMSStyle属性重置 - 性能下降时尝试禁用动画效果和高级渲染特性
6. 疑难杂症解决方案库
收集了开发者社群中最常遇到的五个典型问题:
Q1:安装成功后,为什么设计时能看到控件但运行时提示类未注册?A:这是因为运行时包没有正确部署。解决方案:
- 确认项目Options → Packages → Runtime packages包含TMS组件
- 检查部署机器的BPL路径是否在系统PATH中
- 对于C++项目,需要在Additional Options添加
-luTMS
Q2:如何判断是源码问题还是安装问题?创建最简单的测试项目:
uses AdvStringGrid; procedure TForm1.Button1Click(Sender: TObject); var Grid: TAdvStringGrid; begin Grid := TAdvStringGrid.Create(Self); try Grid.Parent := Self; Grid.Align := alClient; Grid.Cells[1,1] := 'Test'; finally Grid.Free; end; end;如果这个基础测试能运行,说明安装正确,问题出在你的项目配置。
Q3:为什么修改了源码但重新编译后变化没生效?这是因为IDE缓存了dcu文件。强制重新编译的方法:
- 删除所有dcu文件
- 在项目选项勾选"Rebuild as needed"
- 执行Build而非Make
Q4:在多显示器环境下控件设计器崩溃怎么办?这是已知的RAD Studio兼容性问题。临时解决方案:
- 关闭所有浮动窗口
- 设置主显示器缩放为100%
- 在注册表禁用DPI感知:
[HKEY_CURRENT_USER\Software\Embarcadero\BDS\20.0] "DisableDpiScaling"=dword:00000001
Q5:如何彻底卸载TMS控件?完整卸载步骤:
- 卸载Package(Component → Install Packages)
- 删除所有相关bpl和dcp文件
- 清理Library Path中的TMS路径
- 删除注册表项:
HKEY_CURRENT_USER\Software\TMS Software
实际项目中,遇到一个特别棘手的问题:在Windows 11高DPI环境下,TAdvStringGrid的滚动条会异常闪烁。最终发现需要同时设置:
AdvStringGrid1.DoubleBuffered := True; AdvStringGrid1.DrawingStyle := gdsClassic;