在form1通过form2:=tform2.Create(self);生成一个新窗口后在form2里执行form2.free提示出错?
而且这样生成新窗口能生成很多得窗口,怎样判断才只会生成一个窗口?

解决方案 »

  1.   

    当然出错了,form1都在用form2啊,应该在form1中关闭form2后,再form2.free
      

  2.   

    你写self.free吧
    要想只生成一个,就判断啊
    var exist:boolean
    begin
    exist:=false;
    for i:=0 to mdichildren.count-1 do
      if mdichildren[i] is tform2 then exist:=true;
    if not exist then createform(tform2,form2);
    end;
      

  3.   

    在form2执行selft.free还是不行啊!!
      

  4.   

    其实 Form的使用及释放是这样一个过程:
    var
    A:TForm;
    ...
    A:=Tform.Create(Application);//创建窗体
    A.Show;//以无模式窗体先是你所创建的窗体;
    或者:if A.showmodal=mrOK then
          {执行一些语句};//以有模式窗体方式打开窗体并执行一些代码
    A.Close;//关闭窗体,但是此时并没有从内存中释放;
    A.Free;//从内存中释放窗体。
    你的使用当然是错误的拉。form2正在使用的过程中,你去释放它,肯定会错误的。
    以上代码只是为了说明他们的意义,没有连续性,你可以自己试试看。
      

  5.   

    那麼請問我平時的exit部分都只是一句close;這樣是否也只是form不見了而內存沒有釋放?
      

  6.   

    在创建时判断一下嘛。
    if not Assigned(form2) then
      form2 := TForm2.Create(Self);
    form2.Show;
      

  7.   

    if not Assigned(form2) then //判断窗口是否已经创建
      Form2:=Tform2.Create(Application) 
    else if Form2.WindowState=wsMiniMized then//判断窗口是否最小化
      SendMessage(form2.handle,WM_SYSCOMMAND,sc_RESTORE,0)//恢复窗口
    form2.show;
      
    记住form2  close 时
    FreeANdNil(Form2);  
      
      

  8.   

    var 
     frm2:TFrom2;
    ......frm2:=TForm2.Create(Applocation);
    //可以设置frm2的一些属性
    //然后
    try 
       frm2.showmodal;
    finally
       frm2.free;
    end;