一个未初始化的局部变量, 类类型, 初始的值总是Sender? (100分)

  • 主题发起人 主题发起人 jackchin
  • 开始时间 开始时间
J

jackchin

Unregistered / Unconfirmed
GUEST, unregistred user!
一个局部的变量, 类类型, 初始的值总是Sender, 例如

procedure TForm1.Button1Click(Sender: TObject);
var
//I: Integer;
F: TLabel;
begin
//I := 0;
//if I = 0 then Beep;
ShowMessage(F.ClassName);
end;

显示是TButton, 奇怪的是无论F放在任何位置(将注释去掉), 总是这样

通过以下语句, 进一步证实这个现象
ShowMessage(IntToStr(Integer(Sender)));
ShowMessage(IntToStr(Integer(F)));

但是, ShowMessage(IntToStr(I)), 结果就不相同

最后, 如果加上 F.Free, 连Button1(就是Sender)都不见了,
可见 F = Sender, 为什么这样?
 
俺又涨见识了,呵呵。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1294954
 
dirk:
谢谢, 内容真是丰富啊, 等我慢慢看
 
俺觉得是Delphi编译器自动优化的结果。
如果把project->options->compiler->Optimitation 去掉就行了。
 
要在前面加上
F:= TEdit.Create(self);
 
Label 创建在哪里?别告诉我是Button上,好像不能创建倒 Button 上的
f.free估计就是在释放 button的。
MyLabel:=TLabel.Create(self)
试一试,是创建倒form上的
 
看了楼上给出的连接, 受益非浅(原来早有人发现, 并深入讨论了), creation-zy
的解释令人信服(尽管到目前为止还是不知其所以然, 唉, 还是根底浅啊)
我原以为局部变量都在栈中分配内存, 谁知道Delphi还会用寄存器放局部的变量,
多声明几个局部变量, 并且都用到(防止编译器优化掉), 寄存器不够用, 就不是
Sender了。
procedure TForm1.Button1Click(Sender: TObject);
var
A, B, C, D: TLabel;
begin
ShowMessage(A.ClassName);
ShowMessage(B.ClassName);
ShowMessage(C.ClassName);
ShowMessage(D.ClassName);
end;
结果第二个ShowMessage就出错了。

 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部