发现Delphi下一个很诡异的地方,大家看看能不能重现,本人使用D6和D7都出现了这个问题:
新建一个窗体,上面放一个按钮,然后在其 OnClick 事件中填写:
procedure TForm1.Button1Click(Sender: TObject);
var
Obj: TLabel;
begin
Obj.Caption := 'AAA';
ShowMessage(Obj.Caption);
end;
这里,我声明了一个obj变量,并没有创建它,点这个按钮后,按钮标题改成了AAA,并不会报错。如果把ShowMessage这句去掉,变成这样:
procedure TForm1.Button1Click(Sender: TObject);
var
Obj: TLabel;
begin
Obj.Caption := 'AAA';
// ShowMessage(Obj.Caption);
end;
点这个按钮后,窗体的标题改成了AAA,也不会报错。
新建一个窗体,上面放一个按钮,然后在其 OnClick 事件中填写:
procedure TForm1.Button1Click(Sender: TObject);
var
Obj: TLabel;
begin
Obj.Caption := 'AAA';
ShowMessage(Obj.Caption);
end;
这里,我声明了一个obj变量,并没有创建它,点这个按钮后,按钮标题改成了AAA,并不会报错。如果把ShowMessage这句去掉,变成这样:
procedure TForm1.Button1Click(Sender: TObject);
var
Obj: TLabel;
begin
Obj.Caption := 'AAA';
// ShowMessage(Obj.Caption);
end;
点这个按钮后,窗体的标题改成了AAA,也不会报错。
把你的代码改为这样,编译器就能发觉错误了:procedure TForm1.Button1Click(Sender: TObject);
var
Obj: TLabel;
begin
Obj.Caption := 'AAA';
Button1.Caption:='BBB';
ShowMessage(Obj.Caption);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Obj: TLabel;
begin
Obj.Caption := 'AAA';
Button1.Caption:='BBB';
//ShowMessage(Obj.Caption);
end;
而且TForm1的caption会变成AAA
var
Obj: TLabel;
begin
Obj := nil; //新增加的
Obj.Caption := 'AAA';
ShowMessage(Obj.Caption);
end;
这样执行就更有意思了,Button1的caption没有编号,弹出的对话框中是空白的。
加上后,这样写会报错:
procedure TForm1.Button1Click(Sender: TObject);
var
Obj: TLabel;
begin
// Obj := nil;
Obj.Caption := 'AAA';
ShowMessage(Obj.Caption);
end;
如果把Obj := nil开放出来不报错,D6 下测试。
试试这样吧:
var
obj: TLabel;
begin
ShowMessage(IntToStr(DWORD(obj)));
end;
var
Obj22: TLabel;
begin
Self.Obj22.Caption := 'AAA';
end;
1 delphi不会初始化局部变量,指向的地址是未知的,虽然可以调用他的熟悉或方法但是结果是不可预测的。
2 第一行,加了 obj := nil以后,因为编译器的优化,编译器认为这一句没有意义,所以不会编译,跟没加一样,取消编译器优化,obj := nil就有效果了,他指向空地址,再对其调用就肯定报错了。可以试一下,讲obj声明为类的成员而不是局部变量,就会报错了,因为对于类成员,delphi会对他默认初始化为nil