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语句之前会怎么样?也就是说,这样写,一定是安全的么?

解决方案 »

  1.   

    肯定不安全,这样写就好多了
      Form3:=TForm3.Create(Application);
      Form3.Show;
      close;
      

  2.   

    Form3:=TForm3.Create(Application);
      Form3.ShowModal;
      close;
      

  3.   

    你的Form3在TForm2外部定义的,Form3的Create和Show都没有用到Form2,应该是安全的.
      

  4.   

    // 你的Form3在TForm2外部定义的,Form3的Create和Show都没有用到Form2,应该是安全的.但是这两个语句却是在Form2中的过程中执行的了,
    这个问题可以抽象成,
    如果在一个类过程中,执行了释放对象的语句后,它后面的语句还执不执行?
      

  5.   

    代码应该是静态的,他不会为每一个对象都复制一份代码吧,Free只是Free数据,VC表等等,因此代码还在那里的,可以放心调用
      

  6.   

    if not assign(frorm3) then
    begin
      Form3:=TForm3.Create(Application);
      Form3.ShowModal;
      close;
    end;
      

  7.   

    //代码应该是静态的,他不会为每一个对象都复制一份代码吧,Free只是Free数据,VC表等等,
    //因此代码还在那里的,可以放心调用但是很显然,方法执行的是对象的方法,如果对象都释放掉了,那些方法还如何执行得下去?
      

  8.   

    Close;
    TForm3.Create(Application).Show;
    可以,但是代码所在单元不能是主窗口单元
      

  9.   

    绝对安全没有问题, 就是看起来不舒服而已:
    现在你所有的代码都是在一个线程中执行的. 线程中有消息对列:首先线程中有了一个Button1Click消息, 这样它就要执行下而的代码
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      close;            //执行到此, 又给线程发了一个要求关闭窗口的消息
      Form3:=TForm3.Create(Application);
      Form3.Show;
    end;大家想想Button1Click消息没执行完,本线程会响应关闭窗口的消息吗? 所以这个消息只能在队列里等着, 上面的函数执行完毕后,才去响应下一个消息. 而Form3的Create中的参数又是基于Application.的, 所以从理论上讲,这段代码一点问题都没有!,但是看着不舒服, 业务上如果有这种需要,可以这样做!
      

  10.   

    agree  IFindit(寻找其中的乐趣)
      

  11.   

    to IFindit(寻找其中的乐趣) 按照你的说法,
    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;这两个就没有区别了,至少是在点击消息和关闭消息的执行顺序上是没有区别的了。
      

  12.   

    //代码应该是静态的,他不会为每一个对象都复制一份代码吧,Free只是Free数据,VC表等等,
    //因此代码还在那里的,可以放心调用但是很显然,方法执行的是对象的方法,如果对象都释放掉了,那些方法还如何执行得下去?----------对象只不过是一个高级一点的概念而已,从机器码的角度来说,它Call的地址是真实存在,不会随着对象的释放而改变.你可以看看编译后的代码。
      

  13.   

    flyforlove(为情飞): 是那样的, 但是你千万不要在Create 里面加上self参数了, 如果加上self, TForm2释放的时候, 它的子对象TForm3也就释放了!