简介:TMS Component Pack v8.3.4.0 XE10.2 是一套面向 Delphi 开发者的商业级控件集合,适配 XE10.2 Tokyo,覆盖用户界面、图表、网格、报表、数据库访问等日常开发模块,特别适合需要快速搭建 Windows 或跨平台应用的桌面端工程师。资源包含约 2000 个文件,主体为 1673 个 pas 源码与 1039 个 dcu 编译单元,另有 dfm 窗体设计文件、res/bmp/ico 等界面资源、dproj/dpk 工程与组件包文件,以及 compilexe10.bat 等多版本编译脚本,压缩包整体 103.4MB,目录组织清晰。借助这些脚本与源码,开发者既能深入了解 TAdvGrid、TMS Charts、TMS FlexGrid 等控件的实现细节,也能按需裁剪或扩展功能,并在多个 Delphi 版本之间快速重编译。压缩包还附带了丰富的示例工程和英语、德语、法语、西班牙语等多语言词库文件,便于验证控件效果或直接用于多语言应用开发。目前已有 1202 人学习下载,对希望提升 Delphi 开发效率的中高级工程师有较好的参考价值。
1. 老项目升级 Delphi 10.2 Tokyo:为什么绕不开 TMS Component Pack v8.3.4.0
接手一个还跑在 Delphi XE 时代的遗留系统,第一件事往往是打开安装包目录,数一数里面压着多少个第三方组件。TMS Component Pack v8.3.4.0 这个名字,几乎是每个做 Delphi Win32 桌面开发的工程师都见过、也纠结过的存在:一套侵入式极强的控件全家桶,绑定在 XE10.2 Tokyo 上,装不好、参不透,后续所有窗体改造都寸步难行。它解决的核心问题很明确:在原生 VCL 组件基础之上,把表格、图表、编辑框、工具栏、计划表这些高频业务组件做到“开箱即用”,让开发团队不用为每个界面元素手工实现交互细节。这篇文章要讲的就是这套组件包到底是什么、在 XE10.2 下怎么装、怎么用,以及五个最容易让新手翻车的坑。
如果你正准备接手老项目、把 Delphi 7 或 XE 的老代码往 10.2 迁移,又或者只是想在现有界面上补一批高级控件,这篇文章能帮你省下至少两天的试错时间。适合正在用 Delphi 10.2 Tokyo 做维护和二次开发的工程师,也适合刚被分配去升级遗留系统的初级开发者。下面从组件包的构成讲起,再一步步落到安装、调用和边界判断。
2. TMS Component Pack v8.3.4.0 家族图谱:先搞清楚你装的是哪一包
2.1 这是“全家桶”不是单控件:一个安装包里到底装了哪几类组件
第一次拿到 v8.3.4.0 的安装文件时,很多人会以为这是个类似单文件控件的小工具,装上才发现是覆盖了十几个命名空间的大型组件集。它不是一个控件,而是一组在 VCL 框架下深度定制的控件库,主要分成几大类别:表格与网格类、图表与可视化类、编辑与输入类、工具栏与导航类、计划与日历类,以及一批辅助工具组件。表格类的代表是 TAdvStringGrid,它比原生 TStringGrid 扩展了合并单元格、树形展示、数据排序、单元格自定义绘制这些能力;图表类最常见的是 TAdvChartView,用来做统计曲线的绘制和实时数据展示;编辑类的 TAdvEdit、TAdvMemo 补上了原生编辑控件的输入校验、水印和行号显示等实用功能。
v8.3.4.0 这个版本号里的 v8,对应的是组件包的主版本号,而后面的一串数字是修正版本,最后的 XE10.2 表示它编译绑定的目标 IDE 版本。需要注意,Delphi 从 XE 系列之后版本号体系有过变化,10.2 Tokyo 内部对应版本号是 22.0,所以你在安装时看到的包名、BPL 文件名,可能都是以 22 这个数字来标识的。这些细节虽然不影响安装操作,但会影响你在 IDE 的 Component 菜单里定位包,以及排查问题时搜索资料的关键词。
2.2 组件分组速查:哪些类解决哪类界面问题
为了快速上手,我把 v8.3.4.0 里最常用的几组控件做了个归类,按业务场景来看比按文件路径看要直观得多。下面这张表可以帮助你在做界面选型时快速定位,不至于在工具面板里翻半天找不到。
| 组件类别 | 典型控件名 | 主要解决的问题 | 常见使用场景 |
|---|---|---|---|
| 网格与表格 | TAdvStringGrid | 数据展示、编辑、合并单元格、树形层级 | 订单列表、物料清单、后台管理主列表 |
| 图表与曲线 | TAdvChartView | 多维曲线、柱状图、面积图、缩放联动 | 生产报表、设备监控曲线、数据分析页面 |
| 编辑与输入 | TAdvEdit / TAdvMemo | 输入格式校验、水印、行号、高亮显示 | 参数录入窗、日志查看窗、工单备注 |
| 工具栏与菜单 | TAdvToolBar / TAdvMenu | 现代风格工具栏、按钮分组、右键菜单扩展 | 主窗口顶部操作区、导航菜单 |
| 计划与日历 | TPlanner / TAdvCalendar | 时间轴排程、日历视图、拖拽调整 | 排班表、会议室预订、项目计划视图 |
这里需要说明的是,每个大类下面还有若干细分控件,比如表格类还有 TAdvStringGrid 的“DB 版”TAdvDBGrid,用于直接绑定数据集。实际开发中,大多数人真正高频使用的也就是上表里每类的一到两个核心控件,剩下的大部分时间都在跟编辑器交互和事件处理打交道。所以不必被安装后那一长串组件面板吓到,先把上面这些常用的认熟,后面再逐步扩展。
2.3 为什么在 XE10.2 上版本匹配这么敏感
TMS 控件的安装包和 Delphi IDE 版本是强绑定的,这一点和很多纯源码组件不一样。v8.3.4.0 编译出来的 .bpl 运行期包,链接的是 XE10.2 对应的 RTL/VCL 版本,如果强行拿到 Delphi 10.3 或 10.4 里装,多半会报“package 版本不匹配”或“无法定位程序输入点”一类错误。反过来,如果你有一套别的版本编译的 TMS 组件,拿到 10.2 里用也不行。所以拿到安装包时,第一件事就要先确认它的目标 IDE 版本,而不是看主版本号 v8 就以为通用。我遇到过同事拿着 v8.2 的包在 10.2 上硬装,结果 IDE 启动直接报出一串 DLL 加载异常,最后只能卸载重装。
另外要留意一个词:这是“Component Pack”,也就是 TMS 的一个产品大家族。除它之外 TMS 还有 Business Pack、Scripter Pack 等不同定位的产品包,v8.3.4.0 特指 Component Pack 这个产品线。搜索资料或问题时,关键词尽量带上“Component Pack v8.3.4.0 Delphi 10.2”,否则很容易搜到 TMS 旗下其他产品的文章,参考价值会打折扣。
3. 在 XE10.2 上安装 v8.3.4.0:从下载到 IDE 认得出的完整步骤
3.1 安装前先做的三件事
安装第三方控件包最怕的不是安装慢,而是装完不知道有没有成功。我习惯在动手前先做三个准备动作。第一,确认 Delphi 10.2 Tokyo 已安装完整,至少包含 VCL 组件和 Windows 32 位编译支持;第二,关闭正在运行的 Delphi IDE,防止 BPL 文件被 IDE 进程锁定导致覆盖失败;第三,检查系统环境变量 Path 里是否有权限写入的目录问题,因为安装程序通常会尝试把 BPL 文件复制到 IDE 的 bin 目录或者系统公共目录下。
如果你是在公司统一管理环境里操作,还需要确认安装包是从正规渠道获取的,不要图省事用来路不明的压缩包。TMS 安装包内部自带注册表写入流程,安装时一般会要求管理员权限。用普通权限安装,可能界面提示安装成功,但 IDE 里根本找不到组件,因为注册表 HKCU 和 HKLM 的写入差异导致 IDE 无法枚举到包。
3.2 从安装程序到 IDE 认出的完整流程
整套安装流程本质上就是“运行安装程序,选 IDE 版本,等待编译安装”。不同版本的安装程序界面略有差异,但核心逻辑一致。下面是我在 XE10.2 上安装 v8.3.4.0 的常见操作过程,按顺序写出来方便照做。
# 1. 以管理员身份运行安装程序 # 注意:安装程序自动检测系统里已安装的 Delphi 版本 Install_TMS_Component_Pack_v8.3.4.0.exe # 2. 选择 IDE 版本 # 检测到多版本时,只勾选 "Delphi 10.2 Tokyo (22.0)" # 3. 选择安装路径 # 默认 C:\Program Files (x86)\TMS\Component Pack 即可 # 如果公司有统一盘符规范,也可以改成 D:\Dev\TMS安装程序会自动判断已知的 Delphi 版本列表,勾选后进入安装。安装过程的后半段,程序会自动调用 Delphi 的命令行编译器来编译和注册包,这个过程需要几分钟,视机器性能而定,期间不要强制中断。如果看到类似“Compiling dclTMSGridPack”这样的日志,说明正在编译设计期包,这一步是正常流程,不是卡死。安装完成后,启动 Delphi 10.2,正常情况下会在 Component 菜单里看到新增的 TMS 包列表,工具栏面板里也会多出 TMS 相关的组件页签。
验证是否安装成功,我一般不看安装日志,而是直接新建一个 VCL Forms 工程,在组件面板里找 TAdvStringGrid。能找到、能拖到窗体上、能编译运行,才算真正安装成功。如果找不到但 Component 菜单里能看到包,多半是设计期包没注册成功,问题会出现在下一步的排查里。
3.3 安装后的最小验证工程
为了确保组件包真正可编译可运行,我通常会在验证工程里放一个 TAdvStringGrid 和一个 TAdvEdit,然后做一次最简单的赋值和编译。这一步其实比看任何安装报告都靠谱,下面给出一段最小的验证代码。
procedure TFormMain.FormCreate(Sender: TObject); begin // 给 AdvStringGrid 设置两列三行的基础数据 AdvStringGrid1.ColCount := 2; AdvStringGrid1.RowCount := 3; AdvStringGrid1.Cells[0, 0] := '设备编号'; AdvStringGrid1.Cells[1, 0] := '运行状态'; AdvStringGrid1.Cells[0, 1] := 'DEV-001'; AdvStringGrid1.Cells[1, 1] := '在线'; AdvStringGrid1.Cells[0, 2] := 'DEV-002'; AdvStringGrid1.Cells[1, 2] := '离线'; // 测试 TAdvEdit 的输入框水印功能 AdvEdit1.LabelCaption := '设备编号'; AdvEdit1.WaterMark := '请输入编号'; end;这段代码在 v8.3.4.0 里编译运行不会有任何问题,只要你能看到窗体上出现了两行两列的数据和带水印的输入框,就说明安装链路完整。注意这里我用了 AdvStringGrid1.Cells 这个属性,它和原生 TStringGrid 的 Cells 用法一致,这么写是为了让从原生控件迁过来的同事降低心理门槛。真正的区别在于后面章节要讲的合并单元格、树形展示这些扩展能力。
3.4 安装目录里的库文件都是干什么的
安装完成后,你会在安装目录里看到几十个文件,其中大量是 .dcu、.bpl、.dcp、.dproj 文件。这里简单说一下常见后缀的含义。.bpl 是 Delphi 的包文件,分成运行期包(名称前缀通常是 vcl 或 tms)和设计期包(名称前缀通常是 dcl)。运行期包在你发布 EXE 时可能需要一并分发,设计期包只在 IDE 里用。.dcu 是编译后的单元文件,供 IDE 在编译工程时直接引用,不需要源码。.dcp 则是包的导入描述文件,IDE 链接器通过这些文件确认包的导出符号。
如果你做的是绿色部署,把整个 TMS 安装目录复制到另一台机器上往往是不行的,因为还有注册表项记录包路径和 IDE 关联。多台开发机部署时,正规做法是在每台机器上重新跑一遍安装程序,不要图省事拷贝文件夹。这点我在后面避坑章节还会细说,因为很多人栽在它上面。
4. 核心组件实战:表格、图表与工具栏的落地代码
4.1 TAdvStringGrid:合并单元格、树形展示和排序的正确用法
TAdvStringGrid 是 Component Pack 里被用得最多的控件,没有之一。它比原生网格强在三个点上:合并单元格、树形行、排序回调。合并单元格的做法是设置 MergeCells 相关的属性和调用 MergeCells 方法;树形行通过设置 TreeView 相关属性来实现;排序则靠 SortSettings 来控制。下面这段代码演示了最常见的合并和排序设置。
procedure TFormMain.btnPrepareGridClick(Sender: TObject); begin // 先把网格置为固定行+数据行模式 AdvStringGrid1.FixedRows := 1; AdvStringGrid1.FixedCols := 0; // 让第一列按内容自动合并 AdvStringGrid1.MergeCells.Fixed := True; AdvStringGrid1.MergeCells.Col := 0; // 开启点击列标题排序 AdvStringGrid1.SortSettings.Enabled := True; AdvStringGrid1.SortSettings.Column := 1; // 填充示例数据:三行归属于同一个 "车间A" AdvStringGrid1.Cells[0, 1] := '车间A'; AdvStringGrid1.Cells[1, 1] := '产线1'; AdvStringGrid1.Cells[0, 2] := '车间A'; AdvStringGrid1.Cells[1, 2] := '产线2'; AdvStringGrid1.Cells[0, 3] := '车间A'; AdvStringGrid1.Cells[1, 3] := '产线3'; // 执行合并 AdvStringGrid1.MergeCells.MergeAll; end;这段代码的核心逻辑是先把固定行设为 1 行标题行,然后为第 0 列开启固定合并,接着开启按列排序,最后调用 MergeAll 做整表合并。注意 MergeCells.Fixed 属性控制的是固定列区域的合并,如果不设置这个属性,数据区域的合并还要额外配置 Merging 的方向。排序设置为 Enabled 后,用户点击列标题就会自动触发排序,TAdvStringGrid 默认对字符串使用字典序排序,对数字需要额外设置 SortingType,否则会出现“10 排在 2 前面”这种让人摸不着头脑的结果。动手时建议把三个单元格的“车间A”换成同一个中文变量,验证合并效果会直观很多。
4.2 TAdvChartView:动态曲线绘制中的两分钟门槛
图表控件里我用得最多的场景是实时监测设备的温度曲线。TAdvChartView 的编程模型和 TChart 不太一样,它不靠 Series 数组,而是靠 Channel 和 Series 的层级关系来组织数据。新手最容易踩的坑是把 TChart 的使用习惯搬过来,结果找不到 AddXY 方法。正确的常用做法是先拿到某个 Channel,再往这个 Channel 里加 Series,最后向 Series 提交数据点。代码示例如下。
procedure TFormMain.btnStartChartClick(Sender: TObject); var ch: TAdvChartViewChannel; sr: TAdvChartViewSeries; I: Integer; begin // 清空默认频道,按需重建 AdvChartView1.Channels.Clear; ch := AdvChartView1.Channels.Add; ch.Description := '温度监控'; // 添加一条折线 Series sr := ch.Series.Add; sr.SeriesType := stLine; sr.Description := '水冷温度'; // 模拟追加 24 个数据点 for I := 0 to 23 do begin sr.AddPoint(I, 28 + Sin(I * 0.3) * 4); end; // 让 X 轴自适应范围 AdvChartView1.Axes.XAxis.Automatic := True; AdvChartView1.Axes.YAxis.Automatic := True; end;这段代码的关键在于明确 Channel 和 Series 的包含关系:一个 Channel 相当于一条坐标轴体系,一个 Series 是一条具体曲线。很多人找不到“如何添加第三条曲线”的入口,其实就是在一个 Channel 下再 Add 一个 Series。AddPoint 的前两个参数分别是 X 和 Y 坐标值,底层按浮点保存。如果要做时间轴显示,不要在 X 轴上塞时间字符串,而应该用 DateTime 值或序列号,再配合 Axis 的 LabelFormat 设置显示格式。Automatic 属性是自动缩放轴的范围,实时监测场景建议先保留 Auto,等数据稳定后再手动固死范围,否则曲线会来回跳动。
4.3 TAdvEdit 与 TAdvMemo:表单校验和日志展示的实用配置
输入类控件里,TAdvEdit 最有用的功能其实是内置校验和快捷键处理。比如限制输入内容为数字,只需要设置 EditType 为 etNumeric,配合 Precision 控制小数位,这样键盘根本敲不进去非数字字符,省去一整套 OnKeyPress 校验代码。另一个实用功能是 LabelCaption,它能把标签直接显示在输入框左侧,省一个 TLabel 控件的位置,对于空间紧张的窗体非常友好。
TAdvMemo 则是日志界面的最佳选择之一,它支持行号显示、按关键字高亮、以及只读状态下的多行文本处理。下面这段代码是在日志查看场景里常用的配置方式,同时演示了如何追加一行带时间戳的日志。
procedure TFormMain.AppendLog(const ALine: string); begin // 显示行号,方便对照问题时间点 AdvMemo1.LineNumbers.Visible := True; // 只读模式,避免用户误改日志内容 AdvMemo1.ReadOnly := True; // 按行追加时间戳 AdvMemo1.Lines.Add(FormatDateTime('[hh:nn:ss] ', Now) + ALine); // 滚动到最新一行 AdvMemo1.ScrollBy(0, AdvMemo1.Lines.Count * AdvMemo1.LineHeight); end;这段代码里的 ScrollBy 计算方式是一个经验值,不同字体大小下滚动距离不一定精确到行,但在大多数场景下足够让最新日志滚动到可见区域。如果需要精确滚动到末尾,可以改成把 SelStart 和 SelLength 定位到最后一行。ReadOnly 属性设置为 True 之后,用户依然可以选中文本复制,但不能修改,这正好是日志窗口的标准体验。这里要提醒一下,不要在主线程高频调用这种 Log 方法,TAdvMemo 的 Lines.Add 在主线程里每秒钟几十次没问题,但超过百次就会出现界面卡顿,重日志场景建议先攒批再刷新。
4.4 一套主题风格统一整个界面的偷懒技巧
TMS Component Pack 在 v8 后续版本里引入了统一主题设置,某些版本支持通过全局 Theme 属性或调用 TMS.THEME 相关的单元来管理控件配色。在 XE10.2 环境里,常用做法是通过 TAdvToolBar 和几大列表控件的颜色属性来做统一风格。这里我必须说清楚:v8.3.4.0 这个具体版本上的主题支持并不像 v9/v10 那么完善,很多全局主题 API 是后续版本才稳定的,所以老版本上不要强求全组件统一变色,否则会出现网格是深色的、按钮是浅色的尴尬状态。
更稳的一招是只对”大面积控件”做统一设置,比如表格、图表、备忘录,这三个的面积占到界面 70% 以上,把它们设置成同色系,整体观感就会统一。用法很简单,直接设置 Color、Font.Color 和 FixedColor 这几个基础属性,不需要调用复杂 API。真正讲究的主题切换,建议至少升级到组件包更高版本后再考虑,旧版本把精力放在功能实现上更划算。
5. 避坑指南:TMS v8.3.4.0 与 XE10.2 的五个高频翻车现场
5.1 现象:安装后 IDE 启动闪退或报“无法加载包”
这是安装类问题里最常见的。安装包显示成功,但下次启动 Delphi 10.2 时弹出类似“Package xxx can not be loaded”的错误,或者整个进程直接退出。原因多半有两个:一个是安装包目标平台选错,另一个是系统里残留了旧版本 TMS 包。尤其是 XE10.2 和更早的 XE 并存时,安装程序可能把设计期包注册到了旧版本 IDE 的路径下,导致新版本 IDE 启动时按注册表找到文件却加载失败。
解决这类问题,我一般按三步走。先到 Control Panel 里卸载 TMS Component Pack,重启机器,再用管理员权限重新执行安装,只勾选 10.2。如果还不行,检查 IDE 的 Component Install Packages 列表里是否有失效条目,手动移除。最后一步是清理旧 .bpl 文件,特别是 Windows 目录和 IDE bin 目录下残留的备份。这些操作顺序不要反过来,因为如果注册表里残留的是旧版本的路径信息,光删文件不处理注册表,IDE 照样会按旧路径去搜索。
5.2 现象:组件面板里找不到 TMS 页签,但 Component 菜单里包是勾选状态
很多人的第一反应是重新安装,其实这个是设计期包注册不完整的问题。运行期包被加载了,设计期包没有注册成功,面板就会空白。最容易导致这个现象的操作是安装时把安装目录选到了非默认位置,同时系统权限不足以让设计期包写入 IDE 的注册位置。
解决方法是手动去 Component > Install Packages 里检查是否有 dcl 开头的 TMS 包,如果有但面板不显示,就点 Remove 再重新 Add,手动选中安装目录里对应的 .bpl 文件,比如 dclTMSGridPack.bpl。添加后 IDE 会提示是否安装,重启 IDE 查看面板。注意:查找 .bpl 时不要误选运行期包,运行期包是加不进设计期列表的,界面会直接报错提示包不包含设计期组件。
5.3 现象:升级老工程时出现“Extended type not supported”或标识符找不到
这个坑更多出现在项目层面。老项目里有旧的 TMS 控件,升级到 v8.3.4.0 时,新增了一批单元名,也调整了一些属性的命名空间。比如有些旧代码写的 AdvStringGrid1.MergeCells 直接赋值,在新的包结构里需要先给 MergeCells 属性下的子属性赋值。报错时,IDE 会提示找不到某个类型或标识符,这时不要急着翻源码,先看错误信息指向的单元名。
我处理这类问题的一般套路是:记下错误提示的标识符,用 IDE 的 Ctrl+Click 跳转到定义,如果跳不过去再按单元名搜索。v8.3.4.0 中大量组件集中到以 TMS 开头的几个大单元里,比如 TMSStringGrid 相关的 TMSGridData 等。如果代码里还用了旧版本的引用单元名,需要同步替换成 v8 对应的新单元名。这属于迁移时的体力活,没有捷径。
5.4 现象:Win64 编译报错,提示“Unable to find .dcu”
XE10.2 默认支持同时编译 Win32 和 Win64 目标,但 TMS v8.3.4.0 在安装时,很多默认安装选项只安装了 Win32 版本的 .dcu,没有包含 Win64 目标文件。于是项目切到 64 位编译时,链接器找不到对应的 .dcu,报出一堆“Unable to find”错误。还有一种情况是安装程序装了 Win64 文件,但 IDE 的 Library 路径里没有加入 Win64 对应的 search path。
解决方法是打开 IDE 的 Tools > Options > Delphi Options > Library,先确认当前选中的平台是 Win64,再检查库路径里是否包含 TMS 安装目录下的 Win64 子目录。如果没有就手动加上,路径类似“C:\Program Files (x86)\TMS\Component Pack\Win64”。加完路径后关闭 IDE 重开,再做一次 64 位编译。如果你只需要发布 32 位程序,可以跳过这段,但建议还是把 Win64 路径配好,因为后续一旦有人切换目标平台,这个坑会再次出现。
5.5 现象:和其他第三方控件包同时使用时弹窗频繁或编译顺序错乱
TMS 和 DevExpress、EhLib 这类组件包同时存在时,可能出现问题是包加载顺序导致 IDE 工具栏页面混乱或者工程编译时单元名冲突。比如某个公共单元名在两个包里都存在,Linker 选择哪一个取决于工程搜索路径的顺序。这类问题的排查思路比较简单:先看编译警告里有没有“duplicate unit”字样,然后调整工程 Library Path 里各三方包的搜索顺序。
我要特别提示一组容易冲突的对象:TAdvStringGrid 的排序相关属性和某些别的网格控件同名属性,在代码迁移时容易张冠李戴。如果窗体上同时放了不同包的两个网格控件,DropDown 列表里同名属性很容易选错,代码里体现为编译不报错但运行行为诡异。所以遇到运行时行为异常且无明显异常报错时,不要急着怀疑 TMS bug,先检查窗体上的控件到底是哪个包的,再检查属性设置是否有串。
6. 老项目里值得用和不该用的取舍:一个工程师的用法边界
到了最后,我想说一点自己习惯的取舍逻辑,不讲空话。TMS Component Pack v8.3.4.0 在 XE10.2 上,值不值得大规模铺设,取决于你的项目形态。如果是长期维护的遗留系统,且界面交互复杂、网格和图表用量大,那它确实能带来明显的开发效率提升,尤其像合并单元格和树形网格这类功能,自己用原生控件实现至少需要几百行代码。反过来,如果你的项目只是简单信息录入、界面以基础控件为主,那引入这套组件包反而增加了部署体积和升级负担,不划算。
我个人的用法边界有这么几条。第一,只在客户端数据处理相关的窗体重度使用 TMS 网格和图表,普通列表页尽量用原生控件;第二,不依赖 TMS 的全局主题机制做界面换肤,旧版本的实现不够稳,换肤需求交给外部皮肤组件或自绘逻辑;第三,所有 TMS 相关控件封装在自己的公共单元里,业务代码不直接散落引用控件属性,方便将来控件包升级时统一适配;第四,定期清理不用的包和注册项,避免一个机器上积累过多版本导致 IDE 变慢。
在 XP 或老旧 Windows Server 环境部署时,需要额外确认目标机器是否能加载 v8.3.4.0 编译出的运行库,因为某些版本依赖更高版本的运行库。这个项目我见过有人因为没带上必要的运行时 DLL,结果现场环境全部弹框。所以发布前用虚拟机做一次干净环境部署测试,是成本最低的后悔药。希望这些经验能帮你在 XE10.2 和 TMS v8.3.4.0 这套组合上少走弯路,感谢你的阅读。
本文还有配套的精品资源,点击获取