如果我使用如:
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的编译器对拖放到窗体上的控件是不是不能通过手动释放呀?我手动释放后还能继续调用该对象
?
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的编译器对拖放到窗体上的控件是不是不能通过手动释放呀?我手动释放后还能继续调用该对象
?
手动创建的就必须手动释放.记住: create 与 Free 总是成对出现的.
>>话,那么当TMyClass被释放后传递的参数对应的对象看控件的所有者是誰了, 如果你用 ADOQuery1 := TADOQuery.Create(self); 之類的, 就由其父控件負責通知釋放它
1,手动FREE。
2,接口引用计数方式,也就是COM的方式。
另外,顺便说一下,楼主的另一个问题贴怎么糊里糊涂结了呢?
Constructor TMyClass.Create(adotemp:TADOQuery);
begin
inherited Create;//这句话其实加不加无所谓,不会对你程序有什么影响的。
//之所以很多代码里面有它,是假定VCL的TOBJECT将来的扩展。
//至少D7以前的代码不用加。
//至于D8,D9,在内存管理上有了相当大变化,那是另一回事。 end;