ARTICLE DETAIL

资讯详情

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

TMS VCL UI Pack 在 Delphi 13.1 的安装与表格控件实战

TMS VCL UI Pack 在 Delphi 13.1 的安装与表格控件实战 简介这是一套面向 Delphi 开发者的 TMS VCL UI Pack 13.5.9.0 控件资源包专为 Delphi 13.1 环境优化适合需要快速搭建专业 Windows/Linux 桌面应用界面的中高级程序员。组件库涵盖按钮、面板、树形列表、工具栏、数据网格、图表等常用控件并支持主题、皮肤和丰富的自定义属性开发者可借其实现风格统一的现代化 UI大幅减少界面层重复编码。包内共有 2000 个文件以 pas 源文件、dfm 表单、dproj/dpr 工程文件为主还包含大量 res/ico/png 图标资源、pdf/rtf/htm 说明文档以及演示项目既可用于直接集成也方便对照源码学习控件定制技巧压缩包整体约 104.63 MB。目前已有 39 人学习/下载。这套组件包还带有向导与编辑器可辅助完成复杂布局和设计时配置对提升 Delphi 项目界面开发效率很有帮助也适合希望深入理解 VCL 控件机制的开发者作为参考。1. 拿到 TMS VCL UI Pack 13.5.9.0 的 7z 包后先别急着双击解压手上有 Delphi 13.1 环境又同时拿到 TMS VCL UI Pack 13.5.9.0.7z 这个压缩包的人多半不是来尝鲜的要么手上的 VCL 项目正缺能排序、能合并单元格的表格要么在评估要不要在团队里正式引入一套成熟的 VCL 控件库。TMS VCL UI Pack 是 VCL 生态里覆盖很广的商用控件包表格、编辑器、工具栏、面板、计划表一应俱全而 .7z 后缀意味着第一步不是双击压缩包而是先正确解压再按 IDE 版本把设计期包注册进去。这篇笔记按我实际装过、用过的顺序讲从解压、注册进 Delphi 13.1、挑几个高频控件下手到常见报错排查最后是团队里复用的一套基础配置。适合刚接触 Delphi 的开发者也适合回去翻旧项目的维护者。2. 解压与目录规划7z 格式、路径规则、IDE 位宽先把环境钉死2.1 为什么压缩包是 7z 而不是 zip格式与工具TMS 的发行包用 7z 压缩最直接的原因是压缩率比 zip 高一个塞了几十个 Demo、全套源码和三套平台包的目录能省出不少体积。但代价是 Windows 资源管理器自带的压缩支持对这个格式无效你双击它只会看到无法打开文件。这不是压缩包损坏是工具不对。常见做法是装 7-Zip 或 WinRAR然后用右键菜单解压。我习惯用 7-Zip 的命令行方便在批处理里反复验证同一个路径规则也方便写进团队文档。解压命令长这样7z x D:\Downloads\TMS_VCL_UI_Pack_13.5.9.0.7z -oD:\Dev\Components\TMSPack -y参数说明x表示解压并保留原目录结构-o后面直接跟目标路径中间不要留空格这是 7-Zip 命令行最容易踩的细节-y是全部确认避免解压中停下来问你是否覆盖。如果压缩包带了密码作者会在发布说明里写解压时命令行会提示输入普通渠道拿到的包通常不需要密码。解压完成后先看一眼输出目录如果里面还有一层同名文件夹说明我的-o路径给深了一层。这种嵌套最容易在 IDE 配 Library path 时把路径搞乱后面File not found: AdvGrid.dcu的坑有一半是从这里开始的。2.2 解压到哪个目录路径规则和我的习惯路径规划这件事看着不起眼实际影响后面所有环节。Delphi 的 Library path 会把目录里的.dcu编进索引路径一旦带中文、带空格、带特殊符号轻则在 IDE 里显示乱码重则编译时File not found或Internal error。我踩过一次把控件装进D:\常用工具\TMS 控件包的翻车现场后来统一成一条规则只允许英文字母、数字、下划线路径里不出现空格。我自己常用的一级目录是D:\Dev\Components\TMSPack后面带版本号子目录区分构建。原因很实际Delphi 的大版本之间.bpl不互通同一台机器上可能同时装着 10.4、11、12 的项目控件更新会互相覆盖。用版本号分目录切 IDE 版本时不用重装只改 Library path。路径规划还有一个隐藏好处幻兽帕鲁式的装坏了大不了重来。控件包安装过程本质是往 IDE 注册几个.bpl目录放独立了卸载就是移除引用、删掉整个文件夹干净利落。2.3 解压后先核对版本包目录结构与 IDE 位宽解压完成后先别急着进 IDE花两分钟核对结构。常见的 TMS 包目录一般会分成Packages、Source、Demo这几类命名在不同构建里略有差异但用途基本一致。我见过太多次装完发现没有注册表残留、但 IDE 就是识别不了的求助查到最后都是把Runtime包当Design包装了。所以先记住这张文件类型表文件类型扩展名在安装中的用途设计期包.bpl注册进 IDE拖控件到窗体就靠它运行时包.bpl程序运行时动态加载的库这里存的是实现包声明文件.dcp告诉编译器这个包里有哪些单元编译产物.dcu编译时直接引用的二进制单元源码.pas查实现、调试断点、看属性定义演示工程.dproj/.dpr验证安装是否成功的第一手材料另一个必须核对的是位宽。Delphi 13.1 的 IDE 本身是 32 位进程但它可以编译出 Win32 和 Win64 两种目标设计期包必须装成 IDE 进程能加载的那一份也就是 Win32 变体。包里如果同时给了Win32和Win64两个目录设计期用Win32发布时按你目标平台选。把 Win64 的设计期包强行加载进 32 位 IDE基本就是第 5 章里Access Violation的直接原因。3. 把包注册进 Delphi 13.1设计期 .bpl 安装与 library path 两条主线3.1 先分清两种包设计期 .bpl 与运行时 .bplTMS 的包安装核心是搞懂两种.bpl的区别。设计期包Design Time Package只在开发环境里发挥作用负责在 IDE 的组件面板上注册控件、生成 DFM 属性编辑器运行时包Runtime Package是交付时跟着 exe 走的那部分如果工程勾选了 Use runtime packages目标机器上就得有对应的.bpl。这里的血泪经验是许多人拿到压缩包后直奔.bpl就 Add 进 IDE结果列表里出现的是运行时包组件面板上什么也没多出来。区分方法很简单文件名里通常带着Design、D后缀或在包描述里写着 design time only。直接把.bpl全装一遍不是不行但会让 IDE 加载一堆用不上的包启动变慢、偶发冲突我从不这么干。3.2 手工安装设计期包的具体步骤在 Delphi 13.1 里打开 IDE 主菜单Component Install Packages点击右侧Add按钮定位到解压目录下Packages里面对应当前 IDE 版本号的子目录选择那个设计期.bpl文件确认回到上一级界面后列表里会出现对应描述。我一般会顺手把下方的Runtime packages里涉及 TMS 的项也确认一下但第一次安装时不改动它保持默认。然后回到窗体上在组件面板里找一个叫 TMS 或 TMS VCL UI Pack 的分页拖一个TAdvStringGrid到新建窗体上。能拖动、能改属性、FormCreate里能写代码引用说明设计期包已经生效。这里有个容易被忽略的操作Add 完.bpl后如果 IDE 提示 The following packages were found but could not be loaded先别急着找别的原因大概率是你把当前平台或者 IDE 更新号选错了。常见做法是回到包目录确认选的那个构建编号与 IDE 的Help About里显示的版本更新号一致然后换一个变体重试。3.3 用 msbuild 验证一个最小工程能否吃到 TMS 单元设计期包装上只是第一步真正跑通业务代码还需要编译期能找到单元。验证最快的方式不是新建一个空工程而是直接打开包目录里的某个 Demo按当前 IDE 版本编译一次。但在我维护的团队里更常用的是命令行验证因为可以写进自动构建也方便在换机器时快速自检。我一般会这样跑一个最小项目的构建确认 TMS 单元能被编译器找到、链接器能解析msbuild TMSDemo.dproj /t:Build /p:ConfigurationRelease /p:PlatformWin32参数说明/t:Build指定 MSBuild 执行构建目标/p:ConfigurationRelease和/p:PlatformWin32分别覆盖发布配置和 32 位目标平台。如果命令提示找不到msbuild说明你不在 RAD Studio 的命令行环境里需要从开始菜单打开RAD Studio Command Prompt它已经帮你把编译器路径写进了环境变量。看到Build succeeded之后我还会顺手检查输出目录里生成的 exe 旁边有没有带上 TMS 相关的.bpl。如果没带而工程又开着 runtime packages那就要回头看第 5 章的运行时缺失问题。这一步能提前发现一半的交付事故。4. 选对上手的控件用 TAdvStringGrid 把进销存列表做厚4.1 为什么先拿 TAdvStringGrid 试手以及它和原生 TStringGrid 的差距TMS VCL UI Pack 里有一百多个控件新手最容易挑花眼。我的建议是从TAdvStringGrid开始原因是它覆盖了桌面开发里最高频的痛点复杂表格。原生TStringGrid在简单列表场景够用但一旦涉及表头多行、单元格合并、按列排序、类型化编辑、合计行变色写起来就很痛苦代码里全是OnDrawCell和OnMouseUp的拼凑。TAdvStringGrid继承了原生网格的绝大部分行为所以在迁移现有代码时阻力小而它在列的合并、对齐、排序设置上提供了更靠上的封装。以下对比只挑实际项目里被问得最多的几项能力原生 TStringGridTAdvStringGrid固定行、固定列支持支持且在属性面板里更直观列宽拖拽、行高调整支持支持按列排序需要自己实现属性面板里可开启单元格合并需要自绘按行列设置即可单元格类型下拉、数字、日期等几乎只能自绘按列设置类型编辑器整体视觉默认偏旧与 VCL 主题配合更好不是说原生控件一无是处而是当表头有三层、首列是序号、末行还得有合计的时候原生方案的代码量会很快失控。这也是很多人装了 TMS 之后第一件事就是替换旧表格的原因。4.2 搭一张带合计行的进销存表最小代码下面这段代码是我在项目里反复用到的骨架新建一个窗体放一个TAdvStringGrid在OnCreate里做初始化和数据填充。它刻意只用了继承自 VCL 基础网格的属性保证在不同构建的 TMS 版本里都能编译过。uses AdvGrid; procedure TfrmMain.FormCreate(Sender: TObject); begin AdvStringGrid1.ColCount : 5; AdvStringGrid1.RowCount : 10; AdvStringGrid1.FixedCols : 1; AdvStringGrid1.FixedRows : 2; AdvStringGrid1.Cells[1, 0] : 商品名称; AdvStringGrid1.Cells[2, 0] : 入库数量; AdvStringGrid1.Cells[3, 0] : 出库数量; AdvStringGrid1.Cells[4, 0] : 结余; AdvStringGrid1.Cells[1, 9] : 合计; AdvStringGrid1.Options : AdvStringGrid1.Options [goColSizing, goRowSizing, goEditing, goAlwaysShowEditor]; end; procedure TfrmMain.AdvStringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState); begin if ARow 9 then begin AdvStringGrid1.Canvas.Brush.Color : $00FFE0C0; AdvStringGrid1.Canvas.Font.Style : [fsBold]; AdvStringGrid1.Canvas.FillRect(ARect); AdvStringGrid1.Canvas.TextOut(ARect.Left 2, ARect.Top 2, AdvStringGrid1.Cells[ACol, ARow]); end; end;逻辑说明构造函数里先把行列数钉死FixedRows : 2表示前两行固定不滚动这里用来放双层表头FixedCols : 1固定第一列通常是序号列。最后四行操作汇总行加粗、换底色OnDrawCell里判断到第 9 行就用自己的画笔重绘。这段代码不依赖 TMS 特有的新接口换成TStringGrid也能编译方便你在接入 TMS 之前先对比感受差异。4.3 三个顺手就该调的参数行列固定、编辑模式、列宽拖拽第一个参数是FixedRows和FixedCols。不是所有表头都要两行但如果你的列表有分组表头FixedRows : 2能省掉大量自绘代码。第二个是Options。goEditing一开用户就能双击单元格改内容这时配合goAlwaysShowEditor会把编辑态常驻适合做数据录入界面如果只是展示这两个选项都不要加。第三个是列宽。goColSizing打开后用户能拖列宽但拖完的宽度不会自动记住下次启动又回到默认值。我一般会在FormClose里把列宽写进注册表或 INI启动时再读回来。另外要提醒goEditing开启后如果没有给单元格设置合适的输入类型用户填进去的任意字符串都可能破坏后续统计运算。常见做法是给数据列单独设置数字类型或者在OnGetCellText里做格式化兜底别把数据校验全押在数据库层。5. 安装与编译避坑5 个我见过最多人卡住的报错现场5.1 双击 7z 提示无法打开解压工具与目标目录现象从网盘或官方渠道拿到TMS_VCL_UI_Pack_13.5.9.0.7z双击后 Windows 弹窗说无法打开甚至有人怀疑文件下载损坏。原因.7z用的是 LZMA 压缩算法Windows 自带解压只支持 zip 和自解压 exe对这个格式无能为力文件本身大概率没坏。解决装 7-Zip右键选择解压到指定目录或按第 2 章的命令行方式解压。解压时目标路径不要包含空格和中文这一步直接影响后面的 Library path 配置。如果命令行解压时提示Unsupported Method才是真压缩包损坏重新下载并核对校验值。5.2 装完设计期包IDE 报 Access Violation现象在Component Install Packages里 Add 了.bpl点确定后 IDE 直接报Access Violation或者重启后 IDE 打不开只能禁用包再进。原因九成是把运行平台搞错了。设计期.bpl必须匹配 IDE 的进程架构把 Win64 变体注册进 32 位 IDE 进程加载即崩另一小半原因是 IDE 更新号与包构建号不匹配新包装进旧更新号的 IDE。解决卸载冲突包回到包目录重新选择与当前 IDE 版本对应的子目录。区分办法是看文件名或目录名里的版本提示一般Packages下会按 IDE 更新号分目录。装好后先只注册一个包验证能拖控件了再注册其它扩展包降低排查面。5.3 File not found: AdvGrid.dcuLibrary path 没接上现象代码里写了uses AdvGrid按 F9 编译时报File not found: AdvGrid.dcu但设计期包明明已经出现在 Install Packages 列表里。原因设计期包注册解决的是 IDE 里拖控件的问题编译期找.dcu走的是另一条路——库路径。.dcu文件没被 IDE 索引时代码再正确也编不过。解决打开Tools Options Language Delphi Library把Library path追加 TMS 的Source目录和对应的Lib目录分 Win32 和 Win64 各加一遍。注意别把Source和Lib混成一个路径两个目录的作用不一样前者放.pas后者放预先编译好的.dcu。改完路径后重启 IDE再编译一次这个报错基本消失。5.4 开发机跑得好换台机器缺 bpl现象开发机上编译运行一切正常把Release的 exe 拷到客户电脑或同事机器上双击要么弹缺少 TMSXXX.bpl要么直接闪退没有提示。原因工程开启了Build with runtime packagesexe 没有把 TMS 的实现代码链进自身运行时才去找对应的.bpl。目标机器上没装这套运行库自然起不来。解决打开Project Options Runtime Packages取消Link with runtime packages或里面的勾选重新编译。这样 TMS 代码会静态链进 exe交付物变成一个单文件加必要资源。副作用是 exe 体积变大但换来的是部署省心。现在我在团队里的默认约定就是正式交付一律静态连编开发调试再考虑运行时包。5.5 高 DPI 发虚与杀软误报两个容易被忽略的收尾动作现象高分辨率屏幕上TMS 控件字体发虚、面板边缘对不齐另一台机器上杀毒软件直接把解压出来的.bpl隔离。原因前者是进制在 DPI 感知上不一致Windows 对没有声明 DPI 感知的程序做了位图拉伸字体自然糊后者是杀软对不常见签名的安装包常见误报尤其当压缩包里带大量源码和 DLL 时更容易触发。解决在项目管理器里检查 DPI Awareness 是否为PerMonitorV2Delphi 13.1 下这是默认推荐值让每个窗体按实际显示器缩放杀软误报则把解压目录加入白名单并从官方渠道重新解压一次用哈希工具核对与发布说明一致后再使用。不要为了方便临时退出杀软那不是解决问题的态度。6. 进阶把 TMS 骨架化并把每次安装装没装漏变成可验证的事6.1 把 TMS 骨架化一个初始化函数覆盖常用控件当项目里十几个窗体都在用TAdvStringGrid时逐个窗体设置字体和颜色会越改越乱。我习惯在公共单元里放一个统一入口程序启动时遍历一次窗体上的控件把所有 TMS 相关控件的基础样式一次性对齐procedure ApplyTMSStyle(AForm: TForm); var I: Integer; begin for I : 0 to AForm.ComponentCount - 1 do begin if AForm.Components[I] is TAdvStringGrid then begin TAdvStringGrid(AForm.Components[I]).Font.Name : Microsoft YaHei UI; TAdvStringGrid(AForm.Components[I]).Font.Size : 9; end; end; end;逻辑说明这个函数只处理当前窗体的直属控件实际项目中建议改成递归遍历TWinControl的后代并把字体名抽成全局变量这样换主题时只改一处。统一的字体配置是团队代码审查里最不容易吵起来的公约数。6.2 交付前的三连验证我最后养成了一个习惯交付前不做我觉得没问题而是跑一套固定自检。第一新建一个空窗体只放一个 TMS 控件编译并运行确认 IDE 的包加载正常第二用第 3 章的msbuild命令行把工程全量构建一遍排除 IDE 缓存造成的假成功第三到输出目录看 exe 旁边是否还残留 TMS 相关的.bpl有残留就说明 runtime packages 还开着按第 5.4 条改掉。这套流程源自一次交付现场的教训客户机器上界面都起来了一操作表格就报缺失 DLL当时查了半宿才发现是运行时包没有带走。从那以后我的默认动作就是静态连编并在交付单上写清构建平台和 IDE 更新号。版本升级也一样换 IDE 大版本时重新走一遍解压、注册、验证三连比直接复制旧配置可靠得多。希望这些经验帮你在 TMS VCL UI Pack 上少走几趟弯路真正把这套控件变成项目里的生产力而不是堆在组件面板上的摆设。本文还有配套的精品资源点击获取
返回列表