定义一个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。
但是对于控件却不行,不知道为什么,请高手指教。

解决方案 »

  1.   

    我不清楚你用Set能实现为什么还要换成CopyMemory方法
      

  2.   

    因为我希望动态创建自己编写的ActiveX Control,但是因为数目众多,所以必须有一个WithEvents对象来实现,如果用控件数组会有不好的地方就是控件数组的数目不好控制,还有就是控件数组的对象不能随心所欲的释放,比如控件数组里有3个元素,可以unload第1个,但实际上在内存中第一个还是存在的!因此我希望主程序传入WithEvents对象的指针地址,然后在ActiveXControl的RaiseEvent的时候把自身实例的地址用CopyMemory的方法Copy到这个地址,这样就像对控件数组编程一样了,呵呵,可惜不能成功。
    但是我用另外一种方法成功了,就是在主程序中写一个Public的方法,然后把主窗体地址传入ActiveX  Control,当ActiveX Control需要RaiseEvent的时候调用主窗体的这个方法,传入实例的对象,然后在这个方法中把这个对象Set给主程序的WithEvents对象,这样就可以成功!
    所以我所不能理解的就是Set到底做了什么事情,为什么我用CopyMemory不能成功?请高手指教!
      

  3.   

    1.CopyMemory ByVal VarPtr(mcolC), ObjPtr(mcolA), 4
    2.CopyMemory ByVal VarPtr(mcolC), ByVal VarPtr(mcolA), 4
    3.CopyMemory ByVal VarPtr(mcolC), mcolA, 4
    上面三句话的结果都是一样的。