首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

奇事,按理说窗体创建的第一个事件是 initialize 事件,但为何 load 事件先执行呢

2012-12-31 
怪事,按理说窗体创建的第一个事件是 initialize 事件,但为何 load 事件先执行呢?怪事,按理说窗体创建的第

怪事,按理说窗体创建的第一个事件是 initialize 事件,但为何 load 事件先执行呢?
怪事,按理说窗体创建的第一个事件是 initialize 事件,但为何 load 事件先执行呢?
---------------------------------
今天看msdb,关于窗体的存活期一节,讲的是,事件的触发顺序,
最先触发的事件是 initialize ,然后才是load事件.
initialaze是创建窗本的第一个事件,但是并不加载,
从load开始进入加载,然后才可见.

但是我做了下测试,发现 load 事件在 initialize 事件前触发,为什么呢?

我的方法是,分别写msgbox ""语句,
发现load事件中的 msgbox 语句最先执行.

[解决办法]
你看错了吧?
应该是initialize先的 你再试试?


Private Sub Form_Initialize()
   MsgBox "Form_Initialize"
End Sub

Private Sub Form_Load()
  MsgBox "Form_Load"
End Sub


[解决办法]
真是这样吗?
不能用msgbox作测试,这样程序会被挂起。   

[解决办法]
用断点或者debug.print测试
[解决办法]
窗体在第一次被创建实例的时候触发Initialize,在没有被彻底卸载的情况下第二次show就只会触发load

可以这样试验一下:创建两个窗体,form1上放两个按钮
form1代码:

Private Sub Command1_Click()
    Form2.Show
End Sub

Private Sub Command2_Click()
    Set Form2 = Nothing
End Sub


form2代码:


Private Sub Form_Initialize()
    Debug.Print "Form_Initialize"
End Sub

Private Sub Form_Load()
    Debug.Print "Form_Load"
End Sub



第一次测试:点击command1 看看结果
第二次测试:关闭form2再点击command1看看结果
第三次测试:点击command2再点击command1看看结果
[解决办法]

很清楚了。

楼主的代码首先触发了 Initialize。这里的代码要求 Me.hWnd 作为执行参数,所以在 Initialize 的代码中直接引发窗体的 Load 操作,从而触发了 Load 事件。

在 Load 事件结束后,Initialize 的代码取得了所需的  Me.hWnd,执行该语句。

热点排行