三个窗体,几行语句,但是就是有问题.(50分)

  • 主题发起人 主题发起人 少爷的拐杖
  • 开始时间 开始时间

少爷的拐杖

Unregistered / Unconfirmed
GUEST, unregistred user!
一共三个窗体,Form1,Form2,Form3.
Form1 uses了From2,并且ShowModal了Form2,
Form2 uses了From3,并且ShowModal了Form3,
Form3 同时uses了From2,并且在退出事件中修改form2上Edit1.text的值.
出现内存错误.
怎么样才能修改Form2上的Edit1的内容?
代码不超过6行,也会错的啊?

 
form2中设一PUBLIC参数,
FORM3退出时将值保存PUBLIC参数中,
EDIT1.TEXT=参数
 
注意变量引用一致。

如:ShowModal() 过程中,直接使用各个窗体的全局 Var,不要再局部定义。

如果实在怕麻烦,SendMessage()/PostMessage();
永远不会出错。
 
to:ddev
//注意变量引用一致。
//如:ShowModal() 过程中,直接使用各个窗体的全局 Var,不要再局部定义。
什么意思呀?D自己加上的Edit1的声明算不算全局变量?
令人奇怪的是,如果在Form3中修改Form2的Caption,程序不会出现内存错误,
但是并不执行修改的结果。但是只要修改Form2中控件的属性就——砰!出错了!

 
Form2 uses了From3,并且ShowModal了Form3,
Form3 同时uses了From2
我想可能就是这个出错了,这应该称为循环引用,循环引用的出现,说明程序中存在缺陷,
比较好的解决方法是,把form2和form3共有的代码放到第三单元中,如果你确实需要用到
循环引用,这时就必须把一个uses子句移到implementation部分,而把另外一个溜在
interface部分,这样就能解决问题。
 
to:启明星
声明已经放在不同的地方了,问题还是没有解决。这个问题很奇怪对不?
 
代码看看。
 
to:小猪.
代码简单的都不值得贴出来。
两个创建窗体的代码都是:
var
Form*:TForm*;
begin
Form*:=TForm*.Create(self);
form*.ShowModal;
end
//*号分别代表1、2

最后一个窗体的按钮里写的是:
Form2.Edit1.Text:='dafdsafsd';
就这么多。没别的代码了!
 
构造顺序问题!

故事的发生是这样的 -------------

在 Form2 的构造函数中直接 ShowModal() Form3 时。
实际上 Form2 本身的内部组件还没有初始化 -------- 可以从单步调试中看出。

所以, Form2 的 Caption 是可用的,因为 CreateWindow(Ex) 已经被执行。
但其他的(子)控件却是不可用的 ---------- 包括你的 Form2.Edit1.

所以,所以...
 
在 Form2.OnShow() 中处理 Form3 的 ShowModal() 就可以了。
 
你的FROM2,FORM3设成动态生成了吗?PROJECT——OPTION里。
所有动态生成的FROM,最后都要注意FREE掉,否则会内存泄漏的。
 
to:ddev
谢谢你的解答,你的回答是正确的。
用Show方法就没事了。
 
接受答案了.
 
后退
顶部