请教个窗体事件执行顺序问题

new_BCBER 2012-06-28 10:58:16
1.建立窗体TFmin

2.在Form头文件中定义公共成员P

public: // User declarations
String P;



3.在另一个窗体中调用,并给P赋值

fm = new TFm(Application);
fm->P = "123";
fm->Show();


4.在fm窗体事件OnShow中显示p却是没有赋值,为什么呢?

void __fastcall TFm::FormShow(TObject *Sender)
{
ShowMessage(P);
}
...全文
218 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldtab 2012-07-01
  • 打赏
  • 举报
回复
问题,已经说清了。

想说一句,关于 mdichild 型窗口。你的fm是多定义的。直接:
new TFm(Application, "123")->Show();
即可。

MDIChildren[i]、ActiveMDIChild,可找到要处理的窗口。
new_BCBER 2012-07-01
  • 打赏
  • 举报
回复
没有要补充的了吗?那准备结了
ccrun.com 2012-06-30
  • 打赏
  • 举报
回复
这是因为你将fm的Visible设成true了,在设计时将这个属性改成false就可以了。
new_BCBER 2012-06-30
  • 打赏
  • 举报
回复
想当然的问题,考虑了一天,这算不算个问题?
new_BCBER 2012-06-30
  • 打赏
  • 举报
回复
大概从逻辑上讲mdichild型的窗体就不允许这样给窗体成员赋值吧??
new_BCBER 2012-06-30
  • 打赏
  • 举报
回复
看了老妖的回复后学得很有道理,高兴地试了一下,但却报告错误mdichild型的窗体不允许隐藏(Cannot hide an MDI child form)。这方面的内容没有学好,不知道应该看看哪些书介绍这方面的东西,我看了许多书都不涉及这些。
dataxdata 2012-06-29
  • 打赏
  • 举报
回复
这个可能就要涉及VCL的封装机制了,有可能是由于在构造函数执行时,先要执行基类TForm的构造函数,而TForm的构造函数在windows中注册并生成了窗口,导致触发WM_CREATE消息,以上仅是猜测
new_BCBER 2012-06-29
  • 打赏
  • 举报
回复
谢谢dataxdata给出的非常好的解决方案。

但为什么FormShow()会是在窗体创建的时候引发,
而不是在fm->Show()时引发呢?谁能给解释一下吗?

fm = new TFm(Application); //在这儿就引发了FormShow(),造成下一句来不及
fm->P = "123";
fm->Show(); //为什么不是在这儿引发FormShow()?

一剑平江湖 2012-06-28
  • 打赏
  • 举报
回复
你创建的窗体是不是mdichild的型的,改成normal的应该就没问题了。
银点 2012-06-28
  • 打赏
  • 举报
回复
可以的。
LinuxCard 2012-06-28
  • 打赏
  • 举报
回复
楼上正解,放在构造函数中
dataxdata 2012-06-28
  • 打赏
  • 举报
回复
这种情况可以定义一个新的构造函数
TFm::TFm(TComponent* Owner, String str) : TForm(Owner) {
P = str;
}
然后
fm = new TFm(Application, "123");
fm->Show();

new_BCBER 2012-06-28
  • 打赏
  • 举报
回复
看来只好用全局变量了,真不爽~
new_BCBER 2012-06-28
  • 打赏
  • 举报
回复
问题是我跟踪发现void __fastcall TFm::FormShow(TObject *Sender)这个函数比赋值操作要先执行,奇怪
new_BCBER 2012-06-28
  • 打赏
  • 举报
回复
确实是mdichild型的,这样的怎么办呢?

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