☰
Delphi 12.3安装DevExpress FMX 20.1.2控件全攻略
2026/10/30 17:14:44 网站建设 项目流程

简介:面向 Delphi 12.3 桌面与移动开发者的 DevExpress FMX 控件资源包,版本 20.1.2,主要解决 FireMonkey 应用缺少成熟商业控件支持的问题,可用来扩展表格、数据控制器、布局与内存数据集等界面交互组件。包内共 619 个文件,压缩后约 160.76MB;其中 dcu 编译单元可直接参与链接,o 目标文件用于构件生成,pas 源码便于阅读与二次调整,dpk/dproj 负责组织组件工程,fmx/res/dcr 分别对应界面布局、图标与设计期资源,另外还包含少量 so、exe 示例,便于跨平台部署与参考运行效果。目前已有 86 人学习下载,适合具有 Delphi 组件安装基础、想快速获得 DevExpress FMX 真实编译产物的中高级开发者。通过该资源,读者能拿到 Grid、DataController、LayoutControl、MemData 等模块的编译结果和示例工程,节省自行适配 Delphi 12.3 的时间;对照 pas/dcu 结构还能理解控件的内部依赖关系,在项目集成、版本冲突或构件编译排错时更有方向。

1. 先回答最直接的问题:这个 rar 是干什么的,Delphi 12.3 用户能不能直接用

拿到手一个名为 “Delphi 12-DevExpressFMX-20.1.2.rar” 的压缩包,第一反应应该是版本号对不上:DevExpress FMX 20.1.2 是 2020 年前后发布的控件版本,而 Delphi 12.3 是 2024 年之后的新 IDE。这个落差不是小事,它决定了这个包不能像官方安装器那样点两下就完事。这个 rar 解决的诉求很具体:给 Delphi FMX 开发者补一套商业级 UI 控件,覆盖 FireMonkey 自带控件在表格、导航、皮肤、编辑器这些场景上的短板。适合谁?手上维护 FMX 跨平台项目、或者从 VCL 迁移到 FMX 时不想放弃 DevExpress 操作习惯的 Delphi 工程师。结论先给:能装,但解压后不能直接双击用,编译注册那一步要手动处理几个代差问题。

2. 安装前先摸清底细:FMX 控件、20.1.2 版本和 Delphi 12.3 的代差

2.1 DevExpress FMX 是什么:它不是 VCL 控件的简单移植

Delphi 里的 DevExpress 控件大多数人用的是 VCL 版,FMX 版是另一条独立产品线。FireMonkey(FMX)是 Embarcadero 从 XE2 时代推的 GPU 加速 UI 框架,控件用自绘方式在 Windows、macOS、iOS、Android 上渲染同一套界面,没有 VCL 那种窗口句柄。DevExpress FMX 20.1.2 把 VCL 上的表格、导航、编辑器、皮肤思路搬到了 FMX 上,解压后能看到以 dx 或 cx 开头的单元文件,以及配套的设计期包源码。

选型理由很现实:FMX 自带控件在表格这类密集数据场景的表现力不够,筛选、列定制、样式都要自己写;DevExpress 这类商业控件把这块工作量吃掉,代价是版本兼容性得自己扛。20.1.2 这个版本号在 DevExpress 的命名规则里是 2020 年的第一次大版本发布后的第二个补丁版,当时对应的 Delphi 还是 10.3.3 或 10.4,编译器版本宏停在 VER330/VER340 左右。

对比项VCL 版 DevExpressFMX 版 DevExpress
控件宿主Win32/Win64 原生窗口句柄GPU 自绘的可视对象树
位置布局Left/Top + AlignX/Y + TAlignLayout
文字属性CaptionText
跨平台仅 WindowsWindows/macOS/iOS/Android
版本宏时代可追到很老的 Delphi20.1.2 只认到 Delphi 10.4

有一个判断要提前做:这个 rar 是源码分发还是纯二进制分发。如果压缩包里只有 Lib 和 BPL,没有 Source 目录,那在 Delphi 12.3 上基本没法用,因为 20.1.2 的预编译 BPL 是为老 IDE 做的,新 IDE 加载会报模块版本不匹配。有 Source 就能救,下面所有步骤都建立在“源码包在手”这个前提上。

2.2 解压与目录纪律:7z 命令、英文路径和源码包识别

