Delphi D10.X 开发过程中莫名多出FireDAC.VCLUI.Wait引用的问题
以早以前就出现过这样的情况,原本用DX开发的是跨平台的项目,那么一定用的是FMX,可以总会多出一个VCL的引用单元。然后左右也是把问题解决了,因为懒,没有记录下来,后来 一次有朋友也遇到相同情况,然后大家讨论了很久也没有找到原因。
今天做了一些测试,把情况简单记录下来,以供大家参考。
问题的复现
这两天做一个小项目,又出现这样的问题。然后又是一阵倒弄,OK,成功解决。可是为什么会出现这样的情况呢?建了一个测试项目,专门测试。步骤如下:(不想知道原理的,可直接看最后)
1、新建一个FMX的项目;
2、在新建的窗体上拖放FireDAC的数据连接与查询控件;
3、运行程序;
4、可看到窗体的引用代码中自动增加了FireDAC.FMXUI.Wait,对是FMX,不是VCL。
继续:
5、在项目中建一个DM(数据模块),我们通常都会这样使用,同样拖两个FireDAC的控件过来,反正没打算云连接数据,所以其他并不设置;
6、运行一下,查看代码引用中自动增加了FireDAC.FMXUI.Wait,好象也没问题的;
7、因为使用DM的时候,我们通常还会引用一些其他自己的单元,所以会增加引用,这样系统就会自动多出一个VCL的引用 ;
初步解决
8、在DM上加一个FDGUIxWaitCursor控件,设置如下:
9、再试试,系统现在不会再云自动增加FireDAC.VCLUI.Wait的引用了,哈哈哈,是不是问题就解决了,看上去好像是这样的,我记得我以前好像也是这样解决过。 好吧,既然不再增加,也算是解决了。然而,其根本原因并不是这样的。
终极解决
加上FDGUIxWaitCursor控件确实是可以解决不自动增加FireDAC.VCLUI.Wait单元的引用问题,然而为什么在不加这个控件前会自动增加引用 呢?我们回头梳理一下:
注意看我们的测试步骤,是在第7步,增加了我们自己的引用单元后才出现自动增加VCLUI的引用 ,那么问题点就应该在这里了。看看在做第7步时出现了什么不同。发现:
数据模块:
请注意左右两个红框,代码里看到他是FMX方式,但实际控件属性里已没有了对应属性。试试看重新设置控件属性。
看看,右边代码变这样了。那么问题很明显是增加自己的引用单元时代码放错位置了。我是习惯性放implementation行下。然而正确的做法,应该是在{%CLASSGROUP ‘FMX.Controls.TControl’}行的下面才对。
分析
出现FMX里自动增加VCLUI引用单元的情况,是因为我们使用自己的引用单元时把数据模块的CLASSGROUP属性清除了,导致系统不知道数据模块是FMX方式,所以他会自动增加VCLUI。
所以,会出现这个情况的必要条件是:
1、项目是FMX;
2、有使用数据模块(TDataModule),其他从TForm继承的窗体中一定不会;
3、有在模块中增加单元内的引用,并且把引用放在了implementation与{%CLASSGROUP ‘FMX.Controls.TControl’}行之间。
结论
我们应该正确的添加单元内自己的引用单元,上面一行与下面一行的区别可算是很大的了。
正确的使用如下图:
就写这点吧。
欢迎光顾本人小店:(https://shop63778938.taobao.com/)
小店也提供delphi方面其他技术支持、定制开发。
现在就进店看看
大家有什么不清楚的,可以给我留言或讨论。 以上信息对您有用的话请点赞收藏,就下面这行
|
请发表评论