Delphi 12.3 安装 DevExpressFMX 20.1.2:FMX 跨平台控件实战指南
简介Delphi 12.3的FMX跨平台项目要获得成熟专业的数据表格、布局与数据处理控件这份DevExpress FMX 20.1.2.7z能够直接满足需求面向需要使用DevExpress控件体系进行Windows、macOS、iOS、Android端界面开发的Delphi开发者。压缩包共619个文件整体约115.89MB以229个dcu编译单元、46个pas源码、32个dpk包定义及38个xml配置为主同时包含12个fmx界面文件与14个so动态库便于在Delphi 12.3中完成组件安装、编译集成或二次定制。目前已有75人学习资源提供者可借助dxGrid、dxMemData、dxLayoutControl等核心组件快速搭建数据界面省去从零编写高性能控件的成本并可通过附带的res、dproj等文件了解工程组织方式。1. Delphi 12.3 控件之 DevExpressFMX 20.1.2先搞清楚它解决的是什么问题Delphi 12.3 装 DevExpressFMX 20.1.2说白了就是给 FireMonkey 界面套上一套能跨平台的成熟控件。用过 FMX 原生控件的都有体会默认那几样东西做原型可以做交付给人看的界面表格、侧栏、弹出层、皮肤样样都得自己磨一份工做下来大半时间耗在“把控件调得像样”上。DevExpress 的 VCL 版在 Windows 上积累了大量成熟的交互组件FMX 版把同一套东西搬到了跨平台框架里。这个 7z 包解决的就是用 Delphi 12.3 同时交付 Windows、Android、iOS 应用时想直接拖一套专业控件、统一界面风格又不想在原生控件上花几周做二次封装。适合已经有 VCL 经验、想跨到 FMX 的 Delphi 开发者也适合刚接手 FMX 项目、被原生控件简陋程度困扰的人。整个安装过程一个下午能搞定但中间确实有不少坑这篇文章把安装路径、参数设置和踩坑记录一次说清楚。2. 把 20.1.2 的 7z 变成 IDE 里可拖拽的控件解压、路径注册与包编译2.1 解压前先做两件事确认 BDS 版本号与目录规划拿到DevExpressFMX-20.1.2.7z之后第一反应别是双击解压到 Embarcadero 的安装目录下。常见做法是先把它放到一个独立的第三方库目录里比如D:\DevLib\DevExpressFMX-20.1.2。这样做的理由是Delphi 升级、重装、换电脑时组件目录可以保留IDE 里的库路径只需要重指一遍如果直接解压到C:\Program Files (x86)\Embarcadero\Studio\...下面一旦重装系统这套控件就跟着没了重新配置的成本比省下的这点时间高得多。解压之前先确认 Delphi 12.3 对应的 BDS 版本号。12.3 属于 RAD Studio 12 Athens 系列内部目录一般是Studio\23.0具体以你机器上安装路径为准。安装前可以用 7-Zip 的命令行先看一眼包内的结构确认是否存在 Source、Demo 目录以及 dpk 文件的分布方式7z l DevExpressFMX-20.1.2.7z | findstr /i source dpk这条命令列出压缩包内的所有路径findstr只过滤含source或dpk的行用于快速判断包内是完整源码包还是只有编译好的 bpl。正常来说20.1.2 的包会带源码目录和若干工程文件具体目录命名以解压结果为准。看到 dpk 后面带FMX后缀的就是 FMX 平台的运行时包带dcl前缀的是设计时包稍后安装到 IDE 里要用的就是后者。目录规划上我一般会在包内保留官方原有的层级然后把编译产物统一输出到一个独立子目录例如D:\DevLib\DevExpressFMX-20.1.2\Library\Win64。这样后续在 IDE 里配置 Library Path 时只需要指向一个明确的输出目录查找 dcu 和 bpl 都不会乱。2.2 手动编译设计时包为什么我不建议直接点 Install Packages很多人拿到控件包的第一反应是打开 Delphi 菜单Components Install Packages Add然后找 bpl 文件点确定。对 DevExpressFMX 这种带源码的包我一般不会这么干因为设计时包依赖运行时包直接添加 bpl 经常报Cant load package或者A required package was not found。正确顺序是先编译运行时包再编译设计时包最后才把设计时包注册到 IDE。用命令行编译是最可控的方式也方便后续重装重复执行。这里给一个我常用的批处理模板路径按实际包结构修改就能用echo off rem 编译 DevExpressFMX 运行时包模板通配符请按包内实际 dpk 名称调整 set BDS_PATHC:\Program Files (x86)\Embarcadero\Studio\23.0 set FMX_SRCD:\DevLib\DevExpressFMX-20.1.2\Source set OUTD:\DevLib\DevExpressFMX-20.1.2\Library\Win64 call %BDS_PATH%\bin\rsvars.bat cd /d %FMX_SRC% for %%f in (*FMX*.dpk) do ( echo compiling %%f ... %BDS_PATH%\bin\dcc32.exe -B -Q -DRELEASE -E%OUT% -N%OUT% -U%FMX_SRC% %%f )说明一下参数含义-B表示全量重编译避免旧的 dcu 干扰-Q是 quiet 模式只输出错误和警告编译日志不会刷屏-DRELEASE指定 Release 配置-E指定 bpl 和 dcu 的输出目录-N也是输出目录参数这里让它和-E保持一致后续找文件省事-U是单元搜索路径直接指向源码目录。rsvars.bat是 Delphi 自带的批处理执行后会往当前命令行环境写入编译器路径等变量不调用它的话后面dcc32.exe可能找不到。循环里只匹配*FMX*.dpk尽量避免把 VCL 版的包也编进来。实际包内文件名可能是dxSpreadSheetFMX.dpk、dxLayoutControlFMX.dpk之类具体以解压结果为准通配符能覆盖绝大多数情况。编译过程中如果某个包报错先停下来看错误信息最常见的是缺少前置包把报错里提到的包先编译再回来编这个。全部编译成功后在 IDE 里选Components Install Packages Add把输出目录里dcl开头的 bpl 添加进来点 OK 后组件面板就会多出对应的组件页。很多第一次装的人会问为什么不能直接用 IDE 的 Install Packages 一条条加因为可视安装一次只能处理一个包而且失败时的提示比较笼统不像命令行能看到完整的依赖链。手动编译虽然多几步但每一步都看得到结果省得后面出了问题再来排查。2.3 安装后的三分钟验证新建 FMX 工程看组件面板编译装完不等于就能用了。我习惯做两步验证先看组件面板再写代码。新建一个 Multi-Device Application 的 FMX 工程默认平台目标选 Windows 64 位和 Android 64 位。打开组件面板确认多出来的一页或几页控件里能看到 DevExpressFMX 相关的图标能拖一个 Grid 或 Button 到 Form 上这一步说明设计时包已经生效。组件面板有图标只能说明设计时包装上了运行时包是否真的可用要用代码说话。在 Form 上放一个按钮点击事件里写一段创建控件的代码uses System.SysUtils, FMX.Types, DXFMX.Grid; // 单元名以实际安装版本为准 procedure TForm1.Button1Click(Sender: TObject); var LGrid: TDXGrid; begin LGrid : TDXGrid.Create(Self); LGrid.Parent : Self; LGrid.Align : TAlignLayout.Client; LGrid.Show; end;这段代码的逻辑是在内存里直接创建一个表格控件挂到当前窗体上并撑满客户区。如果编译能过、运行不报错说明运行时包和 dcu 路径都配对了。特别注意uses里的单元名必须和实际包的单元一致20.1.2 的包命名在不同版本里可能调整过以你解压出的源码里的pas文件名为准。我这里写DXFMX.Grid是占位实际安装后到源码目录里看一眼就能确认。另一个常见到让人哭笑不得的问题是子控件间距VCL 里调间距靠PaddingFMX 里用的是Margins和Padding的配合而且默认值经常不一致。第一次用这套控件时如果发现表格或按钮的间距和 VCL 里不一样别急着怀疑控件坏了这是 FMX 布局体系的正常差异。验证完这两个点这套控件才算真正进入可用状态。3. FMX 版控件与 VCL 版不是换皮20.1.2 在 Delphi 12.3 里的选型边界与必调参数3.1 什么时候必须选 FMX 版移动端、跨平台与高 DPI装了 DevExpressFMX 之后先得想清楚一个问题为什么不用 VCL 版。VCL 版在 Windows 上功能更全和 Win32 API、ActiveX 的交互也更顺如果你的目标只是 Windows 桌面、老项目维护、要接各种硬件设备VCL 版显然是省事的选择。但一旦目标平台里有 Android 或 iOSVCL 就直接出局了FMX 是 Delphi 在这两个平台上的唯一 UI 框架这时候 DevExpressFMX 20.1.2 就是补上 FMX 原生控件短板的那块拼图。另一个必须选 FMX 版的场景是高 DPI。VCL 在 Windows 高分屏下的缩放一直是老话题各种兼容模式换来换去FMX 从底层用逻辑像素绘制跨平台缩放的表现一致性好得多。我用这套控件交付过一个 Windows 平板加 Android 手机双端跑的管理端Win 上 150% 缩放、Android 上不同密度的屏幕界面没有出现 VCL 时代那种文字模糊和错位。从 Lazarus 转过来的开发者要特别留意Lazarus 的 LCL 控件是基于各平台原生控件包了一层而 FMX 是非原生自绘框架控件的观感和交互跟原生控件完全不是一回事。这不是控件包的问题是框架本身的差异。用 FMX 版控件时要接受“自绘”这个前提样式、字体、间距都得按 FMX 的规则来不能拿 LCL 或 VCL 的使用习惯往上套。3.2 必调的三个参数平台、样式与字体渲染20.1.2 装好之后真正决定能不能流畅交付的是几个参数设置。下面这张表是我每次新建工程都会检查的参数推荐设置说明Target PlatformsWin64 Android ARM64不匹配会直接导致 dcu/bpl 加载失败编译报的错也不直观StyleBook为 Form 显式指定一个 StyleBookFMX 控件外观全部由 Style 驱动不指定就用默认皮肤Font Family统一指定不要用默认值Android 默认 RobotoWindows 默认 Segoe UI混用必乱布局间距统一用 Margins Padding 组合和 VCL 的习惯不同子控件间距靠 Margins 控制先说 Target Platforms。Delphi 12.3 默认支持 Windows 64 位、Android ARM64、iOS 等平台。如果是新工程在Project Options Target Platforms里把需要的平台勾上。64 位 Windows 和 Android ARM64 是目前最常见的组合。平台选错的现象很隐蔽编译时 IDE 会报找不到某个 dcu但明明路径都对。原因是包的编译产物是按平台分目录的搜索路径对不上就找不到对应平台的 dcu。样式是 FMX 的一大核心差异。TForm上可以挂一个StyleBook控件的StyleLookup属性决定它从 StyleBook 里取哪套样式。DevExpressFMX 20.1.2 自带皮肤但不代表你把控件拖到 Form 上它就会自动套用。常见做法是给主 Form 放一个 StyleBook把需要的皮肤加载进去再统一设置控件的 StyleLookup。面板的圆角、按钮的 hover 效果、Tab 的颜色全部由这套 Style 管理代码里改属性反而绕。字体渲染是最容易“翻车”的一项。FMX 里如果不指定字体族名Windows 上显示 Segoe UIAndroid 上显示 Roboto两边控件高度和文字密度不一样界面上就会看到控件错位、文字溢出。我的习惯是在 StyleBook 里统一定义一种字体族或者干脆在 FormCreate 里按平台设置全局默认字体uses System.SysUtils, FMX.Platform, FMX.Types; procedure TForm1.FormCreate(Sender: TObject); begin if TOSVersion.Platform pfAndroid then TStyleManager.SetStyle(sans-serif) else TStyleManager.SetStyle(Segoe UI); end;这个例子里TOSVersion.Platform是跨平台判断当前系统的标准方式控件文字字体、输入框字体都会跟着全局样式走。字体设置好坏直接影响界面在 Android 上的可用度这一条值得花时间试一遍。3.3 与系统组件的边界为什么 TWebBrowser 播不了 PPTFMX 的TWebBrowser在 Windows 上实际是内嵌的浏览器内核在 Android 上是 WebView它本质上是网页容器不是文档渲染器。很多项目里遇到“Delphi WebBrowser 播放 PPT”“Android 上 PDF 打不开”这类问题本质都是同一个误区把 WebBrowser 当成了万能预览器。PPT 文件内部分装的是幻灯片 XML 和媒体资源需要专门的渲染引擎才能解析浏览器内核不负责这件事。FMX 工程里要预览 PPT 或 PDF正路是先转换再显示。我常见做法是把 PPT 转成 PDF再用 PDFium 这类库来渲染翻页或者更简单一点把每页导出成 PNG放到 FMX 的 ImageViewer 里滑动浏览。PDF 生成方面Delphi 生态里 iText 的移植版本是常见选择注意要选带 FMX 平台支持、并且维护到 Delphi 12 的版本。Excel 导出同样没有原生控件可用处理思路一致要么用接口协议让服务端生成文件要么转成 HTML 表格在 WebBrowser 里展示。省事的项目会在服务端把 Office 文件全部转换成 PDF 或图片客户端只负责展示这套方案跨平台最稳也不依赖特定平台的 API。所以把 DevExpressFMX 当成界面控件库用就好了文档预览这类问题交给转换链路去解决别在一个 WebBrowser 上死磕。边界划清楚项目进度才能稳。4. 安装与使用里的 5 个高频翻车现场现象、原因与处理4.1 “dcu not found” 不再是玄学Library Path 的勾选才是关键现象编译新工程时报F2613 Unit xxx not found甚至出现msxmldom.dcu not found这种 Delphi 自带单元的报错。明明刚装完控件Library Path 也加了为什么还是找不到原因九成是 Library Path 的配置方式有问题。Tools Options Library 里添加路径后下面还有一个选项叫 “Include in Library Path”如果添加路径时没有勾选它IDE 不会把这个目录纳入全局搜索照样找不到 dcu。另外32 位工程和 64 位工程的搜索路径是分开管理的在 64 位工程里只加了 32 位平台的编译产物目录同样会报找不到。解决在 Library 对话框里找到对应条目勾上 Include 选项然后检查工程的目标平台把Library\Win64和Library\Win32分别加进对应平台的搜索路径。修改后重启 IDE重新编译。这一步做完绝大多数 dcu not found 都会消失剩下的要么是包没编译全要么是单元名拼写有误。4.2 编译报内存错误的处理别把 Demo 包一起打开现象编译大一点的 FMX 工程时IDE 直接报Out of memory或者弹Invalid pointer operation有时候重启 IDE 后问题消失过一阵又复发。原因Delphi 的 IDE 主程序 bds.exe 是 32 位进程加载的包、打开的工程、缓存的符号越多可用内存越紧张。DevExpressFMX 这种大型控件包动辄十几个 bpl如果同时又打开了几个 Demo 工程IDE 的资源很容易被耗尽。Invalid pointer operation多半是内存被耗尽后的连锁反应不是代码写得有问题。解决把不相关的工程全部关掉菜单里 View Tool Windows 里能关的辅助面板也关掉工具 选项 IDE 里把启动时恢复上次工程列表的选项关掉减少启动资源占用。更推荐的做法是命令行编译绕过 IDE 的内存限制前面第 2.2 节的那个批处理就能用。如果编完一个包后 IDE 仍然卡重启一次再继续比硬撑着往下走省时间。有些人对这个问题误以为要加大系统内存实际加内存也没用32 位进程根本用不到那么多地址空间。4.3 FMX 下 PDF/PPT 预览失效换一种加载思路现象程序里用TWebBrowser加载本地 PDF 文件Windows 上能显示Android 上白屏加载 PPT 直接没反应。原因WebBrowser 在不同平台的内核不同Android 的 WebView 对 PDF 的 MIME 处理是不确定的PPT 这类 Office 文档更是没有内建渲染能力。同一个控件在不同平台上表现不一致这是 FMX 跨平台带来的边界不是控件装坏了。解决放弃“让 WebBrowser 直接打开文件”的想法。文档预览统一走转换链路PPT 先转 PDFPDF 再用 PDFium 渲染成图片。常见的 Delphi 的 PDFium 封装库需要单独引入注意选支持 FMX 平台的版本。如果在局域网环境下也可以把文档丢给服务端转换完再拉图片客户端只负责展示。做导出功能时iText 的 Delphi 移植版是常见的 PDF 生成库同样只做生成不做预览预览还是走图片渲染这条链路我在 Windows 和 Android 上都验证过稳定得多。4.4 组件面板不显示控件刷新 BPL 缓存现象安装 bpl 时提示成功IDE 也显示加载了但组件面板里找不到新的组件页。原因IDE 的组件面板缓存没有刷新。Delphi 的组件状态、最近使用的项在用户目录下有缓存记录控件装了又换、或者之前卸载残留都可能导致面板显示和实际加载状态不一致。另一个常见原因是设计时包和运行时包的版本不对应装的是 20.1.2 的运行时包却注册了旧版本的设计时包IDE 加载失败但提示不明显。解决先检查 Components Install Packages 列表里有没有dcl开头的设计时包没有就添加。面板不够新可以右键组件面板选择 “Show All Palette” 或者重置面板布局看是否只是被过滤了。如果还在关掉 IDE删除用户目录下 BDS 对应版本号里的组件缓存目录常见路径类似%AppData%\Embarcadero\BDS\23.0里面会有组件面板相关的缓存文件删掉后重启 IDE 让它重建。删缓存不影响代码IDE 重建之后面板就会重新扫描已安装的包。4.5 字体渲染不一致导致的界面错位靠 StyleBook 收口现象同一套界面Windows 上显示正常Android 上文字被截断按钮高度和文字不匹配表格行高错乱。原因FMX 在不同平台取的默认字体不一样字体名、字距、行高都不同。Windows 的 Segoe UI 和 Android 的 Roboto 在相同字号下的实际渲染尺寸不一致控件如果没有指定字体就会各自用默认值界面自然对不齐。解决全工程统一字体。最省事的办法是每个 Form 都用一个 StyleBook在样式编辑器里定义默认字体族和字号也可以按平台在 FormCreate 里设置字体。额外要注意TText和TLabel的AutoSize属性在不同字体下的表现不同定稿前最好在目标平台上跑一遍把字号和控件高度微调好。这一条不做Android 上的界面质量会直接劝退用户属于上线前必须处理的问题。5. 把这套安装经验沉淀成一条可重复的命令自动化安装与版本验证技巧装完一次没完换电脑、重装 Delphi、项目组来了新人都得再走一遍。我习惯把整个流程沉淀成一个 PowerShell 脚本半自动跑完编译和版本校验。下面这段用来核对输出目录里的 bpl 文件版本号确保没有混入旧包$bplDir D:\DevLib\DevExpressFMX-20.1.2\Library\Win64 $bplFiles Get-ChildItem $bplDir\*.bpl foreach ($file in $bplFiles) { $ver (Get-Item $file.FullName).VersionInfo.FileVersion Write-Host $($file.Name) - $ver }这段脚本遍历指定目录下所有 bpl 文件读文件版本信息并输出到控制台。用途是安装后或升级前做一次版本审计如果同一个目录里出现了 20.1.2 之外的版本号说明之前有过残留需要清理否则 IDE 加载哪个版本完全是随机行为。版本号对不上是隐蔽的问题编译能过、运行时某些属性报错查起来很费时间。除了版本核对我还会在组件目录里放一个 readme.txt记录本机的 Delphi 版本、BDS 路径、Library Path 的添加顺序、批处理里改过的路径变量。每次重装系统后照着它操作十分钟能恢复到正常状态。刚开始时我不以为然觉得记在脑子里就行直到一次电脑更换后花了整整两天才把环境拼回去才意识到这个动作有多值。如果还想更省事可以把第 2.2 节的编译批处理和这个版本校验脚本串起来先编译、再校验、最后输出一行汇总结果。这样新同事拿到项目后不用翻教程跑一条命令就知道环境对不对。这套安装流程我前前后后陪过几台机器坑基本都踩了一遍希望帮到你。本文还有配套的精品资源点击获取