怪事,按理说窗体创建的第一个事件是 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,执行该语句。