回 帖 发 新 帖 刷新版面

主题:[讨论]提两个问题!恳请帮助!

1、有窗体form1和form2,form1上有两按钮cmd1和cmd2,点击cmd1出现form2,并且form2的caption变为“test1”,点击cmd2也出现form2,此时form2的caption变为“test2”。现在的问题是:在form2的窗体加载时要实现一个判断功能:
当form2的caption为test1时执行动作1,当form2的caption为test2时执行动作2。请问,该怎么实现这个功能?我把实现这个功能的语句放在form2的load事件中,可无法进行caption值的正确判断。请问,该采取何种办法,执行功能的语句应该放在form2的什么事件中???我目前想到的办法是设一全局变量,然后根据该变量的值来判断当前form2的caption为“test1”还是“test2”。有没有比这更好的办法??

附:
cmd1中代码:
  
  form2.Caption = "test1"
  form2.Show 1

cmd2中代码:

  form2.Caption = "test2"
  form2.Show 1

2、顺便还有另外一个问题,是关于窗体Initialize事件。例子依然如上,点击cmd1和cmd2出现form2,请问如果在form1不关闭的条件下,是不是form2的Initialize事件只出现一次?比如点击cmd1打开form2执行了Initialize,如果此时关闭form2,再点击cmd1或者cmd2出现form2,此时form2的Initialize事件就不再发生???为什么会这样呢?不是form2都unload关闭了吗?那为什么第二次显示就不发生Initialize了?如果要第二次依然发生Initialize事件,应该再关闭form2的过程中加入什么代码呢?

菜鸟提问,见笑了!

回复列表 (共7个回复)

沙发

第一个问题,你的思路我觉得是对的;但代码是错的。
第二个问题我不知道。

板凳

寒。。。。[em7]

楼上的朋友,不好意思,我在主楼里敲错了!谢谢你的提醒!
现在已经改正了!!!

3 楼

再补充一下:

执行了form2.Caption = "test1"或者form2.Caption = "test2"之后,form2的caption的确可以修改为test1或者test2------这可以在form2启动后可以看到,但是在form2的load事件中:form2.caption的值不是test1或者test2!很奇怪!

继续等求解!

4 楼

先要讲一下窗体启动时执行的事件顺序:
1.最先执行Initialize事件
2.再执行Load事件
3.再执行Activate事件

另外,根据微软的说明,使用unload卸载窗体时,只卸载窗体的实体,而代码仍留在内存中,这样,当你第一次点击按纽时,加载窗体的实体和代码,所以要执行Initialize事件,当你用unload卸载窗体后再加载窗体时,由于窗体代码已存在,也说是说初始化已经完成了,故不再执行Initialize事件,而只从第二个顺序也就是Load事件执行起,Load事件主要作用是加载窗体实体。
当Load事件还没有执行完毕,也就是说,窗体实体还没有形成时,caption属性当然不会生效。

所以,你最好在Form2的Activate事件中实现你的判断功能:

Private Sub Form_Activate()
Select Case Me.Caption
  Case "test1": Debug.Print 1
  Case "test2": Debug.Print 2
End Select
End Sub

这时候,窗体实体已经形成,什么代码都可以执行了。
顺便说一下,如果你用“End”语句来结束程序,那么,不但窗体被卸载,有关的代码也卸载了。但这样会使所有的窗体都卸载。

5 楼

[quote]先要讲一下窗体启动时执行的事件顺序:
1.最先执行Initialize事件
2.再执行Load事件
3.再执行Activate事件

另外,根据微软的说明,使用unload卸载窗体时,只卸载窗体的实体,而代码仍留在内存中,这样,当你第一次点击按纽时,加载窗体的实体和代码,所以要执行Initialize事件,当你用unload卸载窗体后再加载窗体时,由于窗体代码已存在,也说是说初始化已经完成了,故不再执行Initialize事件,而只从第二个顺序也就是Load事件执行起,Load事件主要作用是加载窗体实体。
当Load事件还没有执行完毕,也就是说,窗体实体还没有形成时,caption属性当然不会生效。

所以,你最好在Form2的Activate事件中实现你的判断功能:

Private Sub Form_Activate()
Select Case Me.Caption
  Case "test1": Debug.Print 1
  Case "test2": Debug.Print 2
End Select
End Sub

这时候,窗体实体已经形成,什么代码都可以执行了。
顺便说一下,如果你用“End”语句来结束程序,那么,不但窗体被卸载,有关的代码也卸载了。但这样会使所有的窗体都卸载。[/quote]

放在Activate事件中也不恰当,因为Activate事件并不只是在启动窗口的时候才发生!如果窗口form2已经打开,再不关闭form2的情况下,有时Activate事件依然会发生!

6 楼

在form的risize事件也可以。

7 楼

所有在load事件及之后修改的对象属性,在form unload后都会消失,除非你不关它,而是hide
所以你的目的不能达到,用全局变量吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册