datamodule创建问题 为什么其他form都可以用FORM:=TForm.create(nil)创建,而datamodule用这种方法创建时,提示内存错误,必须使用Application.CreateForm(TDtmdl, Dtmdl)方式创建。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TForm可以有多个实例。Tdatamodule只能有一个实例。因Tdatamodule里东西都是全局共享的。只需一个实例就够了。 DataModule2 :=TDataModule2.Create(nil); DataModule2 :=TDataModule2.Create(nil);测试一下发现没啥问题哎。DataModule可以建多个实例,我以为因为DataModule是共享的,所以控制了呵 我的dm里定义了些变量,会不会是这个引起呢?interfaceuses SysUtils, Classes, DB, ADODB,forms,messages,windows;type TDtmdl = class(TDataModule) con1: TADOConnection; qQryLogin: TADOQuery; procedure DataModuleCreate(Sender: TObject); private { Private declarations } FLoginedUserID:integer; FLoginedUserCode:string; FLoginedUserName:String; FLoginedEmployeeID:integer; FloginedEmployeeCode:String; FDatabaseServer:string; FDatabaseName:String; FUserID:String; FPassWord:String; public { Public declarations } property LoginedUserID:integer read FLoginedUserID write FLoginedUserID; property LoginedUserCode:string read FLoginedUserCode write FLoginedUserCode; property LoginedUserName:string read FLoginedUserName write FLoginedUserName; property LoginedEmployeeID:integer read FLoginedEmployeeID write FLoginedEmployeeID; property LoginedEmployeeCode:string read FloginedEmployeeCode write FloginedEmployeeCode; property DatabaseServer:string read FDatabaseServer write FDatabaseServer; property DatabaseName:string read FDatabaseName write FDatabaseName; property UserID:string read FUserID write FUserID; property PassWord:string read FPassWord write FPassWord; end; 这里没问题,提示内存错误一般是使用了未实例化的对象比如 var sl:stringlist;sl.text := ''; 下面是我整个的unit,好像没有未实例化的东东吧。unit UDtmdl;interfaceuses SysUtils, Classes, DB, ADODB,forms,messages,windows;type TDtmdl = class(TDataModule) con1: TADOConnection; qQryLogin: TADOQuery; procedure DataModuleCreate(Sender: TObject); private { Private declarations } FLoginedUserID:integer; FLoginedUserCode:string; FLoginedUserName:String; FLoginedEmployeeID:integer; FloginedEmployeeCode:String; FDatabaseServer:string; FDatabaseName:String; FUserID:String; FPassWord:String; public { Public declarations } property LoginedUserID:integer read FLoginedUserID write FLoginedUserID; property LoginedUserCode:string read FLoginedUserCode write FLoginedUserCode; property LoginedUserName:string read FLoginedUserName write FLoginedUserName; property LoginedEmployeeID:integer read FLoginedEmployeeID write FLoginedEmployeeID; property LoginedEmployeeCode:string read FloginedEmployeeCode write FloginedEmployeeCode; property DatabaseServer:string read FDatabaseServer write FDatabaseServer; property DatabaseName:string read FDatabaseName write FDatabaseName; property UserID:string read FUserID write FUserID; property PassWord:string read FPassWord write FPassWord; end;var Dtmdl: TDtmdl;implementation uses UPublic;{$R *.dfm}procedure TDtmdl.DataModuleCreate(Sender: TObject);begin try Dtmdl.DatabaseName:=readinfoini('SystemDB.ini','LinkDB','DatabaseName','hrdb'); Dtmdl.UserID:=readinfoini('SystemDB.ini','LinkDB','UserID','sa'); dtmdl.PassWord:=readinfoini('SystemDB.ini','LinkDB','PassWord','ooooo'); dtmdl.DatabaseServer:=readinfoini('SystemDB.ini','LinkDB','Server','127.0.0.1'); if Con1.Connected=true then Con1.Connected:=false; Con1.connectionString:='Provider=SQLOLEDB.1;Password='+GetPassStr(dtmdl.PassWord)+';Persist Security Info=True;User ID='+Dtmdl.UserID+';Initial Catalog='+Dtmdl.DatabaseName+';Data Source='+dtmdl.DatabaseServer+';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=A;Use Encryption for Data=False;Tag with column collation when possible=False ' ; Con1.Connected:=true; except on e:exception do begin application.MessageBox(pchar(e.Message),'提示',mb_ok+mb_iconinformation); application.Terminate; end; end;end;end. Dtmdl:=TDtmdl.create(Application)应该不会报错吧 估计你是Dtmdl没有对这个变量赋值用楼上方法可行,但类内调用自己建议用Self。 使用Dtmdl:=TDtmdl.create(Application)是没有错的,因为控件原因,要使用Dtmdl:=TDtmdl.create(nil)创建;所以不知错的哪里,头痛啊! 绘图曲线时间控制 未指定的错误,不能选择任何控件 Bitbtn 导入的图片问题 实现两张BMP切换(求助) 如何更好地设置启动画面 INDY的IdUDPServer长时间运行后不能接收到数据 两个小问题 怎样建立索引才算合理?或怎样改善查询速度。 请大家讨论一下 delphi的发展前途问题 问两个问题,非高手末入! 自定义文本数据库如何在dbgrid构件中显示? WIN7收不到UDP广播 delphi grid 报表求救
DataModule2 :=TDataModule2.Create(nil);
测试一下发现没啥问题哎。DataModule可以建多个实例,我以为因为DataModule是共享的,所以控制了呵
interfaceuses
SysUtils, Classes, DB, ADODB,forms,messages,windows;
type
TDtmdl = class(TDataModule)
con1: TADOConnection;
qQryLogin: TADOQuery;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
FLoginedUserID:integer;
FLoginedUserCode:string;
FLoginedUserName:String;
FLoginedEmployeeID:integer;
FloginedEmployeeCode:String;
FDatabaseServer:string;
FDatabaseName:String;
FUserID:String;
FPassWord:String;
public
{ Public declarations }
property LoginedUserID:integer read FLoginedUserID write FLoginedUserID;
property LoginedUserCode:string read FLoginedUserCode write FLoginedUserCode;
property LoginedUserName:string read FLoginedUserName write FLoginedUserName;
property LoginedEmployeeID:integer read FLoginedEmployeeID write FLoginedEmployeeID;
property LoginedEmployeeCode:string read FloginedEmployeeCode write FloginedEmployeeCode;
property DatabaseServer:string read FDatabaseServer write FDatabaseServer;
property DatabaseName:string read FDatabaseName write FDatabaseName;
property UserID:string read FUserID write FUserID;
property PassWord:string read FPassWord write FPassWord; end;
比如 var sl:stringlist;
sl.text := '';
unit UDtmdl;interfaceuses
SysUtils, Classes, DB, ADODB,forms,messages,windows;
type
TDtmdl = class(TDataModule)
con1: TADOConnection;
qQryLogin: TADOQuery;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
FLoginedUserID:integer;
FLoginedUserCode:string;
FLoginedUserName:String;
FLoginedEmployeeID:integer;
FloginedEmployeeCode:String;
FDatabaseServer:string;
FDatabaseName:String;
FUserID:String;
FPassWord:String;
public
{ Public declarations }
property LoginedUserID:integer read FLoginedUserID write FLoginedUserID;
property LoginedUserCode:string read FLoginedUserCode write FLoginedUserCode;
property LoginedUserName:string read FLoginedUserName write FLoginedUserName;
property LoginedEmployeeID:integer read FLoginedEmployeeID write FLoginedEmployeeID;
property LoginedEmployeeCode:string read FloginedEmployeeCode write FloginedEmployeeCode;
property DatabaseServer:string read FDatabaseServer write FDatabaseServer;
property DatabaseName:string read FDatabaseName write FDatabaseName;
property UserID:string read FUserID write FUserID;
property PassWord:string read FPassWord write FPassWord; end;var
Dtmdl: TDtmdl;
implementation
uses UPublic;
{$R *.dfm}procedure TDtmdl.DataModuleCreate(Sender: TObject);
begin
try
Dtmdl.DatabaseName:=readinfoini('SystemDB.ini','LinkDB','DatabaseName','hrdb');
Dtmdl.UserID:=readinfoini('SystemDB.ini','LinkDB','UserID','sa');
dtmdl.PassWord:=readinfoini('SystemDB.ini','LinkDB','PassWord','ooooo');
dtmdl.DatabaseServer:=readinfoini('SystemDB.ini','LinkDB','Server','127.0.0.1');
if Con1.Connected=true then Con1.Connected:=false;
Con1.connectionString:='Provider=SQLOLEDB.1;Password='+GetPassStr(dtmdl.PassWord)+';Persist Security Info=True;User ID='+Dtmdl.UserID+';Initial Catalog='+Dtmdl.DatabaseName+';Data Source='+dtmdl.DatabaseServer+';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=A;Use Encryption for Data=False;Tag with column collation when possible=False ' ;
Con1.Connected:=true;
except
on e:exception do
begin
application.MessageBox(pchar(e.Message),'提示',mb_ok+mb_iconinformation);
application.Terminate;
end;
end;
end;end.