高分求助:我无法从一个窗体向另一窗体控件赋值,请帮忙!(100分)

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

chidao

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序中有一段是这样执行过程:主窗体的一个按钮事件用showmodal方式触发一个功能窗口,同时在这个窗口中也有一个按钮事件也用showmodal触发另一个窗口.在第三个窗体有一事件向其父窗体(第二个窗体)的某一控件赋值,这时候,系统立即报错:Access vilation at
address 004d7f13 in module 'wms.exe'. read of address 00000318.第二个窗体的控件没有得到值.程序赋值代码应当是没有错的.
我试着做了个测试,新建三个窗体form1,form2,form3.将form2和form3移至Available form3.再在form1中放置button1,form2中放置edit1,button1,form3中放置button1.
Unit1;
TForm1.button1click(sender:Tobject);
var
form2:Tform2;
begin
form2:=Tform2.create(application);
form2.showmodal;
form2.free;
end;
同样在unit2中:button1click事件:
TForm2.button1click(sender:Tobject);
var
form3:Tform2;
begin
form3:=Tform3.create(application);
form3.showmodal;
form3.free;
end;
在unit3中button1click的代码仅一句:
begin
form2.Edit1.text:='hello world';
end;
delphi7立即报类似上面的错误代码.Access vilation at address 004d8847 in module 'project1.exe'.
恳请诸位富翁帮助!我使用的是delphi7
 
在第三个窗体中uses第二个窗体,应该写在implementation下面的uses中,试试
 
unit3中引用unit2
file->use unit
 
if not Assigned(form2) then form2 := Tform2.Create(application);
form2.Show;
你的是内存错误,我想可能视窗体杯你撤销了,你吧你的代码改一下看看
 
var
form2:Tform2;
你在Unit1中将Form2定义成了局部变量
实际上并没有创建全局Form2变量
然后在Unit3中调用的Form2实际上是全局的Form2变量
解决办法:
将ButtonClick事件中的var局部变量定义去掉
 
你用了这句(已经释放掉了.)
form2.free;
在下面这句当然找不到了(地址出错.)
form2.Edit1.text:='hello world';
 
1. 把form2变成全局变量
TForm1.button1click(sender:Tobject);
var
form2:Tform2; //删除
begin

2.
TForm2.button1click(sender:Tobject);
var
form3:Tform2;//这里不大懂是什么意思
 
同意楼上的,如果你想在unit3中使用form2的组件,请不要在unit2中调用form2.free,这样的话form2已经被销毁。想想看,怎么能够调用已经被销毁对象的方法或属性呢?
 
To:WilliamGui,hanpengshan_00
在form3中引用了unit2,故不是这个原因.

 
楼主用的ShowModal方法,所以不是Free的问题
Form3: TForm2;这个应该是楼主发帖时的手误,否则编译是不会通过的
 
对不起,原题上的Unit2中
var form3:Tform2是刚才敲错了.程序中是 var form3:Tform3;

如果将form2改为系统启动时创建的话,程序能正常运行.我想用动态创建窗口,用完后能够释放掉.

To:ghc_x
我在unit2中并没有释放form2,而是在unit1中释放的,即form2不被关闭的话,应当是不会被释放的.

哪位能自己做一下试试!然后给出设计代码?
 
这是个全局变量和局部变量的问题,在你的unit2中的implementation上面有一个Form2变量,他是个全局的。
因为你将 将form2和form3移至Available 所以这个全局变量代表的窗体都没有被创建,你在程序中创建的Form2和Form3都是局部的变量,只不过这个局部的变量同全局的变量重名了,因为你在Unit3中引用了Unit2,所以你在unit3中用到的所有的Form2的变量都是那个没有被创建的局部变量,因此会出现上述的问题。
解决的方法有很多,建议你作如下的调整:
TForm1.button1click(sender:Tobject);
var
form2:Tform2;
begin
//form2:=Tform2.create(application);
form2:=Tform2.create(self);
form2.showmodal;
form2.free;
end;

TForm2.button1click(sender:Tobject);
var
form3:Tform2;
begin
form3:=Tform3.create(application);
form3:=Tform3.create(self);
form3.showmodal;
form3.free;
end;

然后在Unit3中,要访问Form2的内容的时候这样写
begin
//form2.Edit1.text:='hello world';
if (Self.Owner is TForm2) then
TForm2(Self.Owner).Edit1.text:='hello world';
end;

 
楼主你自己到底试没试啊?
我给出的答案都是我自己测试通过后才发的啊
 
问题解决,现在分配分数
 

Similar threads

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