我正在尝试定义一个具有公共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'
我在这里做错了什么?
答案 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
用法非常像TDataModule
(TComponent
),所以也许您应该使用集中式TDataModule
- 在其上放一个TADOConnection
,依此类推,并在整个应用程序中使用该实例。
答案 1 :(得分:2)
您可以将nil作为参数传递给TADOConnection.Create。这不会阻止您在TSuperHero类析构函数中销毁它。
constructor TSuperhero.Create;
begin
MyCon := TADOConnection.Create(nil);
end;
当控件作为可视组件被拖放到窗体上时,将使用传递给TADOConnection构造函数的参数。您在代码中收到编译错误,因为TSuperHero不会从TComponent下降。