- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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先于main form发布?
代码示例:
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,
FMX.Forms,
ufmMain in 'ufmMain.pas' {fmMain},
uClassVar in 'uClassVar.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TfmMain, fmMain);
Application.Run;
end.
最佳答案
桌面编译器
当应用程序对象销毁其组件时,您的主窗体也被销毁。这发生在 DoneApplication
过程中的 FMX.Forms
中。
procedure DoneApplication;
begin
if Screen <> nil then
Screen.ActiveForm := nil;
Application.DestroyComponents; <-- this is destroying your main form
end;
并且 DoneApplication
在关闭期间作为退出过程被调用。该退出过程是从 TApplication.Run
注册的,如下所示:
{$IFNDEF ANDROID}
AddExitProc(DoneApplication);
{$ENDIF}
类构造函数从定义它们的单元的初始化部分调用。因此,TGlobalClass.Create
从 uClassVar
的初始化中调用。从同一单元的终结部分调用类析构函数。
系统关闭由 _Halt0
中的 System
单元执行。它在执行单元终结之前执行所有退出过程。因此,您的表单在调用类析构函数之前被销毁。
移动编译器
请注意 DoneApplication
在 Android 上根本不会被调用。
{$IFNDEF ANDROID}
AddExitProc(DoneApplication);
{$ENDIF}
这意味着主窗体的销毁是从单元终结中调用的。当每个单元完成时,它的完成部分将被执行,这会导致任何全局变量离开范围。最终,不再有对您的主窗体的引用,因此它的析构函数被执行。
如上所述,类析构函数也从单元终结中调用。由于在 Android 上,您的类析构函数在主窗体被销毁之前执行,可以清楚地看到 uClassVar
在主窗体的最终引用被释放之前完成。
现在,这很有意义,因为 uClassVar
是初始化顺序中的最后一个单元,因此也是最终化顺序中的第一个单元。如果你想确保 uClassVar
稍后完成,你需要安排它尽快初始化。例如,通过像这样更改 .dpr 文件的 uses 子句:
uses
uClassVar in 'uClassVar.pas',
System.StartUpCopy,
FMX.Forms,
ufmMain in 'ufmMain.pas' {fmMain};
现在 uClassVar
是第一个初始化的单元,因此是最后一个完成的单元。
关于android - 德尔福XE8。调音台。为什么Android平台上CLASS VAR的发布顺序不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31067795/
是否有适用于 Delphi 2006/2007/2009 的 FitNesse 版本? 如果可以的话我在哪里可以找到它? 还有其他类似 FitNesse 的程序可以在 Delphi 2006 上运行吗
在 MDI 应用程序中有一个打开的模态表单 A。表单 B 从表单 A 中显示为模态。 如何在调用模态表单 B 后关闭模态表单 A? 最佳答案 模态意味着终生嵌套。当一个模态表单打开另一个模态表单时,第
我一直在写一些通过 URL 下载指定网页源代码的函数: function GetWebPage(const url: string): tStringList; var idHttp: TidHt
我正在寻找一种在 Delphi 中使用我的网络摄像头的方法,主要用于抓取图片,由于某些原因我无法使用 TWAIN 驱动程序。 最佳答案 尝试这些资源 DSPack DSPack is a set of
我正在寻找用于 delphi 的数据感知 TreeView 什么是最好用的? 最佳答案 Virtual TreeView 是最快的,功能最多的,最好的,而且是免费的!(对于数据感知,有免费的 desc
这个问题已经有答案了: How to copy the properties of one class instance to another instance of the same class?
我想为我的应用程序使用大型倒十字光标。但我的代码使光标背景反转。光标仍为白色。 var IconInfo: TIconInfo; AndMask, Bmp: TBitmap; w, h:
[DCC Fatal Error] Unit1.pas(7): F1026 File not found: 'MyBitBtn.dcu' Unit1 是用于测试目的的 VCL 表单。 我已经安装了一个
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
是否可以删除 TabSheet 的边框(~4px)?我使用 PageControl 作为开关面板,而不是框架、窗口等。我希望一切都是直的。 最佳答案 unit Unit1; interface use
我有java代码从文本文件填充 HashMap 。 HashMap data = new HashMap(); 我用它来制作键值对。值是一个字符串数组。我必须迭代键值对的每个可能的组合(因此还必须迭代
如何更改mp3文件的恒定比特率(CBR)? (例如64kbps-128kbps-192kbps) 最佳答案 您需要重新编码mp3。由于我不知道用Delphi编写的mp3编解码器不错,因此您需要在c库(
当我迭代窗体上的控件时,我会看到在设计时或运行时放置在其中的控件。它们都是TEdit,Tmemo,TComboBox等类型的... 但是,总有八种我不认识。我可以跳过它们,因为它们不是我感兴趣的类型,
我认为这是一个愚蠢的问题..但是..当在Delphi中声明另一个类的子类时, children 是否直接获得了 parent 的方法? 解释: 名为“P”的类是名为“C”的类的父类,“P”类有一个名为
正在尝试将数据发布到 https://www.facebook.com/login.php使用突触 delphi 库但没有任何结果。帖子数据来自 mozila headers viewer。 答案?
我在使用 PHP + Delphi 9 + Firebird 检索大量数据时遇到问题。 应用程序屏幕截图 我在 Delphi 应用程序中有一个名为 "checks"的按钮,当我单击该按钮时,它会根据函
我正在将我的 Delphi 7 应用程序迁移到 Delphi 2010。我们使用了 Open XML(来自 http://www.philo.de/)。 在 Delphi 2010 中,它似乎已经内置
在以下代码中: type TDoubleDWORD = record L, H: Longint; end; function BitSelection(const Block:
我喜欢这个工具栏。我在哪里可以找到它? 谢谢 最佳答案 您可以实现与使用标准 Delphi 组件类似的功能(至少非常类似): 将 TControlBar 添加到表单 将其 DrawingStyle 设
如何使用 Zeos 在 firebird 中创建 autoinc 字段。 -布拉德 最佳答案 Firebird FAQ #29中有解释。请参阅该页面的底部。 关于德尔福 Firebird 汽车公司,我
我是一名优秀的程序员,十分优秀!