在三层结构中!
有两个类,其中第一个类从TRemoteDataModule继承(类名为:A)
该类中放了两个控件,一个SQLConnection , 一个SQLQuery!该类中没有任何其它过程或函数;第二个类(类名为B)从A继承,该类包含一个构造函数和析构函数,
并新增了部分函数或过程,如执行SQL语句的公共函数或过程(该过程有使用到父类的SQLConnection 和SQLQuery);现在出现了两个问题:
1:将B设置为自动创建时,构造函数一直不会得到执行;
2:将B设置为手工创建时,当 B := TB.CREATE()后(此时执行了构造函数),但在B类的过程中又无法访问A类中的SQLConnection和SQLQuery时,因其值为NIL?
高手帮忙解决一下!
有两个类,其中第一个类从TRemoteDataModule继承(类名为:A)
该类中放了两个控件,一个SQLConnection , 一个SQLQuery!该类中没有任何其它过程或函数;第二个类(类名为B)从A继承,该类包含一个构造函数和析构函数,
并新增了部分函数或过程,如执行SQL语句的公共函数或过程(该过程有使用到父类的SQLConnection 和SQLQuery);现在出现了两个问题:
1:将B设置为自动创建时,构造函数一直不会得到执行;
2:将B设置为手工创建时,当 B := TB.CREATE()后(此时执行了构造函数),但在B类的过程中又无法访问A类中的SQLConnection和SQLQuery时,因其值为NIL?
高手帮忙解决一下!
TDMEventLog = class(TRemoteDataModule)
SQLCon: TSQLConnection;
SQLQueryComm: TSQLQuery;
private
protected
constructor Create ; virtual;
Destructor Destroy ; override;
public
end;implementation{$R *.dfm}end.type
TDMDataDirect = class(TDMEventLog)
private
FDataSetStringList: TStringList;
protected
procedure ExecSQL(const SQLStr : String ; ExecType : Byte);
public
Constructor create;override;
destructor destroy;override;
published
property DataSetStringList : TStringList read FDataSetStringList;
end;
var
DMDataDirect: TDMDataDirect;
implementation{$R *.dfm}
constructor TDMDataDirect.create;
begin
FDataSetStringList := TStringList.Create;
end;destructor TDMDataDirect.destroy;
begin
FreeAndNil(FDataSetStringList);
inherited;
end;procedure TDMDataDirect.ExecSQL(const SQLStr : String ; ExecType : Byte);
begin
//公共SQL执行过程,该过程有使用到父类的SQLCon,SQLQueryComm;
//并将返回的结果组成字符串存入于FDataSetStringList中;
end;
问题描述:
一:当我通过ALT+SHIFT+F11键,将TDMEventLog,TDMDataDirect类都设置为Auto Create Forms 时,
程序能正常启动,TDMDataDirect类中的构造函数为什么一直不会执行;
此时通过 DMDataDirect.ExecSQL('select * from aaa',1) 能正确的执行SQL语句;
但由于没有对FDataSetStringList进行创建,所以无法在ExecSQL过程中使用该成员;
二:当我通过ALT+SHIFT+F11键,将TDMEventLog,TDMDataDirect类都设置为Available Forms 后,
通过
var x : TDMDataDirect;
begin
x := TDMDataDirect.create();//此时执行了构造函数;
x.exec('select * from aaa',1);
freeandnil(x);
end;
执行TDMDataDirect.Exec时,居然出现父类的SQLCon,SQLQueryComm为nil?
现在这个问题应该怎么解决?我需要达到的目的就是能够通过父类的SQLCon,SQLQueryComm控件来执行SQL语句,并将结果存放到FDataSetStringList中!
begin
inherited Create(nil); //需要寫
FDataSetStringList := TStringList.Create;
end;你復寫了Create方法後沒有調用父類的Create方法.所以TDMDataDirect就不能正确的創建
begin
inherited Create;//添上这句
FDataSetStringList := TStringList.Create;
end
type
TDMEventLog = class(TRemoteDataModule)
SQLCon: TSQLConnection;
SQLQueryComm: TSQLQuery;
private
public
constructor Create(aOwner: TCompoent); override; //重载一下
Destructor Destroy ; override;
end;就ok了