procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Sbkz_Form.Free;
  Sbkz_Form:=nil;
end;procedure TSbkz_Form.Button2Click(Sender: TObject);
begin
  Close;
end;
点击这个按钮出错,提示:‘Abstrat error’
而我用窗体上的‘x’关闭窗口不会出错,但是重新创建这个窗体是又出错,创建代码如下:
procedure TGlzt_Form.Button4Click(Sender: TObject);
begin
  if Sbkz_Form=nil then
     Sbkz_Form:=Sbkz_Form.Create(Self)
  else
     Sbkz_Form.show;
end;我该怎么写这个释放?

解决方案 »

  1.   

    窗体的释放分模态与非模态;也就是Show与ShowModal两种。
    //ShowModal
    form2.ShowModal;
    form2.Free;//Show
    form2.Show;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
       Action:=caFree;
    end;
      

  2.   

    你创建的时候应该是 if Sbkz_Form = nil then
         Sbkz_Form := TSbkz_Form.Create(Self)
      else
         Sbkz_Form.show;还有,Sbkz_Form 怎么没有初始化为nil?
      

  3.   

    procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Sbkz_Form.Free;
      Sbkz_Form:=nil;
    end;將 Sbkz_Form.Free; 那句去掉,應該可以改正錯誤!
      

  4.   

    都不行,我重新创建这个窗体时还是出错
    procedure TGlzt_Form.Button4Click(Sender: TObject);
    begin
      if Sbkz_Form=nil then
         Sbkz_Form:=Sbkz_Form.Create(Self)
      else
         Sbkz_Form.show;
    end;
      

  5.   

    To Yzykjh
      释放动态创建的窗体和窗体本身是否摸态没有关系吧?!楼主在创建窗体的时候使用如下代码:
    if not Assigned(Sbkz_Form) then
    begin
      Application.Create(TSbkz_Form,Sbkz_Form);
      Sbkz_Form.Show;
    end;  //因为是动态创建的,所以如果判断对象指针为空,那么肯定是没有创建,所以可见性也谈不上,也没有必要在调用Show方法了,这样会出错。至于窗体对象指针的清零可以在释放的时候保证释放窗体的时候在OnClose事件中写如下代码:
    FreeAndNil(Self);
      

  6.   

    procedure TGlzt_Form.Button4Click(Sender: TObject);
    begin
      if not Assigned(Sbkz_Form) then
         Application.CreateForm(Sbkz_Form,Tsbkz_Form)
    end;
      

  7.   

    //更正
    procedure TGlzt_Form.Button4Click(Sender: TObject);
    begin
      if not Assigned(Sbkz_Form) then
      begin
         Application.CreateForm(TSbkz_Form, sbkz_Form);
         sbkz_Form.Show
      end;
    end;
      

  8.   

    procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
    end;
      

  9.   

    To ZhouTian618  只简单的将Action参数设置为caFree是释放不了对象指针的(这可以释放对象实体),如果要释放对象指针,可以采取以下三中方式:1.Action:=caFree;
      Form1:=Nil;  //不可以使用Self
    2.Free;
      Form1:=Nil;  //不可以使用Self,同上
    3.FreeAndNil(Self);
    这里可以使用Self,原因很简单,看看SysUtils单元的FreeAndNil源码就知道了
    procedure FreeAndNil(var Obj);  //参数类型是无类型变参
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);  
      Pointer(Obj) := nil;  //这里可以看到FreeAndNil内部是先释放指针,才释放对象的!
      Temp.Free;
    end;
      

  10.   

    with   Tform1.create(self) do 
    begin
    try
        aa.showmodal
    finally
        release
    end;
    end;
      

  11.   

    TO FrameSniper(§绕瀑游龙§) 
    我操作窗口时一般不要用全局变量指针的。
    顶多在不得已的时候定义一个私有的窗口变量。
    -------------------------------------------------------------------
    也建立楼主尽量不要用Sbkz_Form这种全局变量,
    会带来太多的不稳定因素啊。
    直接用SELF不是可以访问了吗?
    如果用Sbkz_Form这种变量也就限定了同类型的窗口只能打开一个实例了,
    不太好。
    -------------------------------------------------------------------
    不到万不得已,不要用全局变量!
      

  12.   

    TO FrameSniper(§绕瀑游龙§) 1.Action:=caFree;
      Form1:=Nil;  //不可以使用Self
    2.Free;
      Form1:=Nil;  //不可以使用Self,同上
    3.FreeAndNil(Self);//??????????????第三点有问题:
    这样可以,但是这样解决不了楼主的问题。
    你虽然清空了SELF指针的值,但是没有清空Sbkz_Form的值!
    很明显示,楼主需要清空Sbkz_Form的值。
      

  13.   

    procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
      Sbkz_Form:=nil;
    end;//建议楼主少用Sbkz_Form这样的变量。
      

  14.   

    下面是FreeAndNil的Souce Code:
    procedure FreeAndNil(var Obj);  
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);  
      Pointer(Obj) := nil;  
      Temp.Free;  //这里释放对象实体
    end;
      

  15.   


    在close事件中;
    action:=cafree;
     form:=close;
    如果是一个单击事件释放直接调用close就行了
      

  16.   

    procedure FreeAndNil(var Obj);
    var
      P: TObject;
    begin
      P := TObject(Obj);
      TObject(Obj) := nil;  // clear the reference before destroying the object
      P.Free;
    end;/*
    如果用FreeAndNil(SELF)调用,只会清除SELF指针,却不会清除Sbkz_Form指针的值,
    Sbkz_Form不会为nil的。
    */
      

  17.   

    to  zhoutian618:
    不要用Sbkz_Form这种全局变量?那我该怎么办?单击button4时创建Sbkz_Form这个窗体
    to yzykjh  FrameSniper
    用你们这个方法窗体Sbkz_Form创建不了,没有反映啊
    if not Assigned(Sbkz_Form) then
    begin
      Application.Create(TSbkz_Form,Sbkz_Form);
      Sbkz_Form.Show;
    end;
      

  18.   

    创建:
      TSbkz_Form.Create(Application).Show;procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
    end;
      

  19.   

    第二种方法:
    if not Assigned(Sbkz_Form) then
    begin
      Application.Create(TSbkz_Form,Sbkz_Form);
      Sbkz_Form.Show;
    end;procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
      Sbkz_Form:=nil;
    end;
      

  20.   

    更正:(拷贝的时候没有注意)第二种方法:
    if not Assigned(Sbkz_Form) then
      Application.Create(TSbkz_Form,Sbkz_Form);
    Sbkz_Form.Show;
    procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
      Sbkz_Form:=nil;
    end;
      

  21.   

    to  zhoutian618:
    不要用Sbkz_Form这种全局变量?那我该怎么办?单击button4时创建Sbkz_Form这个窗体
    第二种方法:
    if not Assigned(Sbkz_Form) then
      Application.Create(TSbkz_Form,Sbkz_Form);
    Sbkz_Form.Show;
    编译时说类型不对:
    [Error] Glzt.pas(52): Incompatible types: 'TComponent' and 'Class reference'
      

  22.   

    if Sbkz_Form=nil then
      Application.Create(TSbkz_Form,Sbkz_Form);
    Sbkz_Form.Show;procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
      Sbkz_Form:=nil;
    end;
      

  23.   

    不行啊,关闭后重新创建就出错
    还有if not Assigned(Sbkz_Form) then
    和if Sbkz_Form=nil then这两个方法有什么区别?
      

  24.   

    执行到Sbkz_Form.Show这句就出错了
      

  25.   

    if Sbkz_Form=nil then
      Application.Create(TSbkz_Form,Sbkz_Form);
    Sbkz_Form.Show;procedure TSbkz_Form.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
      Sbkz_Form:=nil;
    end;//一定行,不可能错。
      

  26.   

    真的不行啊
    这句话编译出错:Application.Create(TSbkz_Form,Sbkz_Form);
    [Error] Glzt.pas(52): Incompatible types: 'TComponent' and 'Class reference'
      

  27.   

    Application.Create(TSbkz_Form,Sbkz_Form);有问题吧
    要改成Application.CreateForm(TSbkz_Form,Sbkz_Form);