抽了N多的烟还是解决不了这个问题.一个关于动态建立数据模块并且要连接ACCESS数据库的问题.我把所有的分都投入到这个问题上,如果谁解决了,日后可以再开帖子送分

  • 主题发起人 主题发起人 hygsxy
  • 开始时间 开始时间
H

hygsxy

Unregistered / Unconfirmed
GUEST, unregistred user!
抽了N多的烟还是解决不了这个问题.一个关于动态建立数据模块并且要连接ACCESS数据库的问题.我把所有的分都投入到这个问题上,如果谁解决了,日后可以再开帖子送分.很急,高手快来啊.(24分)<br />我的用意是:在Application.create(Tform1,form1)建立之前,出现一个登陆窗口,根据用户名和密码判断后续启动.拥护名和密码建立在ACCESS数据库.为了要连接该数据库,我在动态建立的登陆窗口的CREATE事件中写了如下代码:
procedure Tdenglu.formcreate()..//从权限密码表中读出'登陆用户名'字段放入组合框.
var i:integer;
mydatamoduleado:Tdatamoduleado;
begin
try//建立一个动态的数据模块mydatamoduleado
mydatamoduleado:=Tdatamoduleado.create(nil);//就是这出错,但又看不出来..
//下面的代码是连接一个没有密码的ACCESS数据库tushudatabase.mdb
mydatamoduleado.adoconnection.connectionstring:=
'provider=microsoft.jet.oledb.4.0;data source='+
extractfilepath(paramstr (0)) +'tushudatabase.mdb'+
';jet oledb:database password=' +';persist secutity false';
mydatamoduleado.adoquery1.connection:=mydatamoduleado.adoconnection1;
with mydatamoduleado.adoquery1 do//把登陆用户名放入yonghuming列表框
begin
sql.clear;
sql.add('select 登陆用户名' from 权限密码表);
execsql;
first;
for i:=0 to recordcount-1 do
begin
yonghuming.items.add(fieldbyname('登陆用户名').asstring);
next;
end;
end;
close;
end;
finally
mydatamoduleado.free;//释放动态建立的数据模块实例.
end;
end;
end;
出错提示"尚未调用coinitialize,mydatamoduleado might not have been initialized,
调试了几个小时,抽了N多的烟还是没进展.急啊..........................


 
需要说明的是:数据模块窗体上已经放置了adoquery,和adoconnection两个组件.
 
form1是你的主窗体吧,
把事件写在Application.create(Tform1,form1)之后
你说的不清楚,把你dpr的代码都帖上来。
 
数据模块怎么动态建立.这样可以么/
mydatamoduleado:=Tdatamoduleado.create(nil);//
 
没人知道么,急啊,等.................................................
 
怎么还没解决呢.这个问题应该不会这么难吧.

 
我觉得你完全可以不必要动态创建一个数据模块,在你的登陆窗体中动态创建一个adoconnection和一个adoquery不就可以了吗用完后再释放啊,一种方法不行可以用另外一个方法啊,不是说不能为了一个树而失去整个森林么.
 
楼上说的不错。我没试过动态数据模块,但是用动态生成ado相关控件是
简单的。
 
另:你抽的烟档次能否再高一些,低档烟不解决问题的。
 
mydatamoduleado:=Tdatamoduleado.create(nil);//就是这出错,但又看不出来..
------------------------
问题似乎在Tdatamoduleado 中,看看 Tdatamoduleado 所在单元的控件设置 等等。
 
把Tdatamoduleado单元uses的(而登陆窗口没有)内容全加到登陆窗口的uses看看
 
Application.Initialize;
Application.CreateForm(TDM1, DM1);//我不用动态添加.
dm1.MYPWD.ConnectionString:=数据库连接
Linkform:=TLinkForm.Create(Application);//启动前的画面
LinkForm.Label1.Caption:='数据库连接中................';
LinkForm.Show;
LinkForm.Update;
sleep(600);
try
begin
dm1.MYPWD.Connected:=true;
conn:=true;
end;
except
conn:=false;
LinkForm.Label1.Caption:='数据库连接失败,请与程序设计员联系!';
LinkForm.Update;
Sleep(1000);
LinkForm.Free;
end;
if conn then//如果连接成功
begin
LinkForm.Free;
LoginForm:=TLoginForm.Create(Application);//登陆窗口出现
LoginForm.ShowModal;
LoginForm.Update;
Application.CreateForm(TMainForm, MainForm);//主窗口运行.登陆成功的话.
LoginForm.Free;
Application.Run;
end
else
begin
Application.Terminate;
 
