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 FunctionJak 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.