Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Can';设置火猴形状属性_Delphi_Firemonkey - Fatal编程技术网

Delphi Can';设置火猴形状属性

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

我试图在Fire Monkey应用程序中初始化程序源文件中的表单属性,但它引发了一个异常。代码如下:

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
方法在行为上存在差异。虽然在VCL
CreateForm
中实际创建表单,并且在调用表单变量完全初始化并准备好使用之后,在FMX
CreateForm
中不创建表单,并且表单变量在调用之后仍然未初始化-
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之前,还有一些其他的初始化,因此可能会有缺点。