关于动态创建窗体的问题,希望高手指点。(100分)

  • 主题发起人 主题发起人 5i1zhou
  • 开始时间 开始时间
5

5i1zhou

Unregistered / Unconfirmed
GUEST, unregistred user!
//---
我动态创建了窗体Form2,又在窗体Form2中动态创建了窗体Form3,然而在Form3中怎样调用Form2中的数据?
//我的测试程序,总是报错。
创建Form1,Form2,Form3.然后把Form2,Form3改成不自动创建。
然后在Form1中有:
var
Form2: TForm2;
begin
try
Form2:=TForm2.Create(self);
Form2.ShowModal ;
finally
Form2.Free;
end;
在Form2中有:
procedure TForm2.Button1Click(Sender: TObject);
var
Form3:TForm3;
begin
mm:='小雪';//全局变量;
try
Form3:=TForm3.Create(self);
Form3.Edit1.Text :='zhang';
Form3.ShowModal ;
finally
Form3.Free ;
end;
end;
//=======================================
在Form3中有:
procedure TForm3.Button1Click(Sender: TObject);
begin
ShowMessage(Form2.mm);//Error
end;
 
mm不属于 form2的成员变量,而属于 tform2所在的unit,比如为unit2,
则ShowMessage(Unit2.mm);
 
mm是全局变量,不是form2的成员变量
直接showmessage(mm)就行了
 
虽然xeen说得好像很精脾,可是Unit2.mm跟本通不过。更别说ShowMessage(mm)了。
注(这里mm是TFrom2的Public变量。)
还请高手指点
 
unit Unit3;

interface

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

type
TForm3 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;

implementation

uses Unit2;//注意这句

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
ShowMessage(mm);//改成这样
end;

end.
 
unit Unit2;

interface

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

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

var
Form2: TForm2;
mm:string; //将全局变量放在此处

implementation

uses Unit3;

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
Form3:TForm3;
begin
mm:='小雪';//全局变量;
try
Form3:=TForm3.Create(self);
Form3.Edit1.Text :='zhang';
Form3.ShowModal ;
finally
Form3.Free ;
end;
end;

end.
 
注意看看在implementation后有没有uses Unit2语句,若没有请增加;
如果变量在form2中设置和使用正常,那么就可以;

进入程序设计,打开form2和form2窗口,在form3的create事件中写代码:
form2.show;按F9,如未曾引用过会提示是否引用?点是,再将该语句
删除,变量应可以正常使用了;
 
var
Form2: TForm2;
Form3: TForm3;
将上面语句放在 implementation 后面。
去掉相应的局部变量 form2 form3
 
你的mm是不是放在Public里的就必须
在uses 加上form2
 
请大家试一试,包括自己的说法。
我的问题只有在动态创建的窗体中才会出现。。
如不动态动行一切OK。
我的软件是动态创建Form2,在Form2中有SQL查寻出来的数据。。在Form2中动态创建Form3在Form3中引用
Form2中的数据。。。
但是我发现就算是一个小小的变量值的引用也会出错。。
请高手关注。。。。。。。。。。。。。。。。。。。。。。。。。。
 
to 5i1zhou:
我贴出的代码是在我的电脑上实现过的,你为什么不试一试呢?
 
只有在uses unit3 便可以引用 Form3

