Delphi Can';设置火猴形状属性
我试图在Fire Monkey应用程序中初始化程序源文件中的表单属性,但它引发了一个异常。代码如下:Delphi Can';设置火猴形状属性,delphi,firemonkey,Delphi,Firemonkey,我试图在Fire Monkey应用程序中初始化程序源文件中的表单属性,但它引发了一个异常。代码如下: uses System.StartUpCopy, FMX.Forms, uMainForm in 'Units\uMainForm.pas' {MainForm}, UDataModule in 'Units\UDataModule.pas' {DataMod: TDataModule}, DataHelperClasses in 'Units\DataH
uses
System.StartUpCopy,
FMX.Forms,
uMainForm in 'Units\uMainForm.pas' {MainForm},
UDataModule in 'Units\UDataModule.pas' {DataMod: TDataModule},
DataHelperClasses in 'Units\DataHelperClasses.pas',
EXDIntf in 'Units\EXDIntf.pas',
Exd in 'Units\Exd.pas';
{$R *.res}
var
ViewModel: TEXDViewModel;
begin
Application.Initialize;
Application.CreateForm(TDataMod, DataMod);
Application.CreateForm(TMainForm, MainForm);
ViewModel := TEXDViewModel.Create;
MainForm.Data := DataMod;
MainForm.ViewModel := ViewModel; //This throws an access violation exception
ViewModel.Data := DataMod;
Application.Run;
end.
我在VCL应用程序中这样做没有问题。如何修复它?VCL和FMX-FireMonkey
Application.CreateForm
方法在行为上存在差异。虽然在VCLCreateForm
中实际创建表单,并且在调用表单变量完全初始化并准备好使用之后,在FMXCreateForm
中不创建表单,并且表单变量在调用之后仍然未初始化-nil
。因为使用表单变量抛出AV
CreateForm不会立即创建给定的表单。它只是增加了一个
请求发送到挂起列表。RealCreateForms创建真实的表单
FMX有Application.RealCreateForms
方法,该方法在Application.Run
中自动调用。如果在此之前需要使用表单变量,可以自己调用Application.RealCreateForms
。在该调用之后,您可以安全地使用添加到列表中的表单变量Application.CreateForm
请记住,Application.RealCreateForms
将只执行一次表单创建过程,因此您必须在对Application.CreateForm
进行所有调用后调用它,否则您将得到一些统一化的表单
begin
Application.Initialize;
Application.CreateForm(TDataMod, DataMod);
Application.CreateForm(TMainForm, MainForm);
// this forces creation of FireMonkey forms
Application.RealCreateForms;
....
注意:在Windows和OSX平台上,
RealCreateForms
是在应用程序中调用的第一件事。请运行
,这样无论是由您调用还是自动调用都无所谓。但是,在Android和iOS平台上,在应用程序中调用RealCreateForms
之前,会发生额外的(初始化)逻辑。运行
,如果您为这些平台开发,在使用RealCreateForms
时应小心操作,并注意潜在的副作用。移动平台的最佳选择可能是将自定义初始化移动到表单OnCreate
事件中。默认情况下,RealCreateForms()
在应用程序内部调用。Run()
。如果答案正确,请接受它。在应用程序之前调用应用程序.RealCreateForms
是否有缺点?运行
?@DavidHeffernan既然您已经提到了它,Windows和OSX上没有缺点,因为RealCreateForms会在Application.Run中立即调用。然而,在iOS和Android上,在调用RealCreateForms之前,还有一些其他的初始化,因此可能会有缺点。