用self创建的Form是私有的,在关闭的时候是资源释放的;
用application创建的Form是不释放的,只有在应用程序关闭的时候才释放。

解决方案 »

  1.   

    http://www.delphibbs.com/delphibbs/dispq.asp?lid=834435
    http://www.delphibbs.com/delphibbs/dispq.asp?lid=791383
    http://www.delphibbs.com/delphibbs/dispq.asp?lid=1133232问题:请问Application、Self和nil有什么区别? ( 积分:45, 回复:7, 阅读:52 )
    分类:控件 - 使用 ( 版主:amo, cAkk )  
    来自:11830, 时间:2002-5-30 15:15:00, ID:1133232 [显示:小字体 | 大字体]  
    请问我在动态建立控件时使用的Application、Self和nil有什么区别
    TempAQ_GetAllSum:=TADOQuery.Create(Application);

    TempAQ_GetAllSum:=TADOQuery.Create(Self);

    TempAQ_GetAllSum:=TADOQuery.Create(nil);
     
     
    来自:Alex_Y, 时间:2002-5-30 15:24:00, ID:1133255 
    我是这么理解的( 不一定说的对  ):
    Application 是应用程序的属性意为在应用中创建ADOQUERY对象
    Self 很简单,就是创建自己
    nil 为空?这样也可以吗?没试过
     
     
    来自:LGXing, 时间:2002-5-30 15:31:00, ID:1133275 
    我是这么理解的( 不一定说的对  ):
    Application 属于此应用程序的对象
    Self 属于当前窗体
    nil 自成一体
     
     
    来自:11830, 时间:2002-5-30 15:34:00, ID:1133288 
    谢谢你们的回复!
    哪它们在使用上有什么区别呢?
    我现在也不清到底用哪个好,有时用application,有时用nil。
    请问您们都怎么用这个?
     
     
    来自:Archerfl, 时间:2002-5-30 16:28:00, ID:1133377 
    TADOQuery.Create(AOwner: TComponent);是对其祖先类TComponent的构造器的覆盖。
    其中AOwner是指你所创建的对象的拥有者。如本例,假如是Application,那么此时拥有者
    为整个应用程序对象Application。同理self则拥有者为当前窗体对象,nil则不存在拥有者。
    其实,你在写代码时这几种方式都可以,区别仅在与:当你用Application做拥有者时,那么
    该对象假如你不是用Free方法手动释放内存的,那么就要等到Application对象被释放时,它
    才会一起被释放;而你用self时,则要等到该窗体对象释放时,它才一起被释放;nil,则它
    要等到整个应用程序被释放时,它才会被释放。
    不过,你应尽可能养成不用时释放对象的习灌,以防出现内存泄漏! 
     
    来自:Anubis99, 时间:2002-5-30 16:40:00, ID:1133411 
    Archerfl说的很正确
     
     
    来自:11830, 时间:2002-5-31 8:45:00, ID:1134395 
    接受答案了.
     
     
    来自:11830, 时间:2002-5-31 8:50:00, ID:1134409 
    好像明白了,谢谢!
     
     
    来自:archy, 时间:2001-12-16 1:14:00, ID:791383 [显示:小字体 | 大字体]  
    动态创建一个窗口时form1:=Tform1.create(Application)
    form1:=Tform1.create(nil);和
    form1:=Tform1.create(self)有何区别?似乎一样的吗
     
     
    来自:乌龙茶, 时间:2001-12-16 1:19:00, ID:791384 
    用application 作为参数,则由application负责释放当前窗体
    如果用self则由当前类负责释放
    如果用nil则由你自己负责释放,否则将会造成内存泄漏
     
     
    来自:QY208, 时间:2001-12-16 2:22:00, ID:791424 
    同意楼上
     
     
    来自:barton, 时间:2001-12-16 5:13:00, ID:791438 
    不完全正确.
    1.使用Application作为参数时的确可以由Application来释放.但你不能依赖Application
    去释放.因为只有Application释放的时候才会去释放没有被释放的类.可是你能等到那个时
    候吗?你能容忍一个没有用处的类占用宝贵的资源吗?所以常常是即用即撤.不过可以保证没
    有内存泄漏是真的.
    2.nil参数建立窗体时必须主动释放.在动态建立DLL中的窗体时,使用Application常常出错.
    这时候只能用nil作为参数,或者用Application.Handle作为参数,以保证在同一个消息体系
    中.
    3.使用Self作为参数几乎是错误的.一是,这种用法只能在粝方法中处理,如何这个类不是个
    窗体容器的话,毫无意义.至少如果这个Self如果是个TForm的话,难保不出错.
     
     
    来自:zouming, 时间:2001-12-16 9:11:00, ID:791455 
    agree to barton
     
     
    来自:archy, 时间:2001-12-22 14:37:00, ID:804407 
    to barton:
    非常感谢,但是我的《Mastering Delphi 5》中说
    动态建立MDIchild时是frmChild:=TfrmChild.create(self);不知您认为如何
     
     
    来自:树熊132, 时间:2002-1-4 15:25:00, ID:834435 [显示:小字体 | 大字体]  
    谁能告诉我form.create(self)与form.create(nil)的区别 
     
    来自:jiangxiancheng, 时间:2002-1-4 15:37:00, ID:834468 
    所有者不一样。
     
     
    来自:taozhiyu, 时间:2002-1-4 15:41:00, ID:834478 
    AOwner is the owner of the TCustomForm object.
     
     
    来自:wonsfon, 时间:2002-1-4 16:28:00, ID:834592 
    xx.create(AOwner)之后,当AOwner被释放时xx也被自动释放
    xx.create(nil)之后,你在程序结束时必须手工释放xx
     
     
    来自:lujr, 时间:2002-1-4 16:32:00, ID:834600 
    WONSTON的说法是对的。
    xx.create(AOwner)之后,当AOwner被释放时xx也被自动释放
    xx.create(nil)之后,你在程序结束时必须手工释放xx
     
     
    来自:yhaochuan, 时间:2002-1-4 16:48:00, ID:834643 
    wonsfon说得对,
    如果你在一个FORM中动态建立另一个FORM2,那么建议用procedure form1.button1.click(sender:tobject);
    begin
      if form2 = nil then
        form2 := tform2.create(self);
      form2.showmodal;
    end;  
     
     
      

  2.   


    很好,顺便展开一个问题,请指教:Owner和Parent属性都和内存管理有关,那么它们之间在这方面存在存在哪些区别?谢谢!