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

资讯详情

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

Delphi 12.3安装DevExpressFMX 20.1.2实战指南

Delphi 12.3安装DevExpressFMX 20.1.2实战指南 简介Delphi作为经典RAD工具其FMX框架支持跨平台应用开发而DevExpressFMX控件提供了强大的表格与图表组件是许多企业级项目的关键依赖。理解控件包与IDE编译器版本绑定的原理是成功适配新版本Delphi的核心。通过利用源码包重新编译、正确配置Library Path、规划运行期与设计期包的编译顺序能够解决老版本控件在新IDE中的兼容性问题。这一技术方案广泛应用于桌面端和移动端的数据展示、PDA扫码入库等场景。本文以DevExpressFMX 20.1.2在Delphi 12.3中的安装实践为例整理路径配置、编译顺序、常见报错排查及性能调优经验帮助开发者高效完成控件迁移与调试避免踩坑。 在Delphi 12.3里折腾DevExpressFMX说实话一开始我是拒绝的。20.1.2的版本号一看就知道不是为12.3准备的但项目里几个FMX界面实在离不开这套控件尤其是表格和图表自带TGrid用起来手感差了一截。花了一个下午把包解压、编译、安装、跑通之后我决定把整个过程记录下来包括那些浪费了我不少时间的错误。如果你手头也是这个压缩包或者正准备在Delphi 12.x里装老版本FMX控件这篇文章应该能帮你少走点弯路。先把结论放在前面Delphi 12.3装DevExpressFMX 20.1.2核心思路不是直接双击dpk等它自己编译完而是先把源码路径、依赖包、编译顺序这三件事理清楚再动手。整个过程不复杂但坑确实不少尤其是平台切换和旧包缓存这两个地方几乎每个人都会撞上。1. 环境准备先搞清楚这个包是什么1.1 版本号里的门道DevExpressFMX-20.1.2.7z严格来说对应的是DevExpress 2020年的Release分支。这个版本当时官方支持的Delphi版本最高到10.4也就是RAD Studio 10.4。Delphi 12.3属于后来的版本编译器版本号已经到了35.x直接加载老BPL基本没戏因为BPL和IDE的编译器版本是强绑定的。好在DevExpress的安装包通常包含Source源码目录而不是只给编译好的BPL。这个设计很关键BPL只能在对应版本IDE里用换一个Delphi版本就得重新编译。源码包则不然只要源码能解析、依赖的第三方库能找到就可以在自己的IDE里重新编译全部包这也是老版本DevExpress能在新IDE里存活的唯一正确姿势。不过我还是要提醒一句20.1.2官方没有声明支持Delphi 12.3所以接下来所有编译操作都属于“自己动手适配”。这意味着有些依赖包可能需要你手动调整甚至个别控件可能因为底层API变化而编译失败。心态上先接受这一点后面遇到问题就不会慌。1.2 解压目录与包内容核对解压之前先把路径规划好强烈建议放在一个纯英文、无空格的目录下比如C:\DelphiComponents\DevExpressFMX。Delphi编译器在带空格的路径下偶尔会抽风尤其是老版本源码里如果有相对路径引用空格会导致文件找不到。我见过最典型的报错是“F1027 Unit not found: System.pas”排查半天发现是路径里的空格在作怪。解压后先别急着打开IDE花几分钟翻一下包结构。正常情况下你会看到几个关键目录Source是控件核心源码Packages里面放的是dpk工程文件Lib可能是编译好的dcu或bplDemo目录提供官方示例。先打开Packages目录看看dpk文件的命名规律特别是有没有带Win32、Win64、Android、iOS后缀的工程。FMX事件比VCL复杂得多因为FMX本身跨平台每个平台都要有对应的dcu和编译配置。这一步还有一个容易被忽略的动作查看包内有没有README或者版本说明文件。有些第三方整合包会在文档里写明推荐的编译顺序、依赖的第三方库、已知问题这些信息比你去网上搜半天都靠谱。1.3 为什么源码包是关键如果手里这个7z只有编译好的BPL和DCP没有Source目录那在Delphi 12.3里基本可以放弃了。BPL文件里的RTTI信息和编译器版本绑定直接安装极大概率会提示“Module %s was compiled with a different version of %s”这种错误没法通过配置解决只能找到对应版本的重新编译包。而源码包给了你操作空间。你可以用IDE直接打开dpk工程逐包编译遇到编译错误还能进去改代码。比如某些老控件用了TStringList的旧API或者某个被移除的Windows单元在Delphi 12.3里就要手动替换成新写法。如果包里没有源码这个步骤完全无法进行。所以拿到包之后第一步不是打开Delphi而是确认包内有没有完整的Source目录以及这个目录下是否包含所有.pas源文件。有些精简版包为了减小体积会去掉部分源码只保留核心运行库这种包安装起来能编译但一旦遇到平台相关的问题你想改代码都没得改。2. 安装实操从解压到工具面板出现控件2.1 先配Library Path再编译很多人拿到包第一件事是双击dpk然后被编译错误淹没。正确顺序是先配路径再编译。打开Delphi 12.3进入Tools Options Language Delphi Library上方有一个Platform下拉框默认可能是Win32。先在Win32平台下把Source目录下所有子目录添加进Library Path。我当时是按单元文件归属的目录来加的比如Source\core、Source\grid、Source\chart这样IDE查找文件更快也避免把无关目录塞进系统搜索列表。这里要特别注意Library Path是分平台保存的。你在Win32下面添加的路径切到Win64或者Android平台时是看不到的必须每个平台单独配置一遍。我一开始以为加一次所有平台通用结果切到Win64编译时直接报找不到dcu检查后才发现路径根本没带过去。所以建议先只配Win32把安装流程跑通再逐个平台补路径。还有一点Delphi的Library Path有一个全局路径和项目路径的区分。控件安装属于全局项要在全局Library里添加不要去项目里配否则每个新项目都要重复设置而且还会造成版本不一致的隐患。2.2 运行期包和设计期包的编译顺序Packages目录里的dpk通常分两类一类是运行期包名字一般不带Reg或Design另一类是设计期包用来注册到IDE工具栏名字里通常带Reg、Dsgn、Design这些关键词。安装顺序一定是先编译运行期包再编译设计期包。设计期包依赖于运行期包生成的BPL和DCP顺序反了必然报错。具体操作上我推荐直接用MSBuild命令行批量编译而不是在IDE里一个一个右键Build。命令行编译的好处是能看清楚每个包编译是否成功输出信息更直观而且可以写一个批处理脚本一次跑完所有Win32的包。命令大概是msbuild C:\DelphiComponents\DevExpressFMX\Packages\dxFMXGrid.dproj /p:ConfigRelease /p:PlatformWin32注意这里dxFMXGrid.dproj只是示例名称不同版本包的工程名不一样以实际Packages目录里的文件名准。如果你不确定哪些是运行期包、哪些是设计期包最简单的方式是先编译所有不带Reg的dpk再编译带Reg的dpk。编译成功以后运行期包会生成.bpl文件设计期包也会生成对应的.bpl。接下来打开IDE的Component Install Packages点击Add按钮把设计期包的BPL文件加进去。这里要留意安装的是设计期包不是运行期包。如果误把运行期包添加进去IDE会提示这个包没有设计期注册单元控件面板不会出现任何新控件。2.3 用IDE逐个编译的另一种思路如果你不习惯命令行也可以在IDE里直接打开dpk文件右键选择Compile或Build。这种方式更直观但有一个缺点Delphi 12.3对老版本dpk的兼容性一般打开工程后可能提示需要转换或者某些属性不支持。这时候不要慌直接点确定让IDE做转换如果转换后编译报错记录错误信息。我个人经验是使用IDE编译时优先用Build而不是Compile。Compile只编译变更过的文件Build会全量编译。在控件包这种多文件、多依赖的场景下全量编译更容易暴露问题而且能确保所有单元都是最新的。还有一个细节有些dpk文件在IDE中打开后右上角有Requires列表列出了这个包依赖的其他BPL。如果依赖的包没有先编译安装这里会标记为红色。所以安装顺序可以再从另一个角度理解先安装被依赖的底层包再安装上层功能包。DevExpress的包依赖关系通常写得很清楚看Requires列表就能理顺。2.4 安装后必做的验证包安装完成以后至少要做两步验证否则你无法确认控件是否真的可用。第一步重启IDE新建一个FMX应用在Tool Palette搜索框里搜DevExpress关键字确认控件出现在面板上。如果没出现不要急着重新安装先检查Component Install Packages里对应包是否勾选有时候BPL添加成功但勾选状态是False自然看不到控件。第二步把控件拖到窗体上试一下确认没报“Package ... is not correctly installed”。这一步能快速暴露BPL版本不一致的问题。如果你之前装过其他版本或者系统中残留了同名的旧BPL拖控件时就会弹出版本冲突的提示。解决办法是清理系统目录和IDE搜索路径下所有旧BPL和DCP文件再重新编译安装。我在这一步踩过一次坑安装后控件列表里能看到但拖到窗体上瞬间IDE崩溃。排查了很久最后发现是系统中存在一个旧版本的运行期BPLIDE加载时优先加载了旧文件。把旧文件删掉之后问题彻底消失。所以如果你遇到IDE崩溃不要第一时间怀疑控件包本身先查一下有没有重复的BPL文件。3. 控件不是装上就能用FMX数据绑定与布局实战3.1 用代码绑定数据源而不是拖来拖去DevExpress FMX的表格和树形控件使用方式和VCL版有相似也有不同。官方Demo里通常是拖一个DataSource再设置DataSource属性做绑定。但在Delphi 12.3里我更推荐直接用代码建数据源避免在设计期反复切换平台导致IDE卡顿。以最常见的SQLite查询为例先用FireDAC建立连接和数据查询再把查询结果交给表格控件显示FDQuery1.Connection : FDConnection1; FDQuery1.SQL.Text : SELECT id, name, qty, price FROM orders ORDER BY id; FDQuery1.Open; dxFMXGrid1.DataSource : DataSource1; DataSource1.DataSet : FDQuery1;这里控件名dxFMXGrid1是我按本地包的类名写的不同版本的DevExpress FMX类名可能有差异具体以你安装后Tool Palette中显示的类名为准。写SQL时不要写SELECT *FMX应用在真机和PDA设备上内存往往有限按需取列很重要。养成显式列出字段的习惯对性能优化和代码可维护性都有好处。数据绑定成功之后表格控件会显示所有查询出的数据。如果你觉得列宽自动分配不合理可以直接在代码里设置列的Width属性。DevExpress FMX控件的列对象一般在绑定后可以通过ColumnByFieldName方法获取例如var ACol: TdxFMXGridColumn; begin ACol : dxFMXGrid1.ColumnByFieldName(name); if ACol nil then ACol.Width : 200; end;这种方式在运行时调整列很方便也很适合做界面配置持久化。3.2 移动端布局里的子控件间距FMX里没有VCL那种Anchors概念取而代之的是Align加Margins加Padding这套组合。用DevExpress控件在手机上做界面时最容易出问题的是控件间距。比如两个控件Align都设为Top第二个控件总贴在上面那个下面这时候不要靠加空Panel去顶正确做法是给控件设置Margins比如Top设置为8让控件之间拉开距离。这个点看起来简单但我在PDA项目里见过不少同事用“透明占位控件”来调间距结果一换分辨率排版就崩。FMX的布局本来就是相对坐标体系老老实实用Margins和Padding才能适应不同分辨率的屏幕。DevExpress的FMX控件同样遵循这套布局规则所以从VCL迁移到FMX时先别急着嫌弃控件样式先检查布局属性。还有一个容易犯的错在滚动容器里放DevExpress表格控件时为了保证表格能跟随内容滚动需要把表格放在TScrollBox内但表格自身的滚动行为与ScrollBox冲突经常出现两个滚动条叠加。我建议要么直接让表格作为页面的主区域不放在ScrollBox里要么将表格高度设置为固定值并关闭其内部滚动。具体取舍取决于业务需求但在手持设备上尽量让外层容器来管理滚动避免嵌套滚动。3.3 用图片控件做局部放大不少人在找PictureBox局部放大方案。FMX原生没有VCL那种PictureBox但用TImage配合手势缩放事件一样能实现。思路是给TImage绑定TBitmap然后在OnGesture里调整缩放系数模拟局部放大效果。procedure TForm1.Image1Gesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); begin if EventInfo.GestureID sgiZoom then begin Image1.Scale.X : Image1.Scale.X * 1.05; Image1.Scale.Y : Image1.Scale.Y * 1.05; end; end;这里要注意的是缩放后图片中心会跑偏。正确做法是记录手势焦点把缩放中心设到手势焦点上而不是图片左上角。具体实现时可以通过Bitmap的Canvas变换矩阵来做。如果只是做简单的放大预览也可以直接换成TImageViewer这个控件自带缩放和平移能力省去自己处理手势。3.4 完整案例做一个PDA扫码入库界面综合前面的知识点这里分享一个我做过的PDA入库界面结构正好把数据查询、布局间距和扫码输入串起来。界面从上到下分三块最上面一条查询栏中间是DevExpress表格底部是操作按钮。查询栏用TEdit输入单号旁边放一个“查询”按钮。表格用DevExpress FMX表格控件显示入库单明细。底部放“扫码确认”和“清空”两个按钮。查询按钮的点击事件里拼接SELECT语句并打开数据集procedure TForm1.btnQueryClick(Sender: TObject); begin FDQuery1.SQL.Text : SELECT id, material_code, material_name, qty, location FROM stock_in_detail WHERE bill_no :billNo; FDQuery1.ParamByName(billNo).AsString : edtBillNo.Text.Trim; FDQuery1.Open; end;扫码枪在PDA上一般以HID键盘模式输入扫出来的条码会直接进入当前聚焦的Edit控件。为了避免扫码结果被某个不知名控件截胡最好在窗体上放一个专门用于接收扫码输入的TEdit并让它始终可见但视觉上弱化比如放在表格上方。在它的OnKeyDown事件里判断回车键说明一次扫码结束然后执行库存校验逻辑。这里有个小坑如果扫码前焦点在DevExpress表格上扫码结果可能直接变成表格的行内编辑内容看起来就像控件把扫码内容吞掉了。解决办法很简单在查询成功或界面切换后主动把焦点设到扫码输入框上比如edtScan.SetFocus;这样每次扫码都是从头开始不会被表格的编辑状态干扰。4. 边装边踩坑编译与运行期问题速查4.1 编译期报错整理一下我在安装和使用DevExpress FMX过程中遇到的高频编译错误。错误提示F1027或E1026说找不到某个dcu第一反应检查Library Path。特别是从Win32切到Win64或Android平台时经常会提示缺少对应平台的dcu这是因为老版本DevExpress的源码在编译其他平台时可能有个别第三方依赖单元没有带上。处理方式是先清理输出目录确认当前平台配置正确再重新编译。如果提示Unit xxx was compiled with a different version of xxx基本可以判定有旧的dcu或bpl混在路径里。这种情况通常出现在以前装过旧版控件或者没有清理干净的电脑上。先到Lib目录和系统目录下删掉旧bpl再把项目里生成缓存全部清掉重新编译。第三个高频问题是在编译设计期包时提示找不到ToolsAPI单元。ToolsAPI是IDE提供的接口单元正常应该在Delphi安装目录下。如果找不到说明Library Path里存在一个冲突的ToolsAPI.dcu可能是其他第三方控件带来的。检查并屏蔽冲突路径问题一般能解决。4.2 运行期崩溃与显示异常控件在IDE里正常拖出来运行起来却报AV访问错误或直接闪退这种情况优先级最高的是检查BPL版本是否匹配。FMX控件运行时是按需动态加载BPL的如果运行期包版本不对大概率会闪退。可以用Process Explorer或者IDEFixPack的包列表工具查看实际加载的包路径。显示异常的问题也常见尤其是表格控件在窗体上空白一片可能是FMX样式文件没加载。DevExpress FMX控件会依赖内置皮肤或者系统样式资源如果应用里没有初始化样式控件绘制就会异常。在项目里确认Application.Initialize之后有调用样式初始化逻辑或者在Project Options里勾选启用样式。还有一个比较隐蔽的问题如果你在窗体设计期给控件设置了某些属性比如列的Visible为False但运行后这些列仍然显示。这是因为FMX的流式机制在读取DFM时可能因为类型不匹配跳过了部分属性。解决办法是把所有列状态在FormShow里再设置一遍不要依赖设计期持久化。4.3 问题速查表这里整理一份我在安装和日常使用中比较常用的对照表方便你快速定位问题。现象可能原因排查方向F1027找不到System.pasLibrary Path未配置或路径含空格检查全局Library Path和路径合法性F2613缺少Unit运行期包未先编译先编译所有运行期包再编译设计期包拖控件时IDE崩溃旧BPL版本冲突清理旧BPL、DCP后重编控件面板搜不到DevExpress设计期包未安装或未勾选检查Install Packages列表运行时报“different version”路径中存在多个BPL版本删除多余BPL保留当前包表格运行后空白样式未初始化确认FMX样式已启用Android设备上不显示平台库未编译或未部署重新编译Android平台包并确认部署路径扫码内容进入表格编辑框焦点在表格控件上在扫码前强制SetFocus到输入框这张表其实也就是我排查问题时的思考路径。遇到问题先归类再按表格里的方向去查效率比瞎试高很多。4.4 独家避坑技巧善用DCC32命令行日志编译控件包时IDE的错误信息经常被折叠在Message窗口里几百条警告和几个错误混在一起看得人头疼。我习惯直接用命令行编译并把输出重定向到文件这样方便回溯msbuild dxFMXGrid.dproj /p:ConfigRelease /p:PlatformWin32 build_win32.log 21编译完打开日志文件用CtrlF搜索“Error”或“Fatal”可以快速定位真正的错误。Warning信息不用管老版本控件在Delphi 12.3里编译有大量Warning是正常的只要不是Error就能继续。还有一个小技巧编译FortmF哪个包失败先看它Requires了哪些包确认这些包是否已经成功安装到IDE。DevExpress的包依赖关系通常都很明确Requires列表里标注为丢失的包就是你需要先编译安装的包。5. 性能调优与跨平台注意事项5.1 大数据量下的表格体验DevExpress FMX表格控件在处理几千条数据时还可以但到了几万条直接绑定DataSet就很吃力了。我的建议是开启控件的虚拟模式或者按需加载具体名称在不同版本里不一样思路是让表格只渲染可见区域的数据而不是把所有行都塞进内存。配合查询分页先加载前100条滚动到底部再追加用户体验会好很多。具体做法可以这样数据集只取当前页的数据比如每次取100条滚动到接近底部时再执行下一条查询把结果追加到现有的FDMemTable中。表格绑定FDMemTable这样DevExpress感知到的是内存表数据滚动时不会触发数据库查询。这里要强调不要把VCL版的成熟习惯直接搬到FMX版。FMX的表格底层渲染机制和VCL差得远尤其跨iOS和Android时一次性渲染太多行会直接卡死UI。用DevExpress FMX做移动端项目数据量级控制是首要考虑因素。5.2 各平台编译的细节差异Windows平台基本没有额外烦恼编译完就能跑。Android平台需要特别注意包内的Android支持文件路径确认Lib里包含对应CPU架构的so库比如arm64-v8a或者armeabi-v7a。老版本DevExpress的Android包可能只支持armeabi-v7a在那些只装了arm64模拟器的开发机上还要额外配置才能运行。iOS平台则需要对每个架构重新编译并且要配置好Linker的Framework参数。这些在官方文档里都有对应说明但老版本控件的适配文档可能比较难找这时候可以去看包里的Demo工程Demo能编译通过你项目就能编译通过。如果Demo本身就编译失败那么大概率是依赖环境的问题参考第一节的路径配置逐项排查。需要注意的是Android和iOS平台的编译必须在Project Options里正确选择Platform不要只在Win32下编译通过就发布。FMX是跨平台框架但每个平台的系统API和渲染机制不同控件包在不同平台的表现要分别验证。5.3 授权与激活提醒最后提醒一个很多人忽略的事DevExpress是商业控件源码包可以下载但正式使用必须有有效授权。不少人在IDE里装好控件后编译时报“You need a license for DevExpress ...”这就是授权文件没放进去。在Delphi 12.3里装老版本时License文件也要对应版本否则即使装上了也没法正常编译发布。我没有资格建议你绕过授权只能提醒大家走官方试用或者正规渠道获取授权。商业环境里使用未授权控件轻则编译期报错重则引发合规问题这个风险不值得冒。如果你只是个人学习研究可以看看官方是否有试用License申请先跑通功能再说。我个人建议在动手安装前先花十分钟把包目录结构和版本对应关系理清楚比闷头编译省时间得多。路径配好、编译顺序理顺、平台细节处理到位这套老控件在Delphi 12.3里依然能发挥很大价值。真遇到这里没写到的报错优先看包内的Demo工程和文档绝大多数问题都能在官方示例里找到答案。本文还有配套的精品资源点击获取
返回列表