窗口与DataModule之间的问题(好象窗口没有建立) (200分)

  • 主题发起人 主题发起人 youngyu
  • 开始时间 开始时间
Y

youngyu

Unregistered / Unconfirmed
GUEST, unregistred user!
在主程序中打开子窗口FormXS,并且打开DataModule窗口

if DataModuleXS=nil then
DataModuleXS:=TDataModuleXS.Create(application);

DataModuleXS.DataSourceGRID.DataSet:=DataModuleXS.ADOQueryXS;

if FormXS=nil then
FormXS:=TFormXS.Create(application);
FormXS.Width:=747;
FormXS.Height:=501;
InputMark:='XS';
FormXS.show;


在FormXS的FormCreate时,调用ADO,转到DataModuleXS,在DataModuleXS中,FormXS的组件或函数
都不能调用(比如:在DataModuleXS单元中,调用FormXS.Button1.Caption, 出现Access violation...
错误,好象FormXS窗口没有建立,但在FormXS.FormCreate已可以调用对象了,用SELF.Button1.Caption
可以),

但当FormCreate后,用BUTTON1点击调用ADO,就没有这个问题。

查了以前的贴子,找不到解决的方案。

200分送上。
 
不知道是问题太难,还是我表达能力太差。
请大家关注一下。
 
1.在formcreate时里面的控件已经建立好了,所以可以直接调用.
2.至于为什么在formcreate中调用datamodule中调用formxs出错,我也不明白,应该是可以,
你可以跟踪一下,此时formxs是否存在.
 
谢谢关注。已做跟踪。
次序是这样的:

FORMXS formcreate;
SHOWMESSAGE(SELF.Button1.Caption) 可以;
XYZ('') 调用子程序;
在XYZ子程序(因为有ADOQUERY)中用到转到DataModuleXS UNIT;
在DataModuleXS 中,SHOWMESSAGE(FORMXS.CAPTION)就出错(Access violation...);

但在全部窗口出现后, BUTTON1去调用XYZ('')就没有问题。



 
你跟踪到SHOWMESSAGE(FORMXS.CAPTION)时,看formxs的值是什么.
 
选择Project->View source
查看工程代码

program Project1;

uses
Forms,
main in 'main.pas' {frmMain},
fununit in 'FUNUNIT.PAS',
DM in 'DM.pas' {DM1: TDataModule};

{$R *.res}

begin
Application.Initialize;
Application.Title := '归侨证管理系统';
Application.CreateForm(TDM1, DM1);
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.

注意:Application.CreateForm(TDM1, DM1);要放到到主form前面创建// DM这里是DataMoudle 控件
Application.CreateForm(TfrmMain, frmMain); //主form
 
在窗体的Create事件结束之前,窗体变量应该=nil
所以在DataModule里访问窗体的实例会访问地址错误
解决方法一,在
if FormXS=nil then
FormXS:=TFormXS.Create(application);
后调用窗体中调用的 数据模块中 的方法
解决方法二,不知道行不行
在窗体的OnCreate事件代码中,调用数据模块方法之前加一句
inherited;
 
//但在全部窗口出现后, BUTTON1去调用XYZ('')就没有问题。
说明你还有其它窗口哦,XYZ('')中用的窗口,都要引用UNIT之后,在窗口实例产生后
才能正确调用;
 
ysai的方法有些道理但我使了一下,还是解决不了。
我再归纳一下,问题应该是:
在一个X窗口的OnCreate事件里调用另一个Y窗口,在Y窗口的UNIT中如何调用窗口X的属性。

有没有变通的解决办法。

如能给出满意回答再加100分。

 
变通方法,用函数实现,在数据模块中实现一个公开的函数,返回你要设置的值
如果要返回多个不同类型的值,可以定义一个结构,如果返回值中有对象,就声明
一个类返回,如果你不嫌麻烦的话:)
像我的方法,我的登录窗体要从数据库中取出用户名和密码信息,就在数据模块中加一个公开的函数
function TDMForm.GetRecordSet(SQLString:String):TADODataSet;
//根据SQL语句取得记录集
//返回一个TADODataSet的记录集指针,nil代表SQL语句错误
begin
try
result:=TADODataSet.Create(nil);
ADOCN.Errors.Clear;
ADOCM.CommandText := SQLString;
result.Recordset := ADOCM.Execute;
except
result:=nil;
end;
end;
返回一个记录集,想取什么取什么
 
在窗口实例产生后才能正确调用;
//在一个X窗口的OnCreate事件里调用另一个Y窗口,在Y窗口的UNIT中如何调用窗口X的属性。
这样子不行哦!OnCreate事件结束才算是实例;改成OnActivate,或消息等!
 
我真太笨了,还有一个OnActivate忘记了.
ysai,卡色,到另外的一个题中去提100分,各50
谢谢各位的关注。

 
后退
顶部