unit UnitRWData;interface
uses
  SysUtils,Classes,DB, ADODB;
type
  TRWData = class(TObject)  
  public
  str1:string;      
  qryTmp:TADOQuery;
  dsTmp:TDataSource;
  //constructor Create(st:string);override;
  //destructor destroy();override;
  function Init(connDatabase:TADOConnection):string;
end;
implementationuses UnitDatamodule;
{
constructor TRWData.Create();
begin
end;
 }
{
destructor TRWData.destroy();
begin
end;
}
function TRWData.Init(connDatabase:TADOConnection):string;
var strErrMsg:string;
begin
  strErrMsg:='';
  try
  qryTmp:=TADOQuery.Create(nil);
  dsTmp:=TDataSource.Create(nil);
  qryTmp.Connection:=connDatabase;
  dsTmp.DataSet:=qryTmp;
  qryTmp.SQL.Clear;
  qryTmp.SQL.Text:='select * from sysinfo';
  qryTmp.Open();
  except
  on e:Exception do
    strErrMsg:='初始化出错, 错误代码为:'+e.Message;
  end;
  Result:=strErrMsg;
end;
end.
我自定义的类代码如上,目的想封装TADOQuery和TDataSource类,在构造对象或者初始化时连接数据,这样的话,我就无需担心在Datamodule里在相同的时间使用相同的TADOQuery和TDataSource,并且我可以扩展这个类的函数,比喻funExcSQL(strSQL:string):boolean,通过这个函数就可以提交要查询或者要修改的SQL语句,在这个函数里我做好异常处理,这样岂不是很方便?
   但是问题出现在
『qryTmp:=TADOQuery.Create(nil);
  dsTmp:=TDataSource.Create(nil);
  qryTmp.Connection:=connDatabase;』这段代码,运行的时候老是提示地址访问错误,坦白讲我不太了解Object pascal语言。当然如果在TRWData.Init函数底下用VAR 定义好qryTmp,dsTmp,然后再调用它的CREATE函数,就不会出问题,但是这不是我想要的。请问各为高手如何解决这个问题。

解决方案 »

  1.   

    TADOQuery.Create(nil); 这里不能为nil.
      

  2.   

    谢谢Zyxlp,我改成这样就可以了:TRWData.Init(AOwner:TComponent;connDatabase:TADOConnection):string;然后把AOwner替换nil,
    我想问在使用我定义的这个类之前,能不能不create,并且我想重载TObject类的create构造函数,并且顺便在里面就初始化TADOQuery和TDataSource类的变量。楼上能不能帮我改改这个类,让它比较符合Object pascal的风格和规范,包括释构函数。最好是怎样调用都帮我写出来,小弟不禁感激
      

  3.   

    你倒不如自己做个控件得了,直接拉到form上就可以了。
    你这样建类,调用的话,都得手动程序创建的啊!