eddy1973 ha scritto:
Buongiorno,
vorrei porre soltanto una semplice domanda.
Per passare valori tra maschere è possibile sfruttare la proprietà openargs. Un risultato equivalente si ottiene utilizzando variabili public o global.
Se ho da passare più valori, c'è una ragione per cui sarebbe meglio optare per un o per l'atro metodo? O è del tutto equivalente?
Grazie.
In realtà la cosa potrebbe essere MOLTO più flessibile...!
La proprietà OpenArgs, potrebbe ad esempio contenere un Pointer ad un'oggetto... ad esempio una Classe, una Collection... quinsi si potrebbero passare riferimenti a strutture Complesse.
Es:
Private Const POINTERSIZE As Long = 4
Private Const ZEROPOINTER As Long = 0
#If VBA7 Then
Declare PtrSafe Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
#Else
Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
#End If
Public Function GetPointerToObject(ByRef objThisObject As Object) As Long
' Purpose : Return the value of a pointer.
' Argument : A pointer to an Object.
' Author : ChrisO.
' Updated : 2012-04-18
Dim lngThisPointer As Long
If (conHandleErrors) Then On Error GoTo ErrorHandler
CopyMem lngThisPointer, objThisObject, POINTERSIZE
GetPointerToObject = lngThisPointer
ExitProcedure:
Exit Function
ErrorHandler:
DisplayError "GetPointerToObject", conModuleName
Resume ExitProcedure
End Function
Public Function GetObjectFromPointer(ByVal lngThisPointer As Long) As Object
' Purpose : Return a pointer to an Object.
' Argument : The value of a Pointer.
' Author : ChrisO.
' Updated : 2012-04-18
Dim objThisObject As Object
If (conHandleErrors) Then On Error GoTo ErrorHandler
CopyMem objThisObject, lngThisPointer, POINTERSIZE
Set GetObjectFromPointer = objThisObject
CopyMem objThisObject, ZEROPOINTER, POINTERSIZE
ExitProcedure:
Exit Function
ErrorHandler:
DisplayError "GetObjectFromPointer", conModuleName
Resume ExitProcedure
End Function
Ipotiziamo di avere una Collection
Dim nC as New Collection
Dim ptr As Long
nC.Add "Pippo"
nC.Add "Pluto"
ptr = GetPointerToObject(nc)
DoCmd.OpenForm "nomeForm", , , , , , CStr(ptr)
Ora su Load della Form si va a rileggere
Private Sub Form_Load()
Dim mC as Collection
Set mC=GetObjectFromPointer(clng(Me.OpenArgs))
Debug.Print mc.Item(1), mc.Item(2)
End Sub
Ovviamente era solo un'esempio... la cosa potrebbe veramente essere complessa, ed il vantaggio è che il Pointer non occupa spazio, è appunto un Riferimento, pertanto è BIDIREZIONALE, ovvero se io aggiorno i dati viene aggiornato l'Oggetto iniziale.