一个程序建立两个窗体FORM1 FORM2,在FORM1的单元UINT1中USES了FORM2的但愿UNIT2。在FORM1中放一个按钮,写入代码ShowWindow(Form2.handle, SW_SHOW);
此时FORM2显示了出来,问题是点关闭按钮时却无法关闭FORM2,而FORM2的其他按钮工作正常。哪为高人能告诉我是什么原因啊?

解决方案 »

  1.   

    在 form1 中,用 form2.Show;
      

  2.   

    我知道调用form2.show可以,我是向搞明白为什么这样显示出来的窗体不能响应关闭消息,谢谢回答。
      

  3.   

    procedure Tfrom2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      action:=cafree;
    end;
    procedure Tform2.FormDestroy(Sender: TObject);
    begin
       foem2 :=nil;
    end;上面这些是写到FORM2里面的procedure TFrmMain.N15Click(Sender: TObject);
    begin
      if not assigned(form2) then
      begin
        form2 := Tform2.Create(Application);
        form2.show;
      end
    end;这些是写到FROM1里面的,你那样写也可以!~
      

  4.   

    myderek() 的答案正确, 在TForm的FormClose事件中增加一行代码:procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;
      

  5.   

    我追加一个问题。请问为什么我用ShowWindow显示出来的窗体,连上面的控件都看不到呢?
      

  6.   

    谢谢deansroom(丁樵方玉)的详细回答啊。to:Harryfin(Harry) 
    确实这样,我感觉既然都不能响应close事件,非得要人为加入active:=cafree;
    说明这种创建模式只是暂时化的显示出这个窗体来,可能是有什么标志位没有设置,虽然接受到关闭消息,但是根据这个标志位来判断系统是否可以关闭这个窗体。如果是这样的化,就说明showwindow这个函数显示的窗体时肯定绕过了VCL的某个环节,导致VCL没有设置那个所谓的标志位,所以不能关闭。而窗体上控件的parent就是窗体,是窗体对象维护其上控件的创建销毁,被绕过的VCL环节应该就含有创建窗体上子控件的代码过程。这样控件就显示不出来了。这只是我的推测,还需要查看VCL源码来证实。不过目前我还没有看明白流程。
    有没有高人再指点一下