如何指定我的类是它创建的对象的所有者?

时间:2013-10-07 13:28:10

标签: delphi ownership

我正在尝试定义一个具有公共ADOConnection的类,而另一个应用程序可以设置它。

但是,我无法让构造函数工作来创建ADOConnection变量。这是我到目前为止的代码:

unit SuperheroClass;

interface

uses
  ADODB;

type
  TSuperhero = Class

  private
    MyQry: TADOQuery;
    constructor Create;
  public
    MyCon: TADOConnection;

end;

implementation

constructor TSuperhero.Create;
begin
  MyCon := TADOConnection.Create(self);
end;

end.

如果我没有弄错,我需要使用Self创建这些内部类变量,以便它们属于该类,然后我可以在类析构函数中释放它们。

此代码给出了一个错误:

  

[错误] SuperheroClass.pas(23):不兼容的类型:'TComponent'和'TSuperhero'

我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

您可以声明TSuperhero = Class(TComponent)

TComponent祖先有能力拥有和管理其他组件

如果您希望其他单位可以看到Constructor,请确保其公开。 即:

public 
  constructor Create(AOwner: TComponent); override;

...

constructor TSuperhero.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  // TSuperhero.Self now owns MyCon and responsible for freeing it
  MyCon := TADOConnection.Create(Self); 
end;

如果整个应用程序需要Superhero,我会将TSuperhero实例化为:

Superhero := TSuperhero.Create(Application);

Application成为Superhero的所有者,并负责释放它。


只是为了添加我的答案,您的课程TSuperhero用法非常像TDataModuleTComponent),所以也许您应该使用集中式TDataModule - 在其上放一个TADOConnection,依此类推,并在整个应用程序中使用该实例。

答案 1 :(得分:2)

您可以将nil作为参数传递给TADOConnection.Create。这不会阻止您在TSuperHero类析构函数中销毁它。

constructor TSuperhero.Create;
begin
  MyCon := TADOConnection.Create(nil);
end;

当控件作为可视组件被拖放到窗体上时,将使用传递给TADOConnection构造函数的参数。您在代码中收到编译错误,因为TSuperHero不会从TComponent下降。