小小的问题————给还愿意为初学者解惑答疑的富翁————也许值得一看,路过了别错过 !(100分)

  • 主题发起人 主题发起人 wk_knife
  • 开始时间 开始时间
W

wk_knife

Unregistered / Unconfirmed
GUEST, unregistred user!
Marco Cantu在《Delphi5从入门到精通》中说“[blue]在处理对象某个时间的同时,不能
消除该对象,否则会引起一个异常[/blue]”

在Delphi的帮助中有如下一段话:
[red]Warning[/red]: [blue]Never explicitly free a component within one of its own event
handlers or free a component from the event handler of a
component it owns or contains. For example, don't free a button
in its OnClick event handler or free the form that owns the
button from the button's OnClick event[/blue].

在窗体中建立一个按纽,处理OnClick
事件时:
procedure TForm1.ButtonKeyPress(Sender:TObject,var Key:Char)
begin
if Key=#8 then
Sender.Free;
end;
未出现任何问题(当然一般没人会写这样的代码)


请各位富翁就KeyPress事件写一个可以引发异常的代码。
或者是Marco Cantu说错了,而帮助也并没有说会发生异常。







 
对于OnClick也是一样的 。
 
难道富翁们不觉得的这背后隐藏着很深的奥秘?
 
就算“GZ”也行啊,给点信心好吗?
 
Sender.Free是不是把整个程序给终止了?
改成Button.Free试试?应该就会引发异常了吧
 
试过了的,一样的结果。按钮不见了,其他什么也没发生。
 
我将Form的KeyPress事件中加上,结果居然表单都不见了,但程序还在运行.程序又只有这一个
表单,我也想知道原因.
 
Button的click事件的要sender是这个Button本身。
Form的Keypress里的Sender是这个Form。你Free它们当然会消失啦.研究这种东西有什么
意义,要理解它们。在Button上click里写Free,这时候并没有任何操作同时处理
处理这个Button呀。
 
新建一个工程,什么都不做,只写了下面的事件,执行报错,你可以试一试。
procedure TForm1.FormClick(Sender: TObject);
begin
Form1.Free;
end;
 
sender.free表示你发送对象free掉,当然按钮就不见了。
 
是不是先Free了再执行事件,如在OnKey中
begin
button1.Free;
showmessage('test');
end;
showmessge可正常提示,但之后就会出错.
 
以上我的问题并不是对所有的类,及事件都成立的,这一点我也很清楚。
比方在拖动的一系列操作的开始阶段肯定不能释放对象。

我只是想知道为什么在Form以下的控件被释放时(用Click),它居然不弹出异常。
同marknew所说的意思有点一样,在Click中究竟是谁操作了消息,Button还是它的拥有者?

 
多人接受答案了。
 
后退
顶部