Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(dest As Any, source As Any, ByVal bytes As Long)
Public Function PtrToObject(ByVal iObj As Long) As Object
Dim nObj As Object
If VarType(iObj) = vbLong Then
CopyMemory nObj, CLng(iObj), 4
Else
Exit Function
End If
Set PtrToObject = nObj
CopyMemory nObj, 0&, 4
End Function
Jak widać, użyliśmy "nieśmiertelnego" CopyMemory (podoba mi się coraz
bardziej ta funkcja). A teraz w jaki sposób należy korzystać z tej funkcji...
Oto prosty przykład:
'Przypuśćmy, że z poziomu formularza Form1 wywołaliśmy formularz Form2 w taki sposób:
'DoCmd.OpenForm "Form2", , , , , , ObjPtr(Me.Form)
'Aby w formularzu Form2 odtworzyć obiekt Form1, wystarczy napisać:
Dim F As Form
Set F = PtrToObject(CLng(Me.OpenArgs))
MsgBox F.Name
'Komunikat zwróci nam nazwę obiektu, który przekazaliśmy w parametrze funkcji ObjPtr()
Patrz przykład Krzysztofa Naworyty tutaj.