procedure TForm2.Button1Click(Sender: TObject);
begin
close;
Form3:=TForm3.Create(Application);
Form3.Show;
end;我先close本窗体,然后再创建form3,
我运行是没有问题的,但是close函数一直执行到Destroy才结束的,
也就是说,这时候,这个类已经释放掉了,下面的两句
Form3:=TForm3.Create(Application);
Form3.Show;
又是怎么执行的呢?当然在窗体Destroy之前,发送过一个消息
PostMessage(Handle, CM_RELEASE, 0, 0);这个消息不用等待返回值,那是不是说,那两句语句是在发送了这个消息后
执行的?那如果发送消息后窗体执行消息在创建Form3语句之前会怎么样?也就是说,这样写,一定是安全的么?
begin
close;
Form3:=TForm3.Create(Application);
Form3.Show;
end;我先close本窗体,然后再创建form3,
我运行是没有问题的,但是close函数一直执行到Destroy才结束的,
也就是说,这时候,这个类已经释放掉了,下面的两句
Form3:=TForm3.Create(Application);
Form3.Show;
又是怎么执行的呢?当然在窗体Destroy之前,发送过一个消息
PostMessage(Handle, CM_RELEASE, 0, 0);这个消息不用等待返回值,那是不是说,那两句语句是在发送了这个消息后
执行的?那如果发送消息后窗体执行消息在创建Form3语句之前会怎么样?也就是说,这样写,一定是安全的么?
Form3:=TForm3.Create(Application);
Form3.Show;
close;
Form3.ShowModal;
close;
这个问题可以抽象成,
如果在一个类过程中,执行了释放对象的语句后,它后面的语句还执不执行?
begin
Form3:=TForm3.Create(Application);
Form3.ShowModal;
close;
end;
//因此代码还在那里的,可以放心调用但是很显然,方法执行的是对象的方法,如果对象都释放掉了,那些方法还如何执行得下去?
TForm3.Create(Application).Show;
可以,但是代码所在单元不能是主窗口单元
现在你所有的代码都是在一个线程中执行的. 线程中有消息对列:首先线程中有了一个Button1Click消息, 这样它就要执行下而的代码
procedure TForm2.Button1Click(Sender: TObject);
begin
close; //执行到此, 又给线程发了一个要求关闭窗口的消息
Form3:=TForm3.Create(Application);
Form3.Show;
end;大家想想Button1Click消息没执行完,本线程会响应关闭窗口的消息吗? 所以这个消息只能在队列里等着, 上面的函数执行完毕后,才去响应下一个消息. 而Form3的Create中的参数又是基于Application.的, 所以从理论上讲,这段代码一点问题都没有!,但是看着不舒服, 业务上如果有这种需要,可以这样做!
procedure TForm2.Button1Click(Sender: TObject);
begin
close;
Form3:=TForm3.Create(Application);
Form3.Show;
end;procedure TForm2.Button1Click(Sender: TObject);
begin
Form3:=TForm3.Create(Application);
Form3.Show;
close;
end;这两个就没有区别了,至少是在点击消息和关闭消息的执行顺序上是没有区别的了。
//因此代码还在那里的,可以放心调用但是很显然,方法执行的是对象的方法,如果对象都释放掉了,那些方法还如何执行得下去?----------对象只不过是一个高级一点的概念而已,从机器码的角度来说,它Call的地址是真实存在,不会随着对象的释放而改变.你可以看看编译后的代码。