简介:本资源是专为Delphi 12.3开发者提供的DevExpress FMX界面控件库完整安装包(v20.1.2),适用于构建高性能跨平台FireMonkey应用程序,尤其适合中高级Delphi开发者快速集成专业级UI组件,解决原生FMX控件在数据展示、布局管理与主题定制等方面的局限性。压缩包共619个文件,包含229个已编译dcu单元、46个Pascal源码pas文件、39个dproj工程文件、32个dpk包定义及大量res资源、fmx界面模板和xml配置文件,总大小115.89MB;其中dxGrid、dxLayoutControl、dxMemData等核心模块均已提供.dcu与.dcr支持,可直接编译引用或二次开发。目前已有74人下载学习,资源结构完整、模块划分清晰,涵盖控件注册、设计器集成、示例工程及部署配置,开箱即用,显著降低FMX项目中复杂表格、布局与数据绑定功能的实现门槛。 经常有朋友发消息问我:“DevExpress的FMX控件包到底怎么装?”“解压完就直接用吗?”“为什么装了第二天IDE里又找不到了?”这些问题我几乎每隔几周就会收到一次。正好最近在Delphi 12.3环境里完整走了一遍DevExpressFMX 20.1.2的安装配置流程,踩了几个不大不小的坑,也把排查过程彻底搞明白了。这篇文章就把这次完整过程记录下来:从解压7z压缩包开始,到IDE里出现DevExpress工具栏,再到真机上跑通FMX项目,每个环节做什么、为什么这么做、卡住了怎么排查,都会讲到。如果你正准备在Delphi 12.3里用DevExpressFMX,这篇应该能帮你省掉一整个下午的折腾时间。
DevExpress的FMX控件和VCL控件有一个很大区别:VCL版本走的是标准exe安装向导,一路Next下来就行;FMX版本很多时候是以压缩包形式分发的,下载下来是一个7z文件,需要手动解压、手动配路径、手动编译注册。说白了,这套东西默认使用者是有点Delphi基础的人,不是那种双击安装包就能跑的类型。好在整个流程并不复杂,关键点就那几个,掌握了之后其实五分钟就能装好。
1. 为什么是Delphi 12.3 + DevExpressFMX 20.1.2:版本匹配这件事不能拍脑袋
1.1 DevExpressFMX到底解决了什么问题
先说说FireMonkey本身。FMX是Delphi的跨平台UI框架,一套代码能编译到Windows、macOS、Android、iOS,甚至Linux。听起来很美好,但真正上手做项目的人都知道,FMX原生控件库的覆盖面没有VCL那么全。尤其是表格、图表、树形列表、日期选择这类偏业务型的控件,用原生组件做出来要么丑,要么费劲。
DevExpressFMX就是来补这个短板的。它提供了Data Grid、Chart、Collection View、Date Navigator、功能区等一批在VCL里口碑不错、被搬到FMX平台上的组件。对于需要做跨平台业务系统的Delphi开发者来说,装上它之后写界面逻辑的体验会明显不一样——不用自己封装大量自定义绘制代码,拖一个控件进去,绑上数据,界面就能用了。
对于使用Delphi 12.3的人来说,这个版本本身的FMX引擎已经比较成熟。12.3对高DPI的支持、Android平台的渲染稳定性、iOS新版本适配都比早期版本好很多,底子打好了,上层控件才跑得稳。所以从环境匹配角度看,Delphi 12.3 + DevExpressFMX 20.1.2是一个很合理的搭配组合。
1.2 版本号背后的兼容逻辑
DevExpress控件包对IDE版本是有明确要求的。20.1.2这个版本号,前两位表示发布年份和主版本,后面是修订号,它对应支持的RAD Studio版本范围是固定的。安装之前第一件事就是确认你自己的Delphi版本号,Help > About里能看到具体的Update级别。
这里我想强调一点:别只看大版本,Update级别也要看。DevExpress在安装文件里通常会区分支持哪些Update,如果你的Delphi 12.3的Update级别太老,编译安装包的时候可能报奇怪的错误。我这次用的Delphi 12.3是最新的Update级别,整个过程没有遇到版本相关的编译错误,但我见过有朋友在Delphi 11.3上装新版DevExpressFMX,编译直接报unsupported version,这就是版本匹配没做好的典型表现。
用表格说下版本匹配的判断逻辑:
| 判断维度 | 需要做的事 | 常见问题 |
|---|---|---|
| IDE大版本 | 查看About里的版本号,确认是12.x | 拿FMX包往VCL项目里塞,装不上 |
| Update级别 | 尽量升级到当前最新Update | 编译dpk时报wrong version |
| 控件包版本 | 20.1.2对应RAD Studio 12.x,查看官方Release Notes | 版本太老不支持新IDE |
| 平台类型 | 区分VCL包和FMX包,路径不能混 | 装了VCL包以为FMX也能用 |
2. 安装前的准备工作:压缩包校验、目录规划和IDE状态检查
2.1 先解开那个7z:选对解压工具与校验文件完整性
我拿到的是DevExpressFMX-20.1.2.7z这个压缩包。第一步没什么好说的,解压。但这里有几个小细节很多人不在意,后面恰恰是它们导致了奇怪问题。
第一,解压工具建议直接用7-Zip或者WinRAR,Windows自带的资源管理器虽然能打开7z格式,但遇到比较新的压缩算法版本时可能解不完整。我试过一次用资源管理器直接解压,文件倒是都出来了,但某个资源文件损坏,编译的时候报资源找不到,换成7-Zip重新解压就正常了。所以解压工具的选择不是玄学,是实打实的影响。
第二,解压前最好校验一下文件完整性。7z包在发布时一般会附带MD5或SHA哈希值,用7-Zip的“校验”功能或者在命令行里跑一下哈希计算,确认下载过程中没有产生损坏。这一步在网速不稳的环境下尤其值得做,因为压缩包体积不小,下载断断续续很容易出问题,而损坏的包在安装早期可能根本看不出异常,编译到一半才报错,排查起来很被动。
第三,解压时去掉文件流的备用数据。在7-Zip的“更多选项”里,有一个“NTFS安全/备用数据流”相关选项,建议不要勾选。这个选项主要针对Windows的ADS流复制,对开发库安装没有意义,有时候反而会多出奇怪的文件数据。
2.2 解压目录规划:别把控件放进带空格和中文的路径
解压路径是我这次最想提醒大家的一件事。DevExpressFMX的源码和包文件在编译过程中会往项目文件里写入绝对路径,后续你新建FMX项目引用这些文件时,IDE的搜索路径会直接使用这个绝对路径。如果路径里带中文、带空格、带特殊符号,轻则编译时找不到源文件,重则某些第三方工具链(比如Android的SDK工具)处理路径时直接崩溃。
我的建议是解压到一个纯英文、无空格的根目录下,比如:
D:\Libs\DevExpressFMX-20.1.2不建议放进:
D:\我的控件库\DevExpress FMX 20.1.2这不仅是DevExpress的坑,也是所有Delphi第三方库的通用原则。RAD Studio的路径配置文件本身就是分号分隔的普通文本,空格和中文字符在解析时容易出幺蛾子。我之前见过一个项目,某个控件库放在带中文的路径下,Windows桌面编译没问题,但切到Android目标平台后RSP文件处理路径时直接失败,折腾了很久才排查到是路径字符的问题。
2.3 安装前的IDE状态检查清单
在真正动手之前,把IDE的状态确认好,能省掉后面90%的麻烦。我列一下我自己每次装控件前都会过一遍的清单:
- 确保Delphi IDE已经彻底关闭。安装设计期包的过程中IDE会写入自己的注册表配置和bpl注册信息,运行状态下操作容易冲突。
- 确认系统环境变量里有RAD Studio的BPL输出目录。一般在
C:\Users\Public\Documents\Embarcadero\Studio\23.0\Bpl或者类似路径,这个路径需要在系统PATH或者IDE的库路径里能找到,否则运行期包加载不了。 - 检查杀毒软件。部分国产杀毒软件会把新生成的bpl文件当作可疑程序拦截掉。我遇到过安装完所有步骤都正确、重启IDE后控件还是灰的,最后发现是杀毒软件把半年前生成的bpl隔离了。这个问题在团队开发环境里尤其隐蔽,因为每个人的杀毒软件策略不一样。
第三个问题要多说一句:如果你是在公司内网环境,网络策略比较严格,下载的压缩包本身可能就被杀毒软件标记过。解压时如果提示“已阻止运行脚本”,不要直接忽略,先看隔离区里有没有跟DevExpress相关的dll或bpl文件。有的话要先恢复并加白名单,再继续安装。
3. 核心步骤全流程:解压、Library路径、编译注册、工具栏验证
3.1 添加Library路径的完整操作
解压完成后,打开Delphi 12.3 IDE,进入Tools > Options > Environment Options > Delphi Options > Library。
在Library路径列表里,点击添加按钮,把解压目录下的关键子目录都加进去。通常DevExpressFMX包会带有一个Library目录或者按平台划分的目录结构,以实际解压出来的目录结构为准。但有一个原则是确定的:源文件目录(.pas所在目录)和输出文件目录(.dcu所在目录)都要加,而且顺序有讲究,源文件目录要排在前面。
原因其实很简单。FMX项目在编译时,IDE会从左到右搜索Library路径,找到第一个匹配的单元名就停止搜索。如果你机器上同时装过其他版本的DevExpress或者别的包含相同单元名的控件库,路径顺序决定了到底用的是哪个版本。把当前要用的版本排在前面,可以避免“明明装了新版本,编译用的却是老文件”这种诡异问题。
添加路径时的关键入口:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| Library路径 | 解压目录下的Source等目录 | 编译期搜索源文件 |
| Browsing路径 | 同上或留空 | 代码编辑跳转用 |
| 平台选择 | 先选Win32,再补Win64/Android | 每个平台路径是独立的 |
这里要特别注意:Delphi 12.3的Library路径配置是按平台区分的。默认显示的是Win32,如果你之后要编译Android目标,记得切换到Android平台再添加一次路径。很多人只配了Win32,结果编译Windows程序一切正常,一编译Android就报找不到单元,这就是原因。
3.2 编译并安装设计期包
路径配好之后,要编译安装包。打开File > Open,在解压目录下找到Packages或者类似的子目录,里面应该有后缀为.dpk的包工程文件。
注意区分哪一个是设计期包,哪一个是运行期包。简单来说,运行期包是程序运行时要加载的bpl,设计期包是IDE在界面设计时要加载的控件注册包。通常情况下,需要先编译运行期包,再编译安装设计期包。设计期包会引用运行期包,如果运行期包还没编译,设计期包编译会报找不到单元或找不到bpl。
具体操作上,我在Delphi 12.3里习惯的做法是:用IDE打开dpk文件后,先在Project Manager里找到运行期包,右键选择Compile;编译通过后,再打开设计期包,右键选择Install。Install成功后会弹出一个提示框,告诉你哪些控件已经注册到IDE的Tool Palette里,并自动添加到某个包组中。
如果IDE提示“A required package has not been loaded”这类错误,多半是运行期包路径没配好。回到Library路径检查,看看bpl生成目录是否在IDE能搜索到的范围内。这些bpl文件通常输出到公共文档目录下的Bpl文件夹,或者解压目录下的Lib\Win32之类的路径,手动确认一下文件确实生成了。
3.3 验证安装:新建FMX项目并放置控件
包安装成功,工具栏里多出了DevExpress页签,这时候还别急着高兴,因为这里有个FMX项目特有的坑:DevExpressFMX的控件只出现在FMX项目下,在VCL项目里是看不到的。两者用的是不同的控件框架体系,你在VCL项目里翻烂Tool Palette也找不到DevExpressFMX的组件。
验证步骤是这样的:
- File > New > Multi-Device Application,创建一个新的FMX项目。
- 打开Tool Palette,找到DevExpress页签,展开后会看到Data Grid、Chart、Date Navigator等控件。
- 往窗体上拖一个控件(我习惯先放一个TdxGrid或者TMemo),确认能正常显示在设计界面上,不报“License not found”之类错误。
- 按F9编译运行,如果能在Windows桌面上正常出界面,说明基础安装已经通了。
这里有一个需要说明的地方:DevExpress控件在编译运行时可能会弹License相关的提示框,这是正常现象,说明设计期包已正确注册,运行期包也在正常工作。如果遇到编译错误提示找不到某个dcu文件,大概率是Library路径只配了当前平台,或者源文件目录没加全。
4. 安装后最容易翻车的几个场景:组件丢失、路径残留、平台配置缺失
4.1 “每次进IDE都丢控件”的根因排查链路
这个场景我在热搜词里也看到了——“Delphi控件版本问题导致每次进入IDE都丢失控件,需要重新放置,保存后还是那样”。这绝对是第三方控件安装里最让人头大的一个问题。简单说这个问题的现象是:你装好控件后新建了一个窗体,在上面放了几个DevExpressFMX控件,保存,关闭IDE,再重新打开IDE和项目,一切还在。但是再换一台机器或者过几天再打开,IDE提示“控件X不存在”,窗体上的控件变成了未知类型,或者直接被删掉了。
根因其实只跟一件事有关:IDE在打开窗体时,必须能加载到窗体上所有控件所在的设计期包。如果IDE启动时加载工作正常,但窗体打开时找不到对应的bpl,就会报缺失。设计期包的加载顺序和路径是核心。
我把排查思路完整列出来,照着查基本能定位:
- 检查IDE启动时有没有报错。看Event Log,如果提到
Can't load package或Access violation at package load,问题就出在包注册。 - 检查bpl文件的生成时间和路径。确认你编译安装时生成的bpl跟你当前IDE搜索的bpl是同一个文件。这种情况常见于系统存在多个RAD Studio版本(比如装了12.3还留着10.4),不同版本的Bpl目录不同,IDE搜索到旧版本的残留bpl。
- 检查包依赖关系。有些包之间是有依赖顺序的,比如DevExpressFMX的某些基础包必须先加载,UI包后加载。如果你安装时只装了UI包而忽略基础包,IDE启动时所有依赖这个基础包的控件会全部加载失败。
- 检查Library路径。Delphi 12.3的Library路径如果没配好,编译器认识这个控件但设计器不认识,也会出现“保存后再打开控件消失”的问题。
我自己实际遇到过一种很隐蔽的情况:bpl文件注册到注册表了,路径也正确,但bpl文件本身被另一个程序锁定(比如某个文件同步工具正在上传),IDE启动加载设计期包时读不到文件。这类环境性问题的排查方式就是上面第2步,检查文件是否可读、有没有被占用。
4.2 Win32能编译、Android不能编译的路径陷阱
这个问题几乎每个做FMX移动开发的人都遇到过。Windows桌面上编译一切正常,拖DevExpress控件也流畅,一切到Android平台,编译立刻报错。报错内容往往是找不到某个单元,或者某个单元的版本不对。
原因就在于我在3.1节提到过的,Delphi 12.3的Library路径是按平台独立存储的。你配置了Win32的路径,不代表Android平台也能找到这些文件。切换到Android平台后,需要重新添加一次路径,并且要确认源文件目录中确实包含Android对应的源码(大部分纯Pascal源码是跨平台通用的,但某些平台相关文件只在特定平台上编译)。
另外一个常见问题是dcu文件的平台后缀。Delphi的dcu文件是按平台区分的,Win32编译生成的dcu不能当Android的dcu用。如果你在Library路径里同时加了Win32的输出目录和Android的输出目录,并且目录顺序不当,编译器可能先找到Win32版本的dcu,然后报“dcu与目标平台不匹配”。解决办法是:使用IDE自带的平台切换功能,让不同平台的输出目录在路径代码中自动切换。
这里建议把Library路径配置成带平台宏的格式,比如将输出目录设置为$(BDSCOMMONDIR)\Dcp这类标准宏,然后让各平台生成到各自的子目录下。Delphi官方文档里推荐的做法是:
D:\Libs\DevExpressFMX-20.1.2\Lib\$(Platform)这样切换平台时,IDE会自动映射到Win32或Android对应的子目录,不会出现版本混乱的问题。
4.3 多个DevExpress版本残留的处理办法
我见过一个项目组,开发机上有Delphi 10.4、11.3、12.3三个版本,装过三套不同版本的DevExpress。某天切到12.3后发现老版本的bpl不断干扰新版本,窗体打开时混用新旧控件的属性定义,整个IDE里的状态非常混乱。
处理残留问题的核心思路是:确保IDE在搜索路径和包注册表里只看到一个版本的DevExpress。
具体步骤建议是:
- 在IDE里打开Component > Install Packages,查看已安装包列表中包含“DevExpress”字样的项,全部移除。
- 在Library路径里检查是否包含指向其他版本DevExpress目录的条目,有的话删除。
- 删除过时版本的bpl文件。注意不是删除当前版本的bpl,而是删除旧版目录下那些没有被引用的bpl。在动手删除前,建议先用Everything这类文件搜索工具,按文件名搜索包含DevExpress的bpl,然后逐一确认版本。
- 修改注册表。HKEY_CURRENT_USER\Software\Embarcadero\BDS\23.0\Known IDE Packages里会注册已安装的包,如果上面步骤都做完了IDE还认旧包,可以在这里手动清理。修改注册表前务必备份或者导出对应键值。
这一整个流程做完之后,重启IDE,再打开项目,应该就能恢复到干净状态。我的实际体验是,残留问题只要处理一次,就能稳定用很长时间,但前提是以后安装其他控件库时不要再随意乱装版本了。
5. 在FMX项目里真正用起来:移动端、PDA场景和性能优化
5.1 从放置控件到真机运行:FMX项目集成注意点
装好DevExpressFMX之后,很多人的第一个项目是Windows桌面的,编译运行很顺利。但FMX的核心价值在跨平台,尤其是Android和iOS。我从Windows切到Android真机时踩过一个印象深刻的坑:安装路径没问题、编译没问题,数据也都绑定了,但真机上表格滚动时非常卡,帧率明显下降。
这个问题的原因不在DevExpress本身,而在于FMX项目的渲染选项和控件使用方式。FMX默认的渲染模式是GPU加速,但在某些Android设备上,控件的过度绘制非常严重。尤其是Data Grid这类重型控件,如果开启了大量单元格自绘、阴影、动态效果,帧率会明显下降。
我的经验是,在Android设备上使用DevExpressFMX的Data Grid时,关闭不必要的视觉特效。比如把AllowAnimatedScrolling设置为False,减少滚动时的动画计算;行高固定,避免每行动态计算尺寸;开启VirtualMode处理大量数据,不要让所有行一次性全部渲染。
5.2 移动端布局适配和PDA扫码场景
从热搜词里能看到,不少人在做Delphi FMX的PDA项目开发,比如仓储、物流类的扫码应用。DevExpressFMX的控件在这类场景里有个明显的优势:一套UI代码可以同时适配手机和平板,不用为不同尺寸单独写界面。
PDA设备不同于普通消费级Android手机,屏幕尺寸通常比较小,分辨率却可能很高,同时操作主要依赖触摸和扫码枪,对界面的信息密度要求高。FMX的布局系统在适配这类设备时,需要合理使用TGridLayout或TTabControl等容器,让控件能自动适应不同屏幕。
我实际用下来,在PDA项目里比较推荐的DevExpressFMX控件组合是:Data Grid做列表,Date Navigator做日期筛选,再加上原生的TEdit做输入。核心思路是不要在一个界面上堆太多高级控件,FMX的跨平台抽象层本身会有额外开销,控件越多越重,PDA设备的处理器功率有限,界面响应会变慢。
另外,扫码枪输入实际上模拟的是键盘输入,焦点在哪个输入框上,扫码结果就会进哪个框。如果在FMX界面上放了多个输入控件,扫码时会有一串字符被拆分成多次焦点切换,导致数据错乱。解决方案是把扫描结果统一收进一个隐藏的输入框,再用代码把内容分发到对应字段中。这个是硬件交互层面的坑,跟DevExpress无关,但在PDA开发里非常常见。
5.3 性能优化:链接器选项与包裁剪
最后说说性能调优这个很少有人一次到位的环节。Delphi 12.3里的FMX项目默认把用到的、没用到的那些单元全编进包里,导致安装包体积偏大、启动偏慢。DevExpressFMX本身包含大量单元,如果你什么都不配置,一个简单的列表页面打包出来的APK可能在30~50MB甚至更大。
有两个层面的优化动作可以做。第一个是Delphi编译器的链接选项,在Project Options > Delphi Compiler > Linking里,可以勾选“Link with runtime packages”。启用后程序运行时不把bpl内容捆绑进exe/apk,而是依赖外部bpl文件。这能大幅减小安装包体积,但前提是目标机器上要有对应的bpl文件。对Windows桌面应用可以接受,对Android部署来说比较麻烦,需要将bpl一起打包推送。
第二个层面是裁剪DevExpress组件。不要为了某一个表格功能把整个DevExpressFMX包全部引用进项目。在uses里精确引用你需要的单元,关闭IDE自动添加全部DevExpressFMX相关单元的行为。Delphi有一个“Reduce duplication”的单元引用优化机制,配合手动控制uses列表,能把最终包体控制在一个合理范围内。
我实测过一个项目,优化前后APK体积从44MB降到了27MB,冷启动时间从4秒降到了2.5秒左右。这个差距在PDA这类硬件配置不高、用户对流畅度敏感的设备上非常明显。
最后再说一个跟安装相关的小技巧:如果你插拔了不同版本的DevExpress包之后,发现IDE里的Tool Palette出现重复的DevExpress页签,别急着重装IDE。先关闭所有项目,在Tools > Manage Tool Palette里找到重复的页签,右键删除即可。这个操作不会影响已注册的控件包,只是清理UI层面的显示,算是一个冷门但很实用的小知识。
本文还有配套的精品资源,点击获取