动态创建的对象报错(50分)

  • 主题发起人 主题发起人 夜色獨行
  • 开始时间 开始时间

夜色獨行

Unregistered / Unconfirmed
GUEST, unregistred user!
各位朋友请帮我看一下,分虽然少了点,下面是我的程序,
type
TSaveData = class
private
AdoDataConn: TADOConnection;
AdoInsert: TADOQuery;
procedure ini;
public
constructor Create ;
destructor Destroy; override;
end;
constructor TSaveData.Create;
begin
inherited ;
AdoDataConn:= TADOConnection.Create(application);
AdoInsert:= TADOQuery.Create(application);
ini;
end;
程序在执行到 AdoDataConn:= TADOConnection.Create(application);即报错:
project savedata.exe raised exception class eaccessviolation with message 'access violation at address 00488FDF in module saveData.exe'. write of address 00000004'如在 constructor Create ;后加上override,编译无法通过。
 
继承TObject 试试,否则你要自己初始化好多东西!borland自己都还是用了汇编做一些初始工作 .我觉得最好继承 TPersistent
 
我有试过,结果还是一样的,在Delphi中,默认继承TObject
 
我测试了一下,没有问题呀! 你是不是有其他代码和你的TSaveData中的 AdoDataConn相连
你单步跟踪看看.
 
没有,全部代码如下:
unit SaveDataMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls,fsaveData;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
SaveData:TSaveData;

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var AdoDataConn: TADOConnection;
AdoInsert: TADOQuery;
begin
SaveData.Create;
end;

end.


unit fSaveData;

interface
uses
DB, ADODB, SysUtils, ComObj, Classes, Forms;
type
TSaveData = class (Tobject)
private
AdoDataConn: TADOConnection;
AdoInsert: TADOQuery;

public
procedure ini;
constructor Create ;
destructor Destroy; override;
end;

implementation
const

Db_name = 'data.mdb';
C_1 = 'create table data(from_name memo,from_full_name memo,To_name MEMO,To_full_name MEMO,item memo,created_date varchar(30) )';
I_1 = 'insert into data(from_name,from_full_name,To_name,To_full_name, item,created_date) '
+ ' values(:from_name,:from_full_name,:To_name,:To_full_name, :item,:created_date)';

procedure TSaveData.ini;
var AccessDB: OleVariant;
path, Connect_string: string;
begin
path := getCurrentDir;
Connect_string := ' Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
+ path+'/' + Db_name; //+ ';Persist Security Info=False ';
AdoDataConn:=TADOConnection.Create(application);
AdoInsert:=TADOQuery.Create(application);
if not fileexists(path + '/' + Db_name) then
try
AccessDB := CreateOleObject('ADOX.Catalog');
AccessDB.Create(Connect_string);
AdoDataConn.ConnectionString := Connect_string;
AdoInsert.Connection := AdoDataConn;
AdoInsert.SQL.Clear;
AdoInsert.SQL.Add(C_1);
AdoInsert.ExecSQL;
AdoInsert.Close;
AdoInsert.SQL.Clear;
AdoInsert.SQL.Add(I_1);
finally
AccessDB := VarNull;
end
else
begin
AdoDataConn.ConnectionString := Connect_string;
AdoInsert.Connection := AdoDataConn;
AdoInsert.Close;
AdoInsert.SQL.Clear;
AdoInsert.SQL.Add(I_1);
end;
end;

constructor TSaveData.Create;
begin
inherited ;
AdoDataConn:= TADOConnection.Create(application);
AdoInsert:= TADOQuery.Create(application);
ini;
end;

destructor TSaveData.Destroy;
begin
AdoDataConn.Connected := false;
AdoDataConn.Free;
AdoInsert.Free;
inherited Destroy;
end;


end.
 
呵呵,我估计楼主是这样调用TSaveData.Create的:

var
FSaveData: TSaveData;
begin
FSaveData.Create;///这里会出错哦!
//换成下面的: FSaveData := TSaveData.Create;
//.....
end;
 
AdoDataConn:= TADOConnection.Create(nil);
AdoInsert:= TADOQuery.Create(nil);
 
to xiammy
被你说对了
 
楼主太弱智了,无语中...
 
后退
顶部