------------&gt;孤独剑客,
是啊,我也是这样想的,实在不行,我就只动态建立adoquery,adoconnection.
 
Application.CreateForm(Tmydatamoduleado, mydatamoduleado);
试试
 
这个问题可以到我网站上去看,
上面有关于数据库连接的源程序。
网址如下:
http://BetterMicrosoft.icpcn.com
 
Application.CreateForm(Tmydatamoduleado, mydatamoduleado);
试试
--------------------------------------------------------------------
错误一样.
 
我仿照test如下:
一切正常:
program Project1;

uses
Forms,
Controls,
Unit1 in 'Unit1.pas' {denglu},
Unit2 in 'Unit2.pas' {datamoduleado: TDataModule},
Unit3 in 'Unit3.pas' {Form3};

{$R *.res}

begin
Application.Initialize;
denglu:=Tdenglu.Create(Application);
if denglu.ShowModal=mrok then
begin
Application.CreateForm(TForm3, Form3);
Application.Run;
end
else begin
Application.Terminate;
end;
end.

------------------------------------
procedure Tdenglu.FormCreate(Sender: TObject);
var
i:integer;
mydatamoduleado:Tdatamoduleado;
begin
try
mydatamoduleado:=Tdatamoduleado.create(nil);
////下面的代码是连接一个没有密码的ACCESS数据库tushudatabase.mdb
mydatamoduleado.adoconnection.connectionstring:=
'provider=microsoft.jet.oledb.4.0;data source='+
extractfilepath(paramstr (0)) +'tushudatabase.mdb'+
';jet oledb:database password=' +';persist secutity false';
mydatamoduleado.adoquery1.connection:=mydatamoduleado.adoconnection1;
with mydatamoduleado.adoquery1 do//把登陆用户名放入yonghuming列表框
begin
sql.clear;
sql.add('select 登陆用户名' from 权限密码表);
execsql;
first;
for i:=0 to recordcount-1 do
begin
yonghuming.items.add(fieldbyname('登陆用户名').asstring);
next;
end;
end;
close;
end;
finally
mydatamoduleado.free;//释放动态建立的数据模块实例.
end;
end;



procedure Tdenglu.Button1Click(Sender: TObject);
begin
self.ModalResult:=mrok;
end;

------------------------
 
那我错在那啊.
 
我如果不用动态建立数据模块.我只动态建立adoquery,adoconnection,错误依旧,错误的提示依旧.
现在把我的完整代码显示如下,我今天处理了一天都没解决.
program Project1;

uses
windows,
Forms,
dialogs,
SysUtils,
Unit1 in 'Unit1.pas' {mainForm},
Unit2 in 'Unit2.pas' {JingGao},
Unit3 in 'Unit3.pas' {guanyu},
Unit4 in 'Unit4.pas' {denglu},
Unit5 in 'Unit5.pas' {XinShuRuKu},
Unit6 in 'Unit6.pas' {TuShuGuanLi},
Unit7 in 'Unit7.pas' {DuZheGuanLi},
Unit8 in 'Unit8.pas' {JieHuanGuanLi},
Unit9 in 'Unit9.pas' {QuanXianGuanLi},
Unit10 in 'Unit10.pas' {YiJieTuShu},
Unit11 in 'Unit11.pas' {XinXiChaXun},
Unit12 in 'Unit12.pas' {TuShuChaXun},
Unit13 in 'Unit13.pas' {DuZheChaXun},
Unit14 in 'Unit14.pas' {JieYueChaXun},
Unit15 in 'Unit15.pas' {RiZhiGuanLi},
Unit16 in 'Unit16.pas' {XuanXiangSheZhi},
Unit17 in 'Unit17.pas' {BeiFenHuanYuan},
Unit18 in 'Unit18.pas' {FuFeiZhuCe},
Unit19 in 'Unit19.pas' {muluxuanze},
Unit20 in 'Unit20.pas' {huanyuanxuanze},
Unit21 in 'Unit21.pas' {DataModuleado: TDataModule};

