Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了德尔福XE8. FMX.为什么Android平台上CLASS VAR的发布顺序不同?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

使用Delphi XE7 update 1和Delphi XE8进行测试

Windows操作系统(7 SP1 x64),MACOSX(10.10.3)和Android(5.0.2)上创建订单:

    "class constructor TGlobalClass.Create;" -> "constructor TfmMain.Create;" -> "procedure TfmMain.FormCreate(Sender: TObject);"

Windows操作系统和MACOSX上的下达顺序:

    "TfmMain.FormDestroy" -> "destructor TfmMain.Destroy" -> "class destructor TGlobalClass.Destroy;"

Android上的下达订单:

    "class destructor TGlobalClass.Destroy;" -> "TfmMain.FormDestroy" -> "destructor TfmMain.Destroy"

问题是:为什么Android平台上的CLASS VAR在主窗体之前发布?

代码例:

unit uClassvar;

interface

type
  TGlobalClass = class
    class var F1: Integer;

    class constructor Create;
    class destructor Destroy;
  end;

implementation

{ TX }

class constructor TGlobalClass.Create;
begin
  { Breakpoint there }
  F1 := 100;
end;

class destructor TGlobalClass.Destroy;
begin
  { Breakpoint there }
  F1 := 200;
end;

end.

主要单位:

unit ufmMain;

interface

uses
  System.SysUtils,System.Types,System.UITypes,System.Classes,System.Variants,FMX.Types,FMX.Controls,FMX.Forms,FMX.Graphics;

type
  TfmMain = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    constructor Create(Aowner: TComponent); override;
    destructor Destroy; override;
  end;

var
  fmMain: TfmMain;
  z: Integer;

implementation

uses
  uClassvar;

{$R *.fmx}

constructor TfmMain.Create;
begin
  { Breakpoint there }
  inherited;
end;

destructor TfmMain.Destroy;
begin
  { Breakpoint there }
  inherited;
end;

procedure TfmMain.FormCreate(Sender: TObject);
begin
  { Breakpoint there }
  TGlobalClass.F1 := -99999;
end;

procedure TfmMain.FormDestroy(Sender: TObject);
begin
  { Breakpoint there }
  z := 200;
end;

end.

项目文件

program Classvar;

uses
  System.StartUpCopy,ufmMain in 'ufmMain.pas' {fmMain},uClassvar in 'uClassvar.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TfmMain,fmMain);
  Application.Run;
end.
最佳答案
桌面编译器

当应用程序@L_618_10@其组件时,您的主窗体将被销毁.这发生在DoneApplication过程中的FMX.Forms中.

procedure DoneApplication;
begin
  if Screen <> nil="" then="" screen.activeform="" :="nil;" application.destroycomponents;=""><-- this="" is="" destroying="" your="" main="" form="" end;="">

并且在关闭期间调用DoneApplication作为退出过程.退出proc是从TApplication.Run注册的,如下所示:

{$IFNDEF ANDROID}
  AddExitProc(DoneApplication);
{$ENDIF}

类构造函数从定义它们的单元的初始化部分调用.因此,从uClassvar的初始化调用TGlobalClass.Create.类析构函数从同一单元的最终化部分调用.

系统关闭由_Halt0中的系统单元执行.它在执行单元终结之前执行所有退出过程.因此,在调用类析构函数之前,您的表单将被销毁.

移动编译器

请注意,DoneApplication根本不会在Android上调用.

{$IFNDEF ANDROID}
  AddExitProc(DoneApplication);
{$ENDIF}

这意味着主要表单的销毁是从单元终结中调用的.随着每个单元的最终确定,其执行的终结部分将导致任何全局变量离开范围.最终,没有更多对主表单的引用,因此它的析构函数被执行.

如上所述,类析构函数也从单元定型中调用.因为在Android上,你的类析构函数在主表单被销毁之前执行,所以很明显看到uClassvar在主表单的最终引用被释放之前被完成.

现在,这非常有意义,因为uClassvar是初始化顺序中的最后一个单元,因此是最终化顺序中的第一个单元.如果您想确保稍后完成uClassvar,则需要安排它尽快初始化.例如,通过更改.dpr文件的uses子句,如下所示:

uses
  uClassvar in 'uClassvar.pas',System.StartUpCopy,ufmMain in 'ufmMain.pas' {fmMain};

现在uClassvar是初始化的第一个单元,因此最一个单元已完成.

大佬总结

以上是大佬教程为你收集整理的德尔福XE8. FMX.为什么Android平台上CLASS VAR的发布顺序不同?全部内容,希望文章能够帮你解决德尔福XE8. FMX.为什么Android平台上CLASS VAR的发布顺序不同?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。