下班这段代码:
myform:TForm1;
myform:=TForm1.Create();
myform.Show;
这样可以显示出一个实例化的Form1,我的问题是当这个myform关闭之后,myform在内存中
是否还存在?如果还存在,那上边的写法就有问题,应该怎么写比较好?
我的理解是不应该存在了,因为Delphi的垃圾回收应该能处理这个问题,不知道各位大哥
大姐有什么看法?

解决方案 »

  1.   

    Delphi的垃圾回收并不能完全释放无用的单元
      

  2.   

    (个人意见)当然还存在了,delphi中只要不是Application创造的窗口,其他的窗口都得自己写代码来放内存。
      

  3.   

    component组件创建时,
    若其Aowner为空时必须手动释放,
    否则其Aowner会在自身释放时将改组件释放
      

  4.   

    同事也跟我说要free一下,他们都是用Form1来直接show,也就是Form1.Show,我不知道各位对这种写法有什么意见?
      

  5.   

    回复:meiqingsong(阿飞)
    不明白你的意思,能说详细点吗?
      

  6.   

    var
      myform:TForm1;
    myform:=TForm1.Create(self); //这样创建时不需要手工释放,self在释放的时候会将myform释放的
    myform.Show;myform:=TForm1.Create(nil); //这样创建时,需要手工释
      

  7.   

    在使用完成之后用myform.Free;释放资源。
      

  8.   

    你看一下TComponent的Create, Destroy方法,可以看出,这是个观察者模式
      

  9.   

    回复:meiqingsong(阿飞)
    还有一点不太明白,如果是myform:=TForm1.Create(self);这其中的self是指什么?self释放是什么意思?
      

  10.   

    當然存在啦!=========================================================
    如果Form變量是局部變量,比如:procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      Form:TForm1;
    begin
      Form:=TForm1.Create(nil);
      try
        Form.ShowModal; //不能用Show;
      finally
        Form.Free;
      end;
    end;=========================================================
    如果Form變量是全局變量,比如:
    var
      Form1: TForm1;implementation{$R *.dfm}
    那麼你要這樣寫,
    方法1:
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      if not Assigned(Form1) then Form:=TForm1.Create(nil);
      Form1.Show;
    end;方法2:
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      if not Assigned(Form1) then Form1:=TForm1.Create(nil);
      try
        Form1.ShowModal; //不能用Show;
      finally
         FreeAndNil(Form1);
      end;
    end;
    ......
    initialization
    Form1:=nil;//先將指針指為nil;finilization
    if Assigned(Form1) then FreeAndNil(Form1); //釋放內存===========================================================
    關于Form.Create方法的簡要說明:
    constructor TCustomForm.Create(AOwner: TComponent);AOwner為創建對象的宿主,如果創建對象時指定AOwner,在宿主釋放內存時也會調用自己的destroy方法, 比如
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      Form1:=TForm1.Create(Self);
      Form1.ShowModal;
    //這里不需要寫form1.free;
    end;
      

  11.   

    self如同c++中的this指针,指该对象本身
      

  12.   

    這時寫錯, Form1:=TForm1.Create(Self); 不能用Self, 因為Self指它自己.
    應該改成其它窗體, 比如Form1:=TForm1.Create(frmMain);
      

  13.   

    楼上搞错了类和对象的概念,
    self是指实例本身,
    因此下面的写法没有问题。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MyForm: TForm1;
    begin
      MyForm := TForm1.Create(self);  
      MyForm.Show;
    end;