尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

TMS FNC WX Pack v1.7.3.2 Delphi跨平台控件安装实战

TMS FNC WX Pack v1.7.3.2 Delphi跨平台控件安装实战 简介在Delphi开发领域跨平台控件一直是提升项目效率的关键。TMS FNC WX Pack基于框架中立组件(FNC)架构通过抽象层解耦控件绘制与平台API调用让VCL和FireMonkey项目共享同一套业务逻辑真正实现一次编写、处处编译。该控件包覆盖地图、天气、条形码生成/识别、社交登录、响应式网格等高频功能场景可显著降低多平台适配成本。以v1.7.3.2版本为例从XE7到RAD Studio 13.1 Florence环境系统梳理了全源码安装流程、IDE控件丢失排查、地图与扫码控件的实践要点并总结了常见问题与避坑经验助力开发者快速上手并规避升级中的典型陷阱。1. 这个包到底是什么——先说清楚FNC架构的本质如果你的开发环境已经跟着 Embarcadero 的节奏升到了 RAD Studio 13.1 Florence或者你还在 XE7 的老项目里挣扎那么 TMS FNC WX Pack 这个包十有八九在你的采购清单上出现过。这个标题乍看很长拆开其实就三件事Delphi 13.1Florence时代的控件安装包、TMS 家的 FNC 架构、以及 v1.7.3.2 这个具体版本的全源码发布。先说结论TMS FNC WX Pack 是 TMS 公司基于 FNCFramework Neutral Components框架中立组件架构开发的一套跨平台 Web 服务与移动端功能控件集合。它覆盖了地图、天气、社交登录、条形码生成/识别、响应式网格、极光推送JPush、OneDrive/Google Drive 云存储对接等一大批现代应用开发中高频出现的功能场景。你不需要再为 VCL 和 FireMonkey 各买一套控件也不需要为 Windows、macOS、Android、iOS 分别写一套调用逻辑——FNC 的核心理念就是“一次编写处处编译”。1.1 FNC 统一跨平台架构的工作原理FNC 这套架构的核心是把控件绘制和平台 API 调用彻底解耦。传统 Delphi 控件分成两条线VCL 控件只能在 Windows 上用FireMonkey 控件可以跨平台但和 VCL 不互通。你一旦在 VCL 项目里用了某个第三方控件将来想迁移到 FireMonkey基本上等于重写界面。而 FNC 控件在底层通过一个中间抽象层来访问各平台的原生能力上层 UI 逻辑全部用 Delphi 代码统一描述——它不依赖 VCL 的窗口句柄也不依赖 FireMonkey 的场景图对象而是自己维护一套轻量级的视图渲染机制。这意味着同一个 TTMSFNCWXGoogleMaps 控件放在 VCL 窗体上能显示地图放在 FireMonkey 窗体上也能显示地图同一个 TTMSFNCWXWeather 控件在 Windows 桌面程序里调用天气预报接口和在 Android 手机上调用代码几乎一模一样。对我这种常年同时维护 VCL 老项目和 FireMonkey 新项目的人来说这个价值是实打实的——不用再为两套 UI 框架分别写一遍同样的业务逻辑。1.2 WX Pack 在整个 TMS 产品线里的定位TMS 公司的控件产品线很庞杂FNC 系列里其实有好几个 PackFNC UI Pack 是基础界面控件FNC Dashboard Pack 是图表仪表盘FNC WX Pack 则专门负责“和外部世界打交道”的那部分。WX 是 Web eXchange 的缩写它解决的问题是你的应用要连 Google Maps、要查天气、要扫条形码、要用微信/支付宝登录、要传文件到云盘——这些能力如果全从零开始写几个月都搞不完而且每个平台的实现方式还不一样。WX Pack 把这些能力封装成了统一的 Delphi 控件你只需要设置 API Key、调用方法、处理事件回调。v1.7.3.2 这个版本号意味着它已经迭代了很久早期的坑基本都被填平了这也是我推荐生产环境使用的一个重要理由——用老版本踩坑的成本远高于升级控件的成本。2. 安装与版本兼容实战从 XE7 到 13.1 Florence 的完整流程拿到“Delphi 13.1控件之TMS FNC WX Pack v1.7.3.2 or Delphi XE7-13 Florence Full Source.rar”这个压缩包很多人第一反应是直接双击安装然后就被一堆 IDE 版本报错劝退。这个包的全源码特性决定了它不能像普通商业控件那样靠 Setup 程序一键装完——你需要手动编译对应版本的运行时包再把设计时包安装到 IDE 里。2.1 版本识别与安装包选择你下载下来的压缩包里通常会包含多个子目录命名规则一般是CBCBuilder和DDelphi开头后面跟着版本号。比如D27对应 RAD Studio 13.1Delphi 27D26对应 RAD Studio 12 AthensD25对应 RAD Studio 11 AlexandriaD10对应 XE7。这个命名不熟悉的人很容易搞错——我见过有人把D27当成 Delphi 2007 的安装包因为 2007 是 Delphi 11数字对不上就以为有问题实际上 TMS 用的是 RTTI 版本号而不是市场版本号。在动手之前先确认两件事第一你的 RAD Studio 已经打上了最新的 Update 补丁第二你的 IDE 里没有同时装着一个旧版本的 TMS FNC WX Pack。第二点特别重要——如果你从 v1.6 升级到 v1.7.3.2必须先完整卸载旧版本包括删除残留的.bpl文件否则 IDE 启动时会出现找不到类或重复注册类的错误。2.2 真源码安装逐步骤操作指南全源码包的正确安装方式不是双击某个 exe而是走 IDE 的包安装流程。我以 RAD Studio 13.1 Florence 为例完整走一遍第一步把压缩包解压到一个不含空格的目录比如D:\Components\TMSFNCWXPack。如果你解压到C:\Program Files\这种带空格的路径后面编译时可能会遇到找不到文件的奇怪问题尤其在使用 MSBuild 命令行编译时。第二步打开 RAD Studio 13.1点击File Open Reopen或直接File Open Project进入解压目录下的Packages子目录。你会看到针对不同平台的核心运行时包命名类似FNCWXPkg_D27.bplVCL 版本和FNCWXPkg_D27_FMX.bplFireMonkey 版本还有设计时包FNCWXPkg_D27_Design.bpl。第三步先编译运行时包。右键点击项目管理器里的FNCWXPkg_D27.bpl选择Build。编译过程一般需要一两分钟取决于你的机器性能。编译成功后Delphi 会自动把.bpl文件输出到 IDE 的默认库路径下通常是C:\Users\Public\Documents\Embarcadero\Studio\13.0\Bpl。这里有个细节——如果你的 Delphi 安装时自定义了库路径编译输出位置也会跟着变建议编译完成后在Project Options Delphi Compiler Output里确认一下输出目录。第四步编译 FireMonkey 版本的运行时包。方法和第三步一样选FNCWXPkg_D27_FMX.bpl再 Build 一次。同理还要编译 CBuilder 版本如果你用 CB以及各平台的运行时包。第五步安装设计时包。打开Component Install Packages点击Add找到编译好的FNCWXPkg_D27_Design.bpl选中后确认。此时 IDE 会弹出提示“Package installed successfully”你的控件面板里就会出现 TMS FNC WX 相关的多个分类页面。第六步设置 Delphi 的 Library 路径。打开Tools Options Delphi Options Library把源码目录下的Source子目录添加到 Library Path 里否则新建项目引用单元时会提示找不到TMS.FNC.WX.Pack相关单元。这是新手最容易踩的坑——包安装成功了但新建项目编译不过报一堆找不到单元的错就是因为 Library Path 没配。2.3 IDE 控件丢失问题的根源与对策热词里有一条非常典型“Delphi 控件版本问题导致每次进入 IDE 都丢失控件需要重新放置保存后还是那样”。这个问题几乎每天都有开发者遇到它和控件本身的关系不大根源通常是设计时包没有被正确安装或运行时包版本不一致。我在实际项目里遇到过一个具体案例某个老项目用 Delphi XE7 开发里面用了 TMS 的旧版控件后来因为要接新需求我把 TMS FNC WX Pack 升级到了 v1.7.3.2结果打开老窗体时所有 FNC 控件全部丢失——窗体上只剩一堆白色的占位框提示“Class TTMSFNCWXGoogleMaps not found”。排查过程是这样的先检查设计时包是否安装确认没问题再检查运行时包是否在当前 IDE 版本下有编译产物也没问题。最后用 Process Monitor 跟踪了一下 IDE 启动时的 BPL 加载路径发现旧版的TMSFNCWXPack_D26.bpl还残留在系统目录里和新的 v1.7.3.2 版本冲突了。把旧文件全部删掉重新启动 IDE控件恢复正常。所以关于 IDE 控件丢失我总结出三条经验第一升级前务必完整卸载旧版包括手动清理 BPL 和 DCU 文件第二如果同一个项目有人用 XE7 有人用 13.1源码里不能混用不同版本设计的窗体否则打开必丢控件第三安装完新版本后第一次打开旧项目时如果提示找不到类别急着重新放置控件先检查包的注册状态。3. 核心控件实操拆解地图、天气、条码、响应式网格WX Pack 里的控件数量不少但真正高频使用的是下面这几类。我按照实际项目中的使用频率和复杂度逐个拆解配置要点和踩坑经验。3.1 地图类控件TTMSFNCWXGoogleMaps 与 OpenStreetMap地图是 WX Pack 里最重头的功能支持 Google Maps、OpenStreetMap、MapQuest 等服务商。控件的核心机制是一个浏览器视图——注意它并不是原生地图 SDK而是在 App 内嵌了基于 WebView 的地图渲染引擎。这个设计的好处是跨平台一致性极强写一次代码在 Windows、macOS、iOS、Android 上呈现出来的地图交互体验基本一致坏处是首次加载地图时需要网络请求离线场景下不可用。Google Maps 的接入需要你先在 Google Cloud Console 申请 API Key。需要注意在 Android 上测试时模拟器的 API Key 和真机的 API Key 要分开配置因为 Google 会校验请求来源的数字签名SHA-1 指纹。我经常看到开发者把模拟器上能跑的 Key 直接打包进生产环境结果上线后 Android 用户全部打不开地图。FireMonkey 的 Android 调试签名和发布签名的指纹是不一样的所以至少要配两个 Key 环境。OpenStreetMap 不需要 API Key适合内网或开发环境快速测试。它使用的是标准瓦片地图服务你可以自定义瓦片 URL 模板。我在一个物流项目中用 OSM 做过车辆轨迹回放因为不需要申请 Key部署非常简单。控件提供了一组非常实用的方法CenterAt定位中心点、AddMarker添加标记、SetZoom设置缩放级别。标记可以绑定任意对象数据点击标记时触发OnMarkerClicked事件回调。我做 PDA 巡检应用时用这个方法实现了扫码后自动定位到设备所在位置并弹出设备信息卡片开发效率很高。提示地图控件在 Android 上使用 GPS 定位时需要在项目配置里声明定位权限。FireMonkey 的 Android 工程默认不会自动加上 ACCESS_FINE_LOCATION需要在 Project Options 的 Permissions 页面手动勾选否则运行时会直接闪退或者静默失败。3.2 响应式网格TTMSFNCWXResponsiveGrid这个控件我之前没有太在意直到接了一个“Pad 端和手机端共用一套界面”的需求才体会到它的价值。TTMSFNCWXResponsiveGrid 本质上是一个流式布局容器可以根据容器的宽度自动调整子控件的排列方式——宽屏时显示多列窄屏时堆叠成单列。它就像 CSS 里的 Flexbox 和 Grid 的混合体但完全用 Delphi 属性面板配置不需要写任何布局代码。实际使用中最关键的参数是BreakPoints集合。比如你在设计器里添加三个断点宽度小于 480 像素时单列布局、480 到 768 像素时双列、超过 768 像素时三列。这样一套代码在手机、平板、桌面上都能获得合理的信息密度。另一个重要属性是ItemLayout它控制网格子项对齐方式有 Top、Middle、Bottom 等选项多列高度不一致时这个属性能让视觉更整齐。我踩过的坑是这个控件对父容器的高度有要求——如果你把它直接放到 FireMonkey 的 TLayout 上而 TLayout 的高度没有设置网格内容会被截断。解决办法是在设计时给父容器设置一个明确的 Height或者用 TScrollBox 包裹。3.3 工具类控件条码、天气、社交登录条形码相关的两个控件 TTMSFNCWXBarcode 和 TTMSFNCWXBCScanner 是我的“心头好”。前者能生成几十种一维码和二维码格式——QR Code、Code128、EAN13 等后者负责调起摄像头扫码识别成功后会返回原始字符串。在 PDA 仓储项目里我用 TTMSFNCWXBarcode 在界面上动态生成物料二维码标签替代了传统的 TPrinter 打印方案代码量少而且对屏幕适配更好。扫码这块TTMSFNCWXBCScanner 在 Android 上会自动调起相机预览识别速度实测比 ZXing 的原生库稍慢一点但胜在跨平台代码统一、省去原生桥接的麻烦。天气控件 TTMSFNCWXWeather 支持 OpenWeatherMap 和 WeatherAPI 等数据源绑定城市 ID 或经纬度后能返回当前温度、湿度、风向、未来几天预报等结构化数据。我做过一个户外巡检系统在界面上放了一个天气控件提醒巡检人员当天是否适合户外作业。接入过程就是填 API Key、设置城市代码、调用GetWeather方法然后处理OnWeatherReceived事件。社交登录这块TTMSFNCWXSocialLogin 支持 Google、Facebook、微信、支付宝等第三方授权。它的实现原理是调起系统浏览器或内嵌 WebView 完成 OAuth 流程授权成功后返回 Access Token你再拿 Token 去请求用户信息。微信登录有一点需要特别注意微信开放平台要求你的应用包名和签名必须和注册时一致否则授权页会直接报错。4. 与常用开发场景的联合实战——结合热词里的高频需求只看控件功能介绍可能还感受不到它到底能帮你省多少事。我结合 Delphi 社区里搜索热度最高的几个实际开发场景演示一下 FNC WX Pack 是如何和日常编码需求配合的。4.1 FireMonkey PDA 扫码结果接收与界面联动热词里有一条“delphi firemonkey pda 编程实现扫码结果接受”这个需求在仓储、物流、医护行业极其常见。用 FNC WX Pack 的实现方式比传统方案简单得多在 FireMonkey 窗体上放一个 TTMSFNCWXBCScanner 控件设置Active : True后摄像头就会启动预览扫码成功后触发OnScan事件事件参数里带着扫码得到的字符串。这里有两个细节值得注意。第一OnScan回调里不要做耗时操作比如直接去查数据库。正确做法是把扫码内容先存到一个变量里通过 TThread.Queue 或 TTimer 延迟执行后续逻辑否则卡顿会直接影响连续扫码的效率。第二PDA 的摄像头扫码环境差异很大——光线不足时识别率明显下降我建议在界面上放一个手电筒开关通过 TMS FNC WX Pack 底层调用的相机 API 控制闪光灯实测能把扫码成功率从八成提到九成五以上。扫码结果的后续处理往往涉及查询数据库热词里另一个高热度问题是“Delphi select 查询”也就是 TDataSet 和查询结果的展示。我会把扫码结果作为参数传给一个 TFDQuery 或 TADOQuery查询出物料信息后在 TTMSFNCWXResponsiveGrid 里动态生成卡片展示。这个组合在平板上看起来像原生 App 一样流畅而且代码量很少。4.2 字符串处理、MD5 计算与 API 签名场景社区里关于“delphi 字符串函数”“delphi 10.4 md5计算”“delphi 10.4计算字符串md5”的搜索量非常高这背后的真实需求往往是对接外部 API 时需要生成签名串。FNC WX Pack 虽然不直接提供 MD5 工具这是 Delphi 标准库的活但在对接 WX Pack 里的社交登录、云盘等接口时你几乎都要计算签名。RAD Studio 的System.Hash单元提供了现成的 THashMD5几行代码就能计算字符串的 MD5uses System.Hash; function GetMD5Hex(const AInput: string): string; begin Result : THashMD5.GetHashString(AInput); end;不要自己写 MD5 算法——我见过有老项目里放了一大段网上抄的 MD5 实现速度慢且容易出错。用官方库的性能和正确性都有保障。还有一个经典场景是把 TStringList 的内容拼成指定格式的字符串再去签名这个过程经常涉及字符串替换、分隔符处理用TStringList.DelimitedText和QuotedStr可以少写很多循环代码。4.3 JSON 解析与 WX 控件的数据流WX Pack 的每个服务型控件在拿到远程数据后都会通过结构化的对象模型暴露给你。比如 TTMSFNCWXWeather 的当前天气对象是TTMSFNCWXWeatherCurrent里面有 Temperature、Humidity、WindSpeed 等属性。但在更复杂的场景中你需要直接解析 JSON 数据——比如混合对接某个不常见的 API。此时推荐System.JSON单元里的 TJSONObject 和 TJSONArray。我在一个项目中需要同时对接 WX 包的地图服务和公司自研的后端接口后端返回的坐标数据是 JSON 数组。解析代码大致是这样uses System.JSON; procedure ParseLocations(const AJson: string); var LJsonArr: TJSONArray; LItem: TJSONObject; LLat: Double; LLng: Double; I: Integer; begin LJsonArr : TJSONObject.ParseJSONValue(AJson) as TJSONArray; try for I : 0 to LJsonArr.Count - 1 do begin LItem : LJsonArr.Items[I] as TJSONObject; LLat : LItem.GetValueDouble(lat); LLng : LItem.GetValueDouble(lng); // 把坐标添加到地图上 end; finally LJsonArr.Free; end; end;这里要注意 TJSONValue 的释放问题——ParseJSONValue返回的对象必须手动 Free否则会造成内存泄漏。另外GetValueT这个泛型方法在值缺失时会抛出异常稳妥的做法是先调用TryGetValueT判断是否存在。多年 Delphi 开发里内存泄漏和异常崩溃最容易发生在 JSON 解析上细节真不能省。5. 安装与使用中常见问题与排查技巧实录所有控件在使用一段时间后都会遇到各种问题FNC WX Pack 也不例外。我把这些年遇到过的高频问题整理成一份速查表每一条都是实际项目中踩过的坑。5.1 高频问题速查表问题现象可能原因解决方案IDE 启动提示“找不到包文件 xxx.bpl”BPL 文件不在系统搜索路径或文件被杀毒软件误删重新编译包并把输出目录加入系统 PATH窗体上 FNC 控件显示为白色方框或提示类不存在设计时包未安装或旧版本包残留检查 Component Install Packages卸载旧包并清理 BPL/DCUGoogle 地图不显示只有灰色背景API Key 未配置或域名/包名校验失败检查 API Key 限制设置Android 需配置 SHA-1 指纹Android 上扫码控件打开黑屏CAMERA 权限未声明Project Options Permissions 中勾选 CAMERA编译时提示找不到 Source 下的单元Library Path 未设置Tools Options Library添加源码目录运行时崩溃报“Invalid pointer operation”JSON 对象未释放或控件回调里访问了已释放对象检查 Free 时机回调中用 TThread.Queue 包一层高 DPI 屏幕上控件文字模糊FireMonkey 高 DPI 设置未开启在工程选项中勾选 High DPI 支持选项5.2 独家避坑细节第一升级 WX Pack 版本时不要只重新编译已安装的包。我遇到过一次 v1.7.2 升 v1.7.3.2 后程序运行正常但 IDE 设计器里所有控件属性变成空白的情况。最后发现问题出在旧版编译的 .dcu 文件散落在项目目录里IDE 优先引用了它们。彻底清理方法在全盘搜索TMS.FNC.WX相关的 .dcu 和 .bpl确认没有旧版本残留后再编译新包。第二FireMonkey 项目在地图控件上叠加自定义图层时要注意控件的刷新时机。我在地图上叠加巡检轨迹线时发现轨迹线画完后地图切图会把它覆盖掉。后来查到解决方案是在OnMapIdle事件里重新绘制叠加层——这个事件在地图加载完一个视野范围内的所有瓦片后触发是叠加自定义内容的正确时机。第三在 Windows 下开发调试 Android 功能时地图服务和扫码服务的代码逻辑是一致的但 WebView 的版本差异会导致显示效果不同。Android 上 WebView 由系统提供碎片化严重某些国产 Rom 的 WebView 内核较老地图显示可能异常。如果你的应用面向大量国产 Android 设备建议在真机上多测几款不同品牌的手机。5.3 下载与版权注意“Full Source”版本意味着你可以拿到控件全部源代码这在调试时价值巨大——比如怀疑某个 API 参数传递有问题可以直接单步跟踪控件源码。但源码头版本通常意味着你买了更高的授权级别生产环境商用前务必确认授权范围不要因为“下载到源码”就认为可以无限分发。TMS 产品的授权一般按开发人员数量计算每人一个授权这是行业惯例尊重版权才能让优秀的第三方控件生态持续发展。6. 从 Delphi 7 到 13.1控件选型和项目迁移的一点经验热词里出现了“delphi 7”“delphi xe2 update 4”“delphi 7 下载”这些和旧版本相关的字眼。很多老 Delphi 开发者手里的系统是十多年前用 Delphi 7 写的现在面临迁移到新平台或者要增加移动端能力。TMS FNC WX Pack 只支持 XE7 及以后的版本标题里也写了“or Delphi XE7-13”所以如果你还在用 Delphi 7第一件事不是想着怎么给 Delphi 7 装新控件而是先把项目迁到 XE7 或更新的版本。从 Delphi 7 迁到 XE7 的实际工作量主要在三个方面Unit 命名空间的变化比如 Windows 单元拆分成 Winapi.Windows 等、字符串类型默认由 AnsiString 变为 UnicodeString、以及 VCL 内部一些 API 签名的调整。这些改动是机械性的但量大我建议先解决编译错误再逐步处理运行时的兼容问题。迁移完成后再引入 FNC WX Pack 来新增移动端界面和 Web 服务功能这样既保住了老业务又能跟上新的终端形态。如果项目还在使用 Delphi 10.4 或 11升级到 13.1 Florence 前建议先在虚拟机里全新安装并测试现有工程的编译情况。RAD Studio 的版本升级跨度太大时第三方控件的兼容性往往是最容易出问题的环节——TMS 系列做得相对好但也不能保证所有老版本控件都能平滑迁移。稳妥的做法是先备份再升级最后用一个小模块做验证。7. 一些个人实战感受用了几年 TMS FNC WX Pack 之后最大的感受是这套控件把跨平台开发的“脏活累活”挡在了门外。地图、扫码、社交登录这些在传统 Delphi 开发里属于“需要原生工程师配合”的功能现在一个控件就能搞定而且一套代码覆盖所有平台。对于小团队和个人开发者来说这是实实在在的生产力解放。但也要诚实地说FNC 架构的抽象层并非零成本。在低端 Android 设备上地图的滚动流畅度不如原生 SDK 实现的版本扫码识别的速度比专门的 ZXing 原生库要慢半拍WebView 的加载耗时也难以消除。如果你正在做的产品对这几项性能指标极其敏感可能需要谨慎评估。但大多数业务系统场景——比如企业管理软件、仓储物流、巡检运维——WX Pack 的综合表现是够用的省下来的开发时间远比那点性能损耗值钱。如果你的正式项目准备上这套组件我的建议是先花一个周末把 v1.7.3.2 在目标 IDE 版本上完整编译安装一遍用示例代码跑通地图和扫码两个核心功能建立一个最小可验证的工程环境。这样后面真刀真枪开发的时候你面对的全是业务问题而不是环境问题。本文还有配套的精品资源点击获取
返回列表