没有窗体的单元中,如何使用ADOQuery控件?使得其他窗体调用(100分)

  • 主题发起人 主题发起人 cowbird
  • 开始时间 开始时间
C

cowbird

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Unit1窗体中调用单元Unit2中的过程:Unit2.UseADOQuery,
会报错误:'Access violation at address 00481CEC in module 'project1.exe'. Read of address FFFFFFF.
为何?
是不是需要加ADOQuery1:=TADOQuery.create(self) ?
有人是否可以提供在没有窗体的单元中使用ADOQuery控件的程序代码

单元unit2的代码:
unit Unit2;

interface

uses

ADODB,StdCtrls;

ADOQuery1:TADOQuery;
procedure UseADOQuery;

implementation

users Unit1;

procedure UseADOQuery;
begin
// ADOQuery1.connection:=form1.ADOConnection1;
ADOQuery1.SQL.Clear;
end;

end.

 
在你的unit2中已经定义了adoquery1,应该不用再创建了。
不过,一般情况下,象你这样的情况,我会将unit2换为data module,其中放上一些其它
unit可共用的数据库控件。在其它的unit中uses data module,然后在使用时加上data
module的名称作为前缀就可以了。
 
你看看在运行unit1的时候unit2是否创建或运行,如果没有就肯定会出错。
 
procedure UseADOQuery;
begin
ADOQuery1 := TADOQuery.Create;
try
// ADOQuery1.connection:=form1.ADOConnection1;
ADOQuery1.SQL.Clear;
finally
ADOQuery1.Free;
end;
end;

 
同意楼上!一般都把数据库的控件放到datamodule中,这样比较清楚,调用也方便。
 
对,自己创建就可以了,用完free
 
其实可以动态创建,也可以放到数据模块
 
回答Shd消息
procedure UseADOQuery;
begin
ADOQuery1 := TADOQuery.Create;
try
ADOQuery1.SQL.Clear;
finally
ADOQuery1.Free;
end;
end;
其中ADOQuery1 := TADOQuery.Create参数不足,我使用self结果不可以,我估计问题也是这里,有了Create应该可以了

回答armyjiang,phyvon消息:
思路我同意,data module是什么东东?有窗体的单元么?其中放数据库控件?可以没有窗体么,可以给我代码参考么?
 
在工程中new unit时有一选择就是data module,设计时有个“窗体”可以将控件拖入,
但在运行时是没有显示窗体的。
我通常是将公用的数据库控件放在data module,还有全局变量。
在应用程序运行时我只自动创建两个模块:主form和data module,在data module中完成一
系列软件初始化工作,如果出错,则不再运行程序。其它的form在需要时才动态创建,使用
结束后及时free掉。
具体的代码没有什么意义的,下面的内容只是我一个工程的前面部分。
unit ShareUnit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, IniFiles, FileCtrl, Psock, NMsmtp;

type
TDMShare = class(TDataModule)
dbReceipt: TDatabase;
tabReceipt: TTable;
tabYonghYX: TTable;
NMSMTPReceipt: TNMSMTP;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
procedure GetDataBaseSetup;
procedure GetDefaultVal;
public
{ Public declarations }
sFromAddress, sFromName, sSubject : String;
sMailServer, sSMTPPort : String;
sInterval, sLogFile : String;
function GetIniString(Section : String; Variable : String; DefaultVal : String) : String;
procedure SetIniVal(Section : String; Variable : String; Value : String);
procedure WriteLog(sFileName : String; sVal : String);
procedure ConnectMailServer;
function MonthDesOne(dateStr:string):string; //减去一个月
end;
 
datamodule使用的确很方便,
只是如果我手工创建unit,调用过程UseADOQuery却要报错,怎么办,怎么create

var
ADOQuery1:TADOQuery;

procedure UseADOQuery;
begin
ADOQuery1 := TADOQuery.Create;
ADOQuery1.SQL.Clear;
end;
其中ADOQuery1 := TADOQuery.Create参数不足,我使用self结果不可以,
 
同意 DataModule
 
procedure TForm1.Button1Click(Sender: TObject);
var
adoquery2 : Tadoquery;
begin
adoquery2 := TAdoQuery.Create(Self);
with adoquery2 do
begin
ConnectionString := 'Provider=MSDAORA.1;Password=dianzsb_new;User ID=dianzsb_new;Data Source=nt;Persist Security Info=True';
SQL.Text := 'select * from dz_bb';
Open;
end;
DataSource1.DataSet := AdoQuery2;
ShowMessage('you are welcome');
AdoQuery2.Free;
// AdoQuery1.SQL.Text := 'select * from dz_bb';
// AdoQuery1.Open;
// 上面两行使用的是一个全局的adoquery,其connectionstring与上面的内容相同。
// 使用adoquery1和adoquery2可得到相同的结果。
end;

你说你使用self不可以,有什么错误吗?
 
ADOQuery1 := TADOQuery.Create(nil)

Self 和 parent的区别,你自己去看一下。
你只是一个单元(UNIT),没有FROM。所以你没有SELF。
如果在一个普通的窗体里,
TForm1 = class(TForm)
private
procedure Test;
end;
var
from1: TForm1
procdure TForm1.Test
begin
你用到了Self
这个Self指的是TForm1类的实例(FROM1)
end

不是一句两句说的完的。
请你了解一下面向对象编程。我估计你刚毕业、用DELPHI编程不超过5000行。继续努力了。
不是说知道怎样画窗体、仍控件,就了解面向对象编程的方法了
 
这是我不含窗体的单元unit2代码
unit Unit2;

interface

uses

ADODB,StdCtrls;

procedure UseADOQuery;

var
ADOQuery1:TADOQuery;

implementation

uses Unit3;

procedure UseADOQuery;
begin
ADOQuery1:=TADOQuery.Create(self);
ADOQuery1.SQL.Clear;
end;
end.

这是Unit1中的代码,调用Unit2中的UseADOQuery,结果报错,
procedure TForm1.Button2Click(Sender: TObject);
begin
Unit2.UseADOQuery;
end;

我就不知道ADOQUery.create怎么写,是不是声明有问题?
 
>>>我就不知道ADOQUery.create怎么写,是不是声明有问题?
改成:
ADOQuery1 := TADOQuery.Create(nil)
 
搞定,谢谢各位
 
后退
顶部