常见做法是用 7-Zip 命令行解压,比 WinRAR 图形界面更适合反复重装。注意 rar 格式需要 7-Zip 内置的 RAR 解压支持,装完 7-Zip 后直接调 7z.exe 就行。

"C:\Program Files\7-Zip\7z.exe" x "D:\downloads\Delphi12-DevExpressFMX-20.1.2.rar" -oD:\DevExFMX20 -y

参数说明:x是解压并保留目录结构;-oD:\DevExFMX20指定输出目录,注意-o和路径之间不能有空格;-y表示有同名文件直接覆盖。解压完先别急着双击任何 exe,先看目录结构。

dir /b D:\DevExFMX20 dir /s /b D:\DevExFMX20\*.dproj

第一条命令列出顶层目录,第二条递归找出所有 Delphi 工程文件。.dproj是 Delphi 的 MSBuild 工程文件,控件源码包一般会把可编译的包工程放在 Packages 目录下。看到 Source 目录和 Packages 目录同时存在,说明这个包是源码分发,可以继续往下走;如果只有二进制和安装脚本,后面那套 msbuild 编译流程就不适用,得换思路。

路径纪律是踩出来的:解压目录不要放桌面和下载目录,权限和索引服务会干扰 IDE 读取;不要放 Program Files,bpl 注册和写 Library Path 时权限麻烦;路径不要带中文,老版 bpl 在 Unicode 路径下的加载支持不完善,报错时你会以为是控件问题,其实是路径问题。

注意:解压前先把目标目录加进杀毒软件白名单。第三方控件的 BPL 本质是 DLL,重新打包后数字签名可能失效,杀毒软件按启发式规则隔离是常见现象。

2.3 代差处理:给旧控件源码补上 Delphi 12.3 的条件编译

DevExpress 这种商业控件源码里到处是条件编译,靠.inc文件管理不同 Delphi 版本的分支。20.1.2 时代只认到 VER340(Delphi 10.4),Delphi 12.3 的编译器版本宏是 VER360,.inc 里没有对应分支时,预处理器会走默认分支,经常漏掉新平台的特性开关,导致编译到一半报找不到某个符号。

先找出哪些 .inc 文件里带版本判断。Windows 下用 findstr 就能干这活:

findstr /s /i /m "VER340" D:\DevExFMX20\Source\*.inc

/s递归子目录,/i忽略大小写,/m只打印包含匹配的文件名,不打印匹配行内容。搜出来的 .inc 文件就是要改的。

修改原则不是新写一个 VER360 分支,而是把 VER340 那段复制一份,条件改成 VER360,宏名沿用原来的。这样后续代码里所有引用老宏的地方都能命中,不会出现“定义了新宏但代码里没人认”的半吊子状态。

// 修改前:这段只有 Delphi 10.4 的分支 {$IFDEF VER340} {$DEFINE DX_FMX_104} {$DEFINE DX_USE_NEW_ALIGN} {$ENDIF} // 修改后:追加 Delphi 12.3 支持 {$IFDEF VER360} {$DEFINE DX_FMX_123} {$DEFINE DX_USE_NEW_ALIGN} {$ENDIF}

上面这段是示意写法,宏名不要照抄,要看你手上源码里真实使用的名字。可靠做法是打开 .inc 文件,全局搜 VER340,把整段复制后把 340 改成 360,并保留相同的宏定义体。改完先别急着编译全部包,随便编一个小的运行时包验证条件编译能通过,再继续下一步。

3. 把控件装进 IDE:用 msbuild 编译 dproj 并注册设计期包

3.1 两条编译路线:在 IDE 里打开包,还是用 msbuild 命令行

把控件源码装进 IDE 有两条路:图形界面路线是 File > Open,打开 Packages 目录下的 .dproj,右键 Project Manager 里的工程选 Build,再右键 Install;命令行路线是用 rsvars.bat 初始化环境后跑 msbuild。两条路各有适用场景,首次安装图省事用 IDE,反复重装或要写自动化脚本用 msbuild。我一般直接用命令行,因为控件包通常有好几个 dproj,一条命令能编完的绝不一个个点。

命令行编译前要先初始化 Delphi 工具链环境变量。RAD Studio 12.x 对应 BDS 版本号 23.0,rsvars.bat 在安装目录的 bin 下。

