定义一个WithEvents的TextBox变量txtMyText,然后在窗体上放一个TextBox名为Text1.在FormLoad的时候使用Set语句Set txtMyText = Text1,这样就可以将txtMyText和Text1的事件绑定起来。但是如果使用CopyMemory函数CopyMemory ByVal VarPtr(txtMyText), ObjPtr(Text1), 4,结果用debug信息查看发现VarPtr(txtMyText)的值仍然为0。(调试之前最好把代码拷贝到记事本上,点击Form1的X会强行关闭VB,使用编译器的End结束程序一般不会关闭VB。)那么set都做了些什么?如果我用CopyMeory需要怎么做才能达到和Set相同的效果呢?
另外我还用集合做了测试:
Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)Private mcolA As Collection
Private mcolB As Collection
Private mcolC As CollectionPrivate Sub Form_Load()
Set mcolA = New Collection
mcolA.Add 1
mcolA.Add 2
Set mcolB = New Collection
mcolB.Add 3
CopyMemory ByVal VarPtr(mcolC), ByVal VarPtr(mcolA), 4
MsgBox mcolC.Count
CopyMemory ByVal VarPtr(mcolC), mcolB, 4
MsgBox mcolC.Count
CopyMemory ByVal VarPtr(mcolC), 0&, 4
set mcolA = Nothing
set mcolB = Nothing
End Sub
测试结果,弹出两次对话框,第一次弹出2,第二次弹出1。
但是对于控件却不行,不知道为什么,请高手指教。
另外我还用集合做了测试:
Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)Private mcolA As Collection
Private mcolB As Collection
Private mcolC As CollectionPrivate Sub Form_Load()
Set mcolA = New Collection
mcolA.Add 1
mcolA.Add 2
Set mcolB = New Collection
mcolB.Add 3
CopyMemory ByVal VarPtr(mcolC), ByVal VarPtr(mcolA), 4
MsgBox mcolC.Count
CopyMemory ByVal VarPtr(mcolC), mcolB, 4
MsgBox mcolC.Count
CopyMemory ByVal VarPtr(mcolC), 0&, 4
set mcolA = Nothing
set mcolB = Nothing
End Sub
测试结果,弹出两次对话框,第一次弹出2,第二次弹出1。
但是对于控件却不行,不知道为什么,请高手指教。
但是我用另外一种方法成功了,就是在主程序中写一个Public的方法,然后把主窗体地址传入ActiveX Control,当ActiveX Control需要RaiseEvent的时候调用主窗体的这个方法,传入实例的对象,然后在这个方法中把这个对象Set给主程序的WithEvents对象,这样就可以成功!
所以我所不能理解的就是Set到底做了什么事情,为什么我用CopyMemory不能成功?请高手指教!
2.CopyMemory ByVal VarPtr(mcolC), ByVal VarPtr(mcolA), 4
3.CopyMemory ByVal VarPtr(mcolC), mcolA, 4
上面三句话的结果都是一样的。