le-*_*e-a 4 delphi variable-assignment variable-initialization
因为它与Delphi有关...
当变量声明某种类型时,它是否初始化为该类型的OBJECT?或者必须为变量分配一个表达式,该表达式返回该类型的对象?
我来自强大的Java背景.我的意思是这个...在Java中,假设您声明一个名为Orange的用户定义类型的实例变量.看起来像这样:
private Orange _fruit;
Run Code Online (Sandbox Code Playgroud)
变量_fruit仍然保持对null的引用,直到实际分配了一个Orange类的实例,如下所示:
_fruit = new Orange();
Run Code Online (Sandbox Code Playgroud)
在Delphi中如果我声明一个类型为TForm的变量,如下所示:
var
Form : TForm;
Run Code Online (Sandbox Code Playgroud)
Form是否已初始化为TForm对象?或者它仍然是零?
我问,因为我在尝试编译一小段代码时遇到错误,如下所示:
这是主要单位:
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils,
System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Second;
type
TForm1 = class(TForm)
ShowForm2: TButton;
procedure ShowForm2Click(Sender: TObject);
end;
var
Form1: TForm1;
SecondForm : TSecondForm;
implementation
{$R *.dfm}
procedure TForm1.ShowForm2Click(Sender: TObject);
begin
SecondForm.ShowModal;
end;
end.
Run Code Online (Sandbox Code Playgroud)
这是第二单元:
unit Second;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls;
type
TSecondForm = class(TForm)
Label1: TLabel;
end;
var
SecondForm: TSecondForm;
implementation
{$R *.dfm}
end.
Run Code Online (Sandbox Code Playgroud)
我尝试编译时遇到的错误正是:"模块'Multiple.exe'中地址005B17F9的访问冲突.读取地址00000000." 我以为这是因为我不以某种方式初始化单元Main中的变量SecondForm?但是,我试图在ShowForm2Click过程中放置'SecondForm.Create',我得到了同样的错误.我是否因为SecondForm未分配而收到此错误?是否需要初始化?或者是吗?
注意:我对Delphi有三天的新见.请考虑一下.
SecondForm.Create是错误的语法.构造函数在Delphi中很特殊.您可以将它们或多或少地视为类方法.你调用它们的方式是这样的:
variable := ClassType.Create(arguments);
Run Code Online (Sandbox Code Playgroud)
虽然可以像实例方法(variable.Create)一样调用构造函数,但这是针对一个特定的用例,不应该在通用代码中完成.在对象而不是类型上调用构造函数的原因是,如果您已经在该对象的构造函数中. (即,如果对象上有多个构造函数,并且其中一个构造函数调用另一个构造函数,或者通过调用父类的构造函数来初始化祖先类的成员inherited Create(arguments);)
你做了什么,当不在另一个对象的构造函数内时调用对象的构造函数,应该引发编译器警告,如果不是错误,但不幸的是它没有.