{$R *.res}
var
mymutex:Thandle;
jinggao:Tjinggao;
denglu:Tdenglu;
begin
denglu:=Tdenglu.create(nil);//动态创建实例 - &gt;进而触发CREATE事件
denglu.ShowModal;
//showmessage('ok'); //测试用
Jinggao:=nil;
mymutex:=createmutex(nil,false,'mymutex');
If waitforsingleobject(mymutex,0)&lt;&gt;wait_timeout then //只能运行一个实例
begin
Application.Initialize;
Application.Title := '图书管理系统V1.0';
Application.CreateForm(TmainForm, mainForm);
Application.CreateForm(TDataModuleado, DataModuleado);
Application.CreateForm(Tguanyu, guanyu);
Application.CreateForm(TXinShuRuKu, XinShuRuKu);
Application.CreateForm(TTuShuGuanLi, TuShuGuanLi);
Application.CreateForm(TDuZheGuanLi, DuZheGuanLi);
Application.CreateForm(TJieHuanGuanLi, JieHuanGuanLi);
Application.CreateForm(TQuanXianGuanLi, QuanXianGuanLi);
Application.CreateForm(TYiJieTuShu, YiJieTuShu);
Application.CreateForm(TXinXiChaXun, XinXiChaXun);
Application.CreateForm(TTuShuChaXun, TuShuChaXun);
Application.CreateForm(TDuZheChaXun, DuZheChaXun);
Application.CreateForm(TJieYueChaXun, JieYueChaXun);
Application.CreateForm(TRiZhiGuanLi, RiZhiGuanLi);
Application.CreateForm(TXuanXiangSheZhi, XuanXiangSheZhi);
Application.CreateForm(TBeiFenHuanYuan, BeiFenHuanYuan);
Application.CreateForm(TFuFeiZhuCe, FuFeiZhuCe);
Application.CreateForm(Tmuluxuanze, muluxuanze);
Application.CreateForm(Thuanyuanxuanze, huanyuanxuanze);
Application.Run;
end
else
begin
try
jinggao:=Tjinggao.create(application);
jinggao.Showmodal;
finally
jinggao.Free;
//application.MessageBox('图书管理系统已经运行!!!!','警告!'mb_ok,);
end;
application.Terminate;
end;
end.

---------------------------------------------------------------------------------------

http://www.efile.com.cn/efile/hygsxysxyhyg/%BD%D8%CD%BC.JPG

unit Unit4;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons, TFlatSpeedButtonUnit,shellapi,
TFlatButtonUnit, TFlatEditUnit, TFlatComboBoxUnit;

type
Tdenglu = class(TForm)
Bevel1: TBevel;
Label1: TLabel;
Label2: TLabel;
Image1: TImage;
Label3: TLabel;
Label4: TLabel;
Bevel2: TBevel;
denglu: TFlatSpeedButton;
FlatSpeedButton2: TFlatSpeedButton;
xiexin: TFlatSpeedButton;
yonghuming: TFlatComboBox;
kouling: TFlatEdit;
procedure FlatSpeedButton4Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FlatSpeedButton2Click(Sender: TObject);
procedure dengluClick(Sender: TObject);
procedure xiexinClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
denglu: Tdenglu;

implementation

uses Unit18, Unit21,adodb;

{$R *.dfm}

procedure Tdenglu.FlatSpeedButton4Click(Sender: TObject);
begin
denglu.Show;
end;

procedure Tdenglu.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//application.Terminate;
end;

procedure Tdenglu.FlatSpeedButton2Click(Sender: TObject);
begin
//application.Terminate;
end;

procedure Tdenglu.dengluClick(Sender: TObject);
begin
;//从权限表判断用户名和密码是否正确
end;

procedure Tdenglu.xiexinClick(Sender: TObject);
begin
shellexecute(handle,'open','mailto:hygks@163.com',nil,nil,sw_show);
end;

procedure Tdenglu.FormCreate(Sender: TObject);
var
i:integer;
adoquery1:Tadoquery;
adoconnection1:Tadoconnection;
begin
try
label1.Caption:=formatDateTime('yyyy"年"m"月"d"日"', Now)
+'('+formatdatetime('aaaa',date)+')';
//动态创建adoconnection,adoquery
adoconnection1:=Tadoconnection.create(nil);
adoconnection1.ConnectionString:=
'provider=microsoft.jet.oledb.4.0;data source='
+extractfilepath(paramstr(0))+'tushudatabase.mdb;'+'jet oledb:database password='
+';persist secutity info=false';
adoquery1:=Tadoquery.create(nil);
adoquery1.connection:=adoconnection1;
with adoquery1 do
begin
sql.clear;
sql.add('select 登陆用户名 from 权限密码表' );
open;
first;
for i:=0 to recordcount-1 do
begin
yonghuming.Items.Add(fieldbyname('登陆用户名').asstring);
next;
end;
close;
end;
finally
;
end;
end;
end.
 
program Project1;中
Application.Initialize;必须放在denglu:=Tdenglu.create(nil);前

看来就是这句有问题!
 
后退
顶部