///|///
// - - //
( @ @ )
+---------------------oOOoo-(?)ooOOo---------------------+
| |
| 来拿分来了 |
| E-MAIL: you@xu.com.cn |
| OICQ : 4529818 |
| URL : http://www.yousoft.net/ |
| Ooooo 徐长友 2000.04.01 |
+-----------------------ooooO--( )---------------------+
( ) )|/
/|( (_/
/_)
 
micro73,你的程序没有问题。可是有的要求是。在Form3中调用Form2中的数据。
如有一Edit1.Text:='123';那么在Form3中怎样调用?
(不要告我在Form2中用mm:=Edit1.Text;因为我的程序中,在Form3中需调用Form2中
好多查询出来的数据啊。。。)
请多多指教。。
请大家关注。。。。。。。。。。。。。。。。。。。
 
这个问题我是无意中遇到的,虽然我用其它方法实现了我的程序。。
但这个问题,我使终不太明白,望高手指点。。
 
Unit3.mm:=Unit2.edit1.text;
不就可以了吗?
 
这个问题目有这么麻烦吗,只怕是你自己都没有试吧,要不没现由的呀,我一直都是用动态创建的
就是没有像你所说的情况出现呀
你贴出你的全部源码,让大家看一下吧
 
to 5i1zhou:
我不知道你的真正用意,如果是单纯为了实现你的要求,那么我贴出的代码就可以实现。
procedure TForm2.Button1Click(Sender: TObject);
var
Form3:TForm3;
begin
mm:='小雪';//全局变量;
try
Form3:=TForm3.Create(self);
//Form3.Edit1.Text :='zhang';
Form3.Edit1.Text:=Edit1.Text;//将上面那句改成这句,然后直接在Form3中调用Edit1就行了。
Form3.ShowModal ;
finally
Form3.Free ;
end;
end;
 
micro73,
Form3.Edit1.Text:=Edit1.Text;//这样没有错,可是为什么在Form3中直接调用会出
错呢(如showMessage(Form3.Edit1.Text)。。不是动态创建的窗体没有事情。。。
我的情况是这样的:
在动态创建的Form2中。有 ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
在Form3中有Edit1.Text:=ADOQuery1.FieldByName('M_Name').AsString ;
//Error;
最后我只有在Form3中加了ADOQuery1: TADOQuery;
在Form2中添加:
try
Form3:=TForm3.Create(self);
Form3.mm:=Edit1.Text ;
Form3.ADOQuery1:=ADOQuery1;//
Form3.ShowModal ;
finally
Form3.Free ;
end;
//===================================================
我想知道的是为什么不能在新得到的窗体中直接调用或者修改Form2中的数据。
如在Form3中有:
ShowMessage(ADOQuery1.FieldByName('M_Name').AsString) ;
 
to 5i1zhou:
>>Form3.Edit1.Text:=Edit1.Text;//这样没有错,可是为什么在Form3中直接调用会出
错呢(如showMessage(Form3.Edit1.Text)。。不是动态创建的窗体没有事情。。。
具体的原因我也不是很清楚,不过我的看法是:你的方法所建立的窗体是局部的,也就
是说Form2是Form3的父窗体,它们之间是存在堆栈关系的,我们不能调用栈中或栈底的内容。
以下改进的方法可以完全达到你的要求(已经在我的电脑上测试通过):

procedure TForm1.Button1Click(Sender: TObject);
//var
// Form2: TForm2;
begin
try
Application.CreateForm(TForm2, Form2);
//Form2:=TForm2.Create(self);
Form2.ShowModal ;
finally
Form2.Free;
end;
end;

procedure TForm2.Button1Click(Sender: TObject);
//var
// Form3:TForm3;
begin
mm:='小雪';//全局变量;
try
Application.CreateForm(TForm3, Form3);
//Form3:=TForm3.Create(self);
Form3.Edit1.Text :='zhang';
Form3.ShowModal;
finally
Form3.Free ;
end;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
//ShowMessage(mm);//改成这样
Form2.Edit1.Text:='哈哈,终于成功了';
showmessage(Form2.Edit1.Text);
end;
 
to 51lzhou:
针对你的问题,按你的说的我试了一下。
你的错误就是不要进行声明
var Form2:TForm2;
var Form3:TForm3;
因为你这样一声明之后,按作用域来说是取小的那一个。故而你的全局变量为
Form2,Form3的两个变量就没有初始化。在编译的过程中没有报警说你这两个变量可能
未初始化吗?
你在Form3中引用的那个Form2.mm就是一个未初始化窗体的公共成员。所以出现错误。
而你给定mm的值在你的局部变量Form2中。解决的方法很简单只要去掉那两句声明就行。
因为全局变量只要uses了那个单元就可以用了。好了OK!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
714
import
I
后退
顶部