call "C:\Program Files (x86)\Embarcadero\Studio\23.0\bin\rsvars.bat" cd /d D:\DevExFMX20\Packages msbuild dxFMX20.dproj /t:Build /p:Config=Release /p:Platform=Win64 msbuild dclDXFMX20.dproj /t:Build /p:Config=Release /p:Platform=Win64

rsvars.bat把 dcc32、bds、资源编译器这些工具路径加载到当前控制台,不执行它的话 msbuild 会找不到编译器。/t:Build是 msbuild 的构建任务名,/p:Config=Release指定 Release 配置,/p:Platform=Win64指定目标平台。先编不带 dcl 前缀的运行时包,再编带 dcl 前缀的设计期包,顺序反了会报找不到依赖包。

注意:Release 配置关掉了调试符号,设计期加载更快,体积小一半。Debug 配置能编但 IDE 启动会明显变慢,不建议日常使用。

3.2 注册 bpl 与 Library Path:设计期包、运行期包的分工

编译产物里有两类 BPL:以 dcl 开头的是设计期包,IDE 靠它把控件显示在 Tool Palette 上;不带 dcl 的是运行期包,你写的工程编译和运行时要链接它。只装运行期包,工程能编译但控件不出现在控件面板上;只装设计期包,IDE 启动会报找不到模块。两边都要装。

先确认编译产物位置,然后一步步注册:

dir /s /b D:\DevExFMX20\Packages\Win64\Release\*.bpl

看到带 dcl 前缀的 BPL 文件后,按下面顺序操作:

  1. Tools > Options > Language > Delphi > Library,点路径编辑器,把 Source 目录和编译输出目录(Win64\Release)加进去,这是让 IDE 在编译工程时能找到 .dcu。
  2. 重启 IDE,让新的 Library Path 生效。
  3. Component > Install Packages > Add,浏览到编译输出目录,选中 dcl 开头的 BPL。
  4. 安装完成后,Packages 列表里会多出对应的设计期包,确认勾选状态是启用的。

这里有个容易忽略的点:Library Path 里的目录顺序也会影响解析。Source 目录要排在编译输出目录前面,否则 IDE 可能优先找到旧版本的 .dcu。路径加错了,后面编译你的工程时会报一堆“Unit not found”,那会儿排查起来比现在多花半小时。

3.3 第一个验收动作:新建 FMX 工程,确认控件能拖能编译

装没装成功,空口不算,要新建一个 FMX 工程实际拖控件。IDE 里 File > New > Multi-Device Application > Blank Form,然后在 Tool Palette 搜索框里输入 dx 或 devexpress,看能不能搜到刚注册的控件。

拖一个网格控件到窗体上,设计器会在 .pas 里自动生成类似这样的代码:

// 这段代码由设计器生成,不需要手写 FFMXGrid1 := TdxFMXGrid.Create(Self); FFMXGrid1.Parent := Self; FFMXGrid1.Align := TAlignLayout.Client;

代码逻辑说明:FMX 控件创建后必须挂 Parent 才会显示,Align 设成 Client 让它填满窗体。这一步能通过,说明设计期包和运行期包都已生效。接下来按 F9 编译运行,如果编译报找不到单元,回 3.2 检查 Library Path;如果能编译但控件显示异常,多半是 Delphi 12.3 默认的 Windows 11 主题跟老控件有视觉冲突,这个放到避坑章细说。

4. 在 FMX 工程里用 DevExpress 控件:宿主、皮肤与性能三个关键差异

4.1 宿主差异:FMX 没有句柄,控件树的挂载顺序决定一切

VCL 里写惯了 Left/Top 布局的人,转到 FMX 最容易翻车的地方是“控件挂在谁身上”。FMX 控件树是自绘的,没有句柄,Create 时的 Owner 只负责生命周期,显示与否完全看 Parent。顺带一提,FMX 控件跟 VCL 一样只能在主线程操作,后台线程算完数据要 TThread.Synchronize 或 TThread.Queue 回主线程再碰控件,这个红线两边通用。

procedure TForm1.BuildUI; var LPanel: TPanel; LLabel: TLabel; begin LPanel := TPanel.Create(Self); LPanel.Parent := Self; LPanel.Align := TAlignLayout.Top; LPanel.Height := 48; LPanel.CornerRadius := 8; // FMX 面板自带的圆角属性 LLabel := TLabel.Create(LPanel); LLabel.Parent := LPanel; LLabel.Align := TAlignLayout.Client; LLabel.Text := 'DevExpress FMX 宿主示例'; LLabel.TextAlign := TTextAlign.Center; end;

