简介:集中了Delphi 12.3环境下的TMS VCL UI Pack v13.5.0.1控件包,面向VCL框架桌面应用开发者,提供涵盖工具栏、菜单、网格、图表、编辑框等多场景的成熟UI组件。该版本发布于2025年3月,包含组件库近期的功能更新与修复,适合中高级Delphi开发者使用。压缩包总计2000个文件,以PAS源码、DFM窗体、DPROJ/DPR工程文件为核心,配套RES/DCR资源、ICO/JPG/PNG图片、PDF文档、CSV样例及演示项目,整体约123.27MB;其中PAS单元为组件核心逻辑,DFM记录窗体布局,DPK包文件便于IDE集成调用,目录结构清晰。已有76人学习/下载,适合在项目中快速引入专业界面组件、缩短选型与适配周期的开发者,尤其推荐需要Delphi 12.3紧随版本更新的团队参考。解压后可获得大量示例工程与源码级Demo,直观演示各组件的属性、事件和调用方式,结合官方PDF文档可进一步二次开发,满足企业级桌面应用的界面交互需求,提升开发效率。
1. 拿到 rar 不等于装完:TMS VCL UI Pack 压缩包安装的三件易错事
解压之后,双击某个 .dpk 然后点 Install 的流程,在 TMS VCL UI Pack v13.5.0.1 这种规模的 rar 包里往往不够用。源码头没加进 Library Path、先装了设计期包而运行期包还没编译、选错了 10.4 Sydney 对应的包目录,这三件事出现任何一个,Delphi 12.3 都会给出要么 Tool Palette 找不到 TAdvStringGrid、要么编译到一半 unit not found 的结果。压缩包形态与官方安装器的差别在于,它把包部署的决策权移交给你,而决策的核心只有一条主线:运行期 BPL 只 Build 不安装,设计期 BPL 才 Build 后安装。理清这条线,控件安装、数据联动和中文乱码的排查才有共同语境,Community Edition 与商业版在这点上也没有差别。
有五年以上 VCL 经验的人往往不是被控件本身难住,而是被包与 IDE 的关系绕进去。下面按解压、编译、验证、实战、自查五个环节把这套流程说透,每一步都给你可以直接照抄的命令和参数。
2. 先配置再编译:用 7z 解压 TMS 包、Library Path 与 BPL 顺序
2.1 用 7z 解压 rar 包并核对 TMS 目录结构
这个时间段还能拿到 rar 格式的组件分发包,多半是从共享资源池或内部网盘同步下来的。文件形态决定了第一步不是双击,而是把目录结构完整还原到固定盘符。我习惯用 7-Zip 命令行处理,避免资源管理器里解压到一半弹窗中断。
"C:\Program Files\7-Zip\7z.exe" x "TMS VCL UI Pack v13.5.0.1 (March 19, 2025).rar" -o"D:\Components\TMS" -yx表示保留压缩包内的完整路径解压,-o指定输出根目录,-y跳过所有确认。注意-o后面不要带多余的斜杠和引号,路径含空格时整个输出参数照写即可。如果你机器上只有 WinRAR,等价命令是WinRAR.exe x -o+ -y 包名 D:\Components\TMS。
解压完先核对目录名再动手编译。一个规范的 TMS 压缩包内通常能看到Packages、Source、Themes、Demos、Docs这几层,其中Packages是编译入口,Source是要加进 IDE 搜索路径的源码层,Demos里有各控件的示例工程,排查 API 用法时它比文档更直接。部分版本会在Source下按控件分类划分子目录,比如Source\Grid、Source\Chart、Source\Dialogs,后面配 Library Path 时逐项核对。
2.2 把 TMS 源码头加进 Delphi 12.3 Library Path
在 RAD Studio 12.3 里依次打开 Tools > Options > Environment Options > Delphi Options > Library,在 Library path 末尾追加以下路径:
D:\Components\TMS\Source D:\Components\TMS\Source\Grid D:\Components\TMS\Source\Chart具体子目录以你解压出的实际结构为准,不必照搬这份列表。这里有一个新手和熟手都会踩的误区:加了源码头不等于控件会出现在 Tool Palette 上,它只解决代码里uses AdvStringGrid时 IDE 能否找到单元文件的问题。组件能不能拖到 Form 上,取决于设计期包是否被 IDE 加载,这一步在下一章做。
加完路径后在 IDE 里触发一次 Code Completion 或干脆重启一次 IDE,让 Library path 的缓存刷新。排查时如果出现找不到AdvStringGrid单元的错误,第一件事就是回到这个配置页确认路径有没有被写入当前 BDS 版本而不是旧的 10.4 Sydney 配置。
2.3 运行期 BPL 与设计期 BPL:编译顺序决定成败
TMS 这套组件的交付物按角色分为四类,理解它们的区别比背编译步骤更重要。
| 文件类型 | 常见后缀 | 编译动作 | 安装动作 | 作用 |
|---|---|---|---|---|
| 运行期包 | bpl | Build | 不安装 | 封装控件运行时代码,链接进应用 |
| 设计期包 | bpl | Build | Install | 向 Tool Palette 注册设计期组件 |
| 编译器符号 | dcp | Build 时生成 | 不安装 | 提供单元符号信息 |
| 编译产物 | dcu | Build 时生成 | 不安装 | 预编译单元,加速后续编译 |
运行期 bpl 是应用编译和运行时的依赖,设计期 bpl 则负责把控件拖拽到窗体上的能力。TMS 官方安装器也是按这个顺序执行:先构建运行期包,再构建设计期包。手动安装时最常见的报错是在设计期包 Build 阶段出现E2201 Need imported data reference或unit not found,原因几乎都是运行期包还没构建完,编译器找不到它导出的符号。
我一般会先按包名顺序打开所有带Run或Runtime标识的 dproj,逐个 Build,确认全部成功后再打开 design 包。不要一上来就双击排序靠前的 dproj 然后直接 Install,这个顺序错了,后面每一步都会跟着报错。
3. 在 Delphi 12.3 IDE 里 Build 并 Install TMS 设计期包,验证 Tool Palette
3.1 选中与 Delphi 12.3 匹配的包目录
TMS VCL UI Pack 的Packages下通常会按目标 IDE 分目录,有的用版本代号,有的用 IDE 名。打开Packages后先看目录名,找到对应 Delphi 12 Athens 的那一层,而不是 10.4 Sydney。混用版本目录打开的 dproj 在编译初期就能看到E2597 c:\program files (x86)\embarcadero\studio\21.0之类的路径残留,那是 10.4 工具链的典型印记。
| 目录名关键词 | 对应 IDE | 是否适用 12.3 |
|---|---|---|
| Sydney / 10.4 | RAD Studio 10.4 | 否 |
| Alexandria / 11 | RAD Studio 11 | 兼容性待测,建议用 12 目录 |
| Athens / 12 | RAD Studio 12 | 是 |
判断不准时直接在 dproj 里搜<ProjectVersion>和BDS关键词,但最稳妥的做法还是打开包内 Readme 或带版本号的目录名。这个环节值得花一分钟确认,省下的排错时间不止一分钟。
3.2 对 run 包 Build、对 design 包 Build 再 Install
找到正确的包目录后,在 Project Manager 里按顺序操作:
1. 打开运行期 dproj 2. Project Manager 右键项目节点,选 Build 3. 等待 Output 窗口显示 Build succeeded 4. 打开对应设计期 dproj 5. Build 成功后,右键项目节点,选 Install 6. 等待 IDE 提示 package installed这里强调一个容易被忽略的配置:Project Manager 上方的配置下拉框建议切到 Release,而不是 Debug。用 Debug 配置编译出的包也能注册进 IDE,但体积更大、符号表全开,IDE 启动加载时会更慢。Release 配置对设计期包和运行期包都推荐。
如果你在 Install 时收到 “Module already exists” 的提示,说明同名 bpl 已经被当前 IDE 进程加载,通常是上一个旧版本 TMS 包没卸载干净。正确处置是关闭 IDE,在 Windows 服务里确认没有残存的 bds.exe,然后重新打开再 Install。直接覆盖安装会让 Old 版本和 New 版本的包注册信息混在一起,Tool Palette 里出现两个重复控件分组。
注意:Install 后如果 IDE 启动提示找不到某个 bpl,先把
D:\Components\TMS\Packages\Win32\Release这样的输出目录加进系统 PATH,再重启 IDE。Delphi 加载运行期包时会沿着 Known IDE Packages 和 PATH 环境变量去定位依赖,路径对不上就会出现启动即报错。
3.3 放一个 TAdvStringGrid 到空白 Form,编译验证注册结果
Tool Palette 验证只能证明设计期包注册成功,真正能说明运行期包也正常的方式是新建一个 VCL 应用,把 TAdvStringGrid 拖到 Form 上,再写一段落地代码并编译运行:
procedure TFormMain.FormCreate(Sender: TObject); begin AdvStringGrid1.ColCount := 3; AdvStringGrid1.RowCount := 2; AdvStringGrid1.Cells[0, 0] := '控件名'; AdvStringGrid1.Cells[1, 0] := '典型用途'; AdvStringGrid1.Cells[2, 0] := '备注'; AdvStringGrid1.Cells[0, 1] := 'TAdvStringGrid'; AdvStringGrid1.Cells[1, 1] := '数据表格'; AdvStringGrid1.Cells[2, 1] := 'TMS VCL UI Pack'; end;Cells[Col, Row]的索引从 0 开始,第 0 行默认是固定表头,所以RowCount := 2时实际上有表头加一行数据。这段代码能编译并运行,说明设计期包已经注册、运行期包链接正常、DCP/DCU 也都在 IDE 的搜索路径中。如果拖拽控件时就报TAdvStringGrid not found,则回查 2.2 节的 Library Path,而不是怀疑安装步骤。
4. 实战:TAdvStringGrid 接 SQLite 数据并处理中文乱码
4.1 用 FireDAC 连接 SQLite,把数据集填充到 TAdvStringGrid
VCL 表格控件最常见的落地场景就是本地文件型数据库,SQLite 和 TAdvStringGrid 的组合在 Delphi 12.3 里是开箱即用的。先放一个 TFDConnection、一个 TFDQuery 和一个 TAdvStringGrid 到 Form 上,然后写填充逻辑:
FDConnection1.DriverName := 'SQLite'; FDConnection1.Params.Values['Database'] := 'D:\data\orders.db'; FDConnection1.Params.Values['OpenMode'] := 'ReadWrite'; FDConnection1.Connected := True; FDQuery1.Connection := FDConnection1; FDQuery1.SQL.Text := 'SELECT id, name, remark FROM orders ORDER BY id'; FDQuery1.Open; AdvStringGrid1.RowCount := FDQuery1.RecordCount + 1; AdvStringGrid1.ColCount := 3; AdvStringGrid1.Cells[0, 0] := 'ID'; AdvStringGrid1.Cells[1, 0] := '名称'; AdvStringGrid1.Cells[2, 0] := '备注'; var r: Integer := 1; while not FDQuery1.Eof do begin AdvStringGrid1.Cells[0, r] := FDQuery1.FieldByName('id').AsString; AdvStringGrid1.Cells[1, r] := FDQuery1.FieldByName('name').AsString; AdvStringGrid1.Cells[2, r] := FDQuery1.FieldByName('remark').AsString; Inc(r); FDQuery1.Next; end;RowCount := RecordCount + 1是先把表格行数一次分配到位,随后在 while 循环里用固定行索引直接写Cells,这比逐行 AppendRow 再赋值的写法少了很多内部数组重分配开销。var r: Integer := 1是 Delphi 10.3 引入的内联变量,12.3 完全支持,Community Edition 同样可用。这里的AsString是兜底转换,遇到NULL字段会得到空字符串而不是异常。
如果查询的表里有 SQL 保留字,例如字段名就叫desc或order,SQL 里要用反引号或方括号包裹,这是 FireDAC 解析 SQLite 语句时的常见坑。
4.2 列宽、行高与 Options 参数设置
数据填进去之后,界面层参数直接决定使用体验。下面这组是我在项目里常用的一组基础配置:
AdvStringGrid1.Options := AdvStringGrid1.Options - [goRowSelect] + [goColMoving]; AdvStringGrid1.FixedRows := 1; AdvStringGrid1.RowHeight := 22; AdvStringGrid1.Columns[0].Width := 60; AdvStringGrid1.Columns[1].Width := 180; AdvStringGrid1.Columns[2].Width := 320; AdvStringGrid1.ColumnSize.Stretch := True;goRowSelect是一个容易忽视的选项:它开启时点击单元格会整行选中,且单元格无法进入编辑态。如果你需要用户双击某格修改内容,必须把该选项从 Options 集合中移除。goColMoving则允许运行时按住列头拖动调整列序。ColumnSize.Stretch := True表示列宽总和不足网格宽度时自动拉伸列宽铺满,但它和AutoSize属性有冲突,两者同时开启会导致列宽反复计算后出现跳动,实际项目中二选一即可。
RowHeight := 22是针对默认字体大小设置的,调整 Form 的字体缩放比例时要同步调整它,否则高分屏下会出现文字被截断的观感问题。
4.3 Delphi SQLite 中文乱码的三个排查点
中文乱码是 SQLite 方案里最常检索的问题,Delphi 里表现各异,排查方向也不一样。
| 现象 | 优先检查项 | 处理办法 |
|---|---|---|
| 中文全部显示为问号 | SQLite 文件本身的编码 | 建库后执行PRAGMA encoding = 'UTF-8';,再CREATE TABLE |
| 字符串常量乱码但数据库浏览器正常 | 项目源文件编码 | 把 .pas/.dpr 另存为 UTF-8 with BOM,确认编译器按 UTF-8 读取 |
| 仅 TAdvStringGrid 内乱码,其他控件正常 | Font.Charset 被改动 | 把网格 Font.Charset 设回 DEFAULT_CHARSET |
第一种情况发生在库文件由其他程序创建时的编码不是 UTF-8。FireDAC 的 SQLite 驱动默认按 UTF-8 读写,但若库文件是 GBK 写入的,读取出来就会变问号。第二种情况在团队协作项目里很常见:某人的 IDE 开着 ANSI 保存,提交后其他人的 12.3 按 UTF-8 解析,字符串常量就乱了。第三种情况最隐蔽,TMS 的部分主题会隐式修改字体字符集,重新设置Font.Charset := DEFAULT_CHARSET即可。
排查乱码时我一般先开 SQLite 官方的命令行工具查看原始内容,这样能快速定位乱码发生在数据层还是界面层,省去两头猜测的时间。
5. 安装后的自查清单与绿色部署技巧:注册表验证与配置复用
5.1 用 reg query 检查 BDS 23.0 的 Known IDE Packages
Design 包安装后 IDE 会在用户注册表里登记包信息。RAD Studio 12.x 对应的 BDS 版本键是 23.0,在命令行里执行:
reg query "HKCU\Software\Embarcadero\BDS\23.0\Known IDE Packages" /s /f TMS如果输出里能看到完整的 bpl 路径,例如D:\Components\TMS\Packages\...\dclTMSVCLUIPack...bpl,说明 IDE 已经登记该包。这条命令的价值在于:Tool Palette 不显示控件时能立刻区分是注册表丢失还是 IDE 缓存问题。如果你在系统里装过多个版本的 TMS 包,/s参数会把所有含 TMS 的键值列出来,方便辨认哪个版本占用了注册项。
工具窗口和控件面板都找不到时,先用这条命令排除注册表因素,再去检查 groupproj 的搜索路径和 PATH 环境变量,顺序反了容易被无效操作误导。
5.2 把 TAdvStringGrid 常用配置收进一个初始化函数
每次新建窗体都重设一遍列宽和 Options 很容易出现配置漂移,我一般会把基础配置收进一个公共单元里的过程:
procedure ConfigureAdvGrid(Grid: TAdvStringGrid); begin Grid.FixedRows := 1; Grid.RowHeight := 22; Grid.Options := Grid.Options - [goRowSelect] + [goColMoving]; Grid.ColumnSize.Stretch := True; Grid.ColWidths[0] := 60; end;调用时一行即可:ConfigureAdvGrid(AdvStringGrid1);。把列宽策略集中管理后,遇到需要全局调整间距的场景只改一处。这个过程本身也是验证 TMS 安装是否完好的一种方式,编译期如果有单元缺失,公共单元会最先报警。
5.3 免安装绿色部署:把 rar 目录整体拷贝到新机器后重编译
把整个 TMS 目录连同最初的 rar 包结构一起复制到新机器,然后在新机器的 Delphi 12.3 中重新打开 Packages 下的组包执行一次 Build,比直接拷贝已编译好的 bpl 可靠得多。直接拷贝 bpl 的主要问题有三个:dproj 里记录的搜索路径是绝对路径,换机器必然失效;许可证机器绑定会让 IDE 启动时报授权错误;DCU/BPL 针对当前编译器的目标平台生成,换了编译器版本或 Win32/Win64 目标就全部白费。
实际操作时以最初的 rar 内目录结构为基准做文件同步,保留Packages和Source两层,不要图省事把文件摊平到一个目录。后续升级版本时,把新 rar 解压到同路径,重新跑一遍第 2 章的配置和第 3 章的编译顺序,就能在不动系统其它组件的状态下完成切换。这种部署方式配合版本控制工具记录目录变更,比在 IDE 里反复重装要直观得多。
本文还有配套的精品资源,点击获取