gpt4 book ai didi

delphi - 无法设置 Fire Monkey Form 属性

转载 作者:行者123 更新时间:2023-12-03 15:44:48 26 4
gpt4 key购买 nike

我试图在 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。

FMX.TApplication.CreateForm

CreateForm does not create the given form immediately. It just adds a request to the pending list. RealCreateForms creates the real forms.

FMX 具有在 Application.Run 中自动调用的 Application.RealCreateForms 方法。如果之前需要使用表单变量,可以自己调用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 平台上,RealCreateFormsApplication.Run 中首先调用的,因此它是否存在并不重要由您调用或自动调用。但是,在 Android 和 iOS 平台上,在 Application.Run 中调用 RealCreateForms 之前会发生额外(初始化)逻辑,如果您针对这些平台进行开发,则在使用时应谨慎行事RealCreateForms 并注意潜在的副作用。对于移动平台来说,最好的选择可能是将自定义初始化移动到 Form OnCreate 事件中。

关于delphi - 无法设置 Fire Monkey Form 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34977364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com