逻辑说明:TPanel 的 CornerRadius 是 FMX 原生属性,不需要像 VCL 那样自己写自绘圆角;TLabel 的 Text 取代了 Caption。DevExpress FMX 控件同样遵守这套规则,动态创建时先 Create 再设 Parent 再设 Align,顺序不能乱。FMX 场景下做摄像头预览、人脸识别这类界面,原生桥接层把视频帧交给 FMX 控件渲染,也是建立在这棵树挂对的前提下。

4.2 皮肤体系:用 TStyleManager 和控件自带风格文件统一外观

FMX 的风格系统跟 VCL 完全不同,VCL 是控件自己画,FMX 是风格接管绘制。DevExpress 控件通常自带一套风格文件,常见后缀是 .vgs 或 .style,加载方式走 FMX 标准的 TStyleManager。这套机制决定了皮肤文件跟控件版本强绑定,20.1.2 配 20.1.2 的皮肤文件不会出事,拿别的版本硬塞会出现部分控件有样式、部分控件打回原形的怪状态。

uses FMX.Styles, FMX.Forms; procedure LoadDxSkin; begin if not TStyleManager.TrySetStyleFromFile('D:\skins\dxfmx20.vgs') then ShowMessage('皮肤加载失败,请检查文件版本是否匹配'); end;

代码说明:TrySetStyleFromFile 返回 Boolean,加载失败返回 False,不要忽略这个返回值。调用时机要在 Application.Initialize 之后、主窗体创建之前,放在 FormCreate 里经常因为窗体已经在用旧风格而部分失效。团队里多套皮肤时,建议封装一个全局函数统一加载,替换皮肤只改路径参数。

4.3 性能和尺寸:FMX 控件比 VCL 版本沉多少

FMX 控件比 VCL 版多一层样式绘制,运行成本是实打实高出来的。控件数量少时感知不明显,一旦表格列数多、滚动频繁,GPU 占用和内存都会往上走。控件过多导致的卡顿在 FMX 下比 VCL 更早出现,因为每个可视对象都要参与样式解析。优化手段是把不可见的 Tab 页内容延迟创建,不要一上来把整个窗体的控件全部实例化。

对比项VCL 版FMX 版
最小编译产物小,原生 GDI 绘制大,带样式和着色器资源
内存占用相对低相对高,控件树节点开销
滚动性能表格密集场景更稳依赖 GPU 和样式复杂度
适用场景Windows 单平台跨平台或需要现代视觉

这个差异也影响了 Delphi/C++Builder 目前处境下技术选型的一个判断:跨平台诉求强就上 FMX,桌面 Windows 为主就留在 VCL,两条路都有生态支撑,不必强行迁移。DevExpress FMX 20.1.2 的价值主要在桌面端,移动端适配不完整,后面避坑章会细说。

5. 避坑:DevExpress FMX 20.1.2 配 Delphi 12.3 的五个典型雷区

5.1 解压后 bpl 被清掉:现象、原因、解决

现象:解压时一切正常,IDE 启动或编译时提示找不到某个 BPL,回目录一看文件消失了。 原因:第三方控件 BPL 本质是 DLL,rar 二次打包后数字签名失效,杀毒软件按启发式规则把它当风险文件隔离。 解决:解压前把目标目录加白名单,解压后如果文件已被隔离,从隔离区恢复再操作。路径尽量用英文,部分安全软件对中文路径下的 DLL 查得更严,这算血泪经验。

5.2 控件面板搜不到 FMX 控件:现象、原因、解决

现象:设计期包编译安装全程无报错,重启 IDE 后在 Tool Palette 里搜 dx 搜不到任何控件。 原因:最常见是只编译并安装了运行期包,dcl 前缀的设计期包没装;另一个原因是把 Debug 版 BPL 装给了 Release 版 IDE,IDE 加载时界面包冲突导致静默失败。 解决:回到 Component > Install Packages 检查列表里有没有 dcl 开头的包,确认勾选;把 Debug 版输出目录从 Library Path 里删掉,只留 Release。改完重启 IDE,Tool Palette 缓存也会跟着刷新。

5.3 编译工程报找不到 dcu:现象、原因、解决

现象:控件能在设计器拖出来,但按 F9 编译时报 Fatal: Unit not found 或 File not found,指向 dxFMX 开头的单元。 原因:Library Path 没有覆盖 Source 目录,或者编译输出目录和当前工程目标平台不一致。比如包编的是 Win64,工程默认编 Win32,两边对不上。 解决:确认 Tools > Options > Language > Delphi > Library 里 Source 目录在列表顶部;确认工程 Target Platforms 与包的 Platform 一致。路径改了还报错,就把工程目录下的 __dcu 缓存目录删掉重建,这个缓存跟 IDE 的资源管理器缓存一样玄学,删了往往就好。

5.4 Android 目标编译失败或运行闪退:现象、原因、解决

现象:Windows 平台编译运行都正常,切到 Android 目标编译时报链接错误,或者 APK 装到真机上启动即闪退。 原因:DevExpress FMX 早期版本主要覆盖桌面端,20.1.2 对高版本 Android SDK 和 NDK 的适配不完整,原生依赖库可能不含 arm64-v8a 或新版 API 的兼容层。 解决:先查包文档里声明的目标平台支持清单,如果只写了 Windows/macOS/iOS,就别在移动端硬扛。非要用移动端,升级到控件的新版本,老版本不值得浪费时间调 NDK。

5.5 皮肤加载后界面还是默认风格:现象、原因、解决

现象:TrySetStyleFromFile 返回 True,但运行起来界面没变化,或者只有部分控件变了。 原因:皮肤文件版本和控件版本不匹配,20.1.2 的皮肤描述字段与 Delphi 12.3 自带 FMX 控件的属性对不上;另一个原因是加载时机太晚,窗体已经创建完成。 解决:使用 rar 里自带的同版本皮肤文件,不要跨版本混用;把加载调用放在项目源码里 Application.Initialize 之后、主窗体创建之前;检查返回值,返回 False 时不要继续后续流程,先解决文件匹配问题。

6. 装完怎么验证:三个验收动作、一个卸载后悔药

6.1 验收动作一:三件套一次性跑通

新建 FMX 工程后,做三个动作:拖一个表格控件并绑定一张内存表数据,确认数据能显示、能点击排序;放一个导航控件切换页面,确认焦点和页面跳转正常;加载一次皮肤,确认全局样式生效且无控件打回原形。三个动作都通过,这套控件在你的环境下算基本可用。

6.2 验收动作二:盯住编译产物和 IDE 健康度

控件包会显著增大编译产物,这是正常的,但要有量化认识。编译一次空 FMX 工程记录耗时,再编译一个带控件的工程对比;打开任务管理器看 bds.exe 的内存占用,如果装了控件后 IDE 启动后内存长期高居不下,考虑是不是把不用的设计期包从 Packages 列表里取消勾选。BPL 文件数量和体积也可以作为装全没装全的判断依据。

6.3 验收动作三:留一条卸载回滚的路

装控件包最怕装完不满意想卸,结果不知道动了哪些注册表项。先备份再装,后悔药就有了。Delphi 12.3 的库路径和已安装包信息都存在 HKCU 注册表里。

@echo off rem 备份 Delphi 12.3 的库路径与包注册信息,卸载时用于回滚 reg export "HKCU\Software\Embarcadero\BDS\23.0\Library" D:\backup\bds23-library.reg /y reg export "HKCU\Software\Embarcadero\BDS\23.0\Known IDE Packages" D:\backup\bds23-packages.reg /y

reg export 是 Windows 自带命令,/y表示覆盖已存在的备份文件。两个注册表项分别是 Library Path 和 IDE 包列表,卸载控件时先执行这两个备份,再在 IDE 里取消勾选包和删除路径,不满意时双击 .reg 文件就能恢复原状。

我的习惯是装这类老控件包时把验收结果记在一个文本文件里,写上 Delphi 版本、编译平台、皮肤版本、IDE 内存占用、编译耗时。下次换机器或升级 IDE,照着记录重来一遍,比每次重新踩一遍坑快得多。这套 20.1.2 的 FMX 控件在 Delphi 12.3 上属于“能装能用但有代差”的定位,适合已有 DevExpress 经验的团队在桌面端快速出界面,新项目或移动端场景建议先做能力评估再决定投入。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询