创建窗体(100分)

  • 主题发起人 主题发起人 心飞雪
  • 开始时间 开始时间

心飞雪

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在创建窗体A的时候,先给A窗体标题名称赋值,如原来a.caption='123';我在窗体B调用时如下代码:
var
a1:Topen_win;
begin
a1:=Tope_win.create(application);
a1.caption:='test';
a1.show;
end;

在窗体A的formcreate或formshow显示
showmessage(self.caption);
为何这时还会显示'123'呢?而不会显示'test'?????????
 
因为你创建时用的父类是唯一的application对象
 
楼上的是误导人家
如果在formcreate里来个showmessage那么会在a1:=....create之后,a1.caption:='test'之前显示self.caption,这时候,它当然是123
如果写在formshow里,应该没问题
 
同意icc
你應該在a1show事件裡寫代碼
a1.caption:='test';
 
对,正如ICC所述。Delphi指令有先后问题,可以通过CPU的Debug来观察执行过程
 
formcreate 与 formshow
都不可以,可以的话我就不在这发布问题了?请好心人继续出方法,这次我就不给分了,等问题解决了一定给分。
 
放OnPaint
 
把project-options中自动创建窗体A去掉,把窗体A的visible设为false,再在formshow中写你的代码。
 
我的表单是midchild,全部没有自动创建。
projects->options里面为空,只有主表单。
 
原来是MDIChild,怪不得,如果是Normal,我上面的方法才行。我再看看。
 
跟踪发现MDIChild窗体在创建后马上执行DoShow(Normal窗体如果Visible为False的话不会执行),产生OnShow事件,所以才出现你说的那种效果。但实际显示出来后,它的caption还是已经改过来了的,执行顺序为:
a1:=Tope_win.create(application);
showmessage(self.caption);
a1.caption:='test';
a1.show;//多余,a1的Visible已经是True了,不会再触发OnShow事件。
因此还是已经更改了a1的caption。
如果你是需要用已经更改了的caption做一些操作的话,可以reintroduce Create构造器(constructor Create(******); reintroduce;),将更改的caption作为参数传进去,只是在重写的Create的时候不要忘了,第一句要“inherited Create(Application);”就行了。
 
后退
顶部