如果我使用如:
 TMyClass = Class(TObject)
 private
   FADOQuery:TADOQuery;
   ....
 public
   Constructor Create(adotemp:TADOQuery);
   Destructor  Destroy;override;
 End;
 Constructor TMyClass.Create(adotemp:TADOQuery);
 begin
   inherited Create;
   FADOQuery:=adotemp;
 end;
 Destructor TMyClass.Destroy;
 begin
   FADOQuery:=nil;
   inherited Destroy;
 end;
我的问题是如果在主程序中调用 TMyClass.Create(ADOQuery1);那么当TMyClass被释放的时候
ADOQuery1会不会也被释放了?前提是我将
Destructor TMyClass.Destroy;
 begin
   FADOQuery:=nil;
   inherited Destroy;
 end;
改为Destructor TMyClass.Destroy;
 begin
   FreeAndNil(FADOQuery);
   inherited Destroy;
 end;
我发现TMyClass被释放后ADOQuery1还在没有被释放,但是如果构造函数传递的参数不是拖放到窗体
上的控件而是动态创建的控件或者是自定义的类的话,那么当TMyClass被释放后传递的参数对应的对象也会被释放了,我的问题是:
Delphi的编译器对拖放到窗体上的控件是不是不能通过手动释放呀?我手动释放后还能继续调用该对象

解决方案 »

  1.   

    拖放到窗体上的控件 你不用管,系统自动处理, 也不能手动释放, 难道你没发现运行出错?
    手动创建的就必须手动释放.记住: create 与 Free 总是成对出现的.
      

  2.   

    >>但是如果构造函数传递的参数不是拖放到窗体上的控件而是动态创建的控件或者是自定义的类的
    >>话,那么当TMyClass被释放后传递的参数对应的对象看控件的所有者是誰了, 如果你用 ADOQuery1 := TADOQuery.Create(self); 之類的, 就由其父控件負責通知釋放它
      

  3.   

    从DELPHI7以下,只有两种方式。
    1,手动FREE。
    2,接口引用计数方式,也就是COM的方式。
    另外,顺便说一下,楼主的另一个问题贴怎么糊里糊涂结了呢?
     Constructor TMyClass.Create(adotemp:TADOQuery);
     begin
       inherited Create;//这句话其实加不加无所谓,不会对你程序有什么影响的。
    //之所以很多代码里面有它,是假定VCL的TOBJECT将来的扩展。
    //至少D7以前的代码不用加。
    //至于D8,D9,在内存管理上有了相当大变化,那是另一回事。 end;
      

  4.   

    推荐使用Free,因为这个函数在对象不存在的时候仍然不会出错。