1

我正在尝试定义一个类,该类将具有另一个应用程序可以设置的公共 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”

我在这里做错了什么?

4

2 回答 2

4

你可以声明TSuperhero = Class(TComponent).

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

Constructor如果您希望它对其他单位可见,还要确保您是公开的。IE:

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用法非常像TDataModule( TComponent),所以也许您真的应该使用集中式TDataModule- 将 aTADOConnection放在它上面,依此类推,并在您的应用程序中使用该实例。

于 2013-10-07T13:34:48.683 回答
2

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

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

当控件作为可视组件拖放到窗体上时,将使用传递给 TADOConnection 构造函数的参数。您的代码中出现编译错误,因为 TSuperHero 并非源自 TComponent。

于 2013-10-07T13:33:21.533 回答