Proprietà openargs vs variabili globali.

di il
7 risposte

Proprietà openargs vs variabili globali.

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.

7 Risposte

  • Re: Proprietà openargs vs variabili globali.

    Diciamo che dal punti di vista di openargs vs .variabili globali è del tutto equivalente mentre dal punto di vista variabili globali vs. openargs lo è parzialmente.
    La differenza è nella visibilità/scopo delle variabili :
    - openargs è 'tendenzialmente' locale al form chiamato (in realtà se il form è aperto, puoi accedere al parametro openargs anche da altri form ma non è prettamente lo scopo per il quale esiste e si usa openargs). Sicuramente alla chiusura del form chiamato, openargs viene distrutto
    - var. globale come suggerisce il tipo di dichiarazione è globale a tutto il progetto e quindi è indipendente dalla chiusura del form chiamato.

    Se vuoi passare più info (variabili) tra forms puoi utilizzare diversi metodi.
    1) concateni i valori nell'openargs utilizzando un carattere separatore (i.e. "valore1|valore2|valore3"). In questo caso il carattere separatore è il pipe (|). Nel form chiamato devi poi utilizzare il processo inverso di scomposizione del parametro openargs (utilizzi di fatto lo split)
    2) crei una user data type che assegni ad una variabile globale (codice scritto al volo a mo' di esempio) :
    
    ' da inserire in un modulo
    Type MyVar
    	var1 as string
    	var2 as bool
    	var3 as integer
    End Type
    Public MyOpenArgs as MyVar
    
    Qualunque approccio tu voglia usare è bene ricordare che le variabili vanno dichiarate, vanno inizializzate, vanno utilizzate ... insomma vanno gestite correttamente in tutto il loro ciclo di vita
  • Re: Proprietà openargs vs variabili globali.

    Grazie.
  • Re: Proprietà openargs vs variabili globali.

    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.
  • Re: Proprietà openargs vs variabili globali.

    @Alex ha scritto:


    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.
    ...
    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.
    Quello che proponi è un metodo molto interessante e relativamente semplice da implementare (per me) ...
  • Re: Proprietà openargs vs variabili globali.

    Si utile ed evita tanti giri di variabili.
    Per chi è uso le classi aprire una form passando l'oggetto completo è un vantaggio non da poco.
  • Re: Proprietà openargs vs variabili globali.

    Ho fatto del prove e il sistema funziona (non che avessi dei dubbi sia chiaro)

    Come alternativa alla GetPointerToObject si può usare la funzione non documentata ObjPtr che non richiede la dichiarazione e l'uso di API
    
    Public Function ObjectPointerAddress(ByRef objThisObject As Object) As LongPtr
    Dim ptrToObject As LongPtr
            
        ' Pointer to actual object in memory
        ptrToObject = ObjPtr(objThisObject)
        
        ObjectPointerAddress = ptrToObject
    End Function
    
    Purtroppo non esistendo la funzione inversa (PtrObj) ovvero l'unico modo che ho trovato è quello proposto da Alex (quindi tramite il copymemory) tanto vale, in questo contesto dove serve ricavare il pointer da un oggetto e poi tramite pointer ricreare l'oggetto, continuare ad usare la GetPointerToObject
  • Re: Proprietà openargs vs variabili globali.

    Questo magati è utile:
    https://www.codeproject.com/Articles/5685/Pointers-in-Visual-Basic-using-Undocumented-Functi

    Si avevo letto che le 2 chiamate possono restituire 2 Pointer differenti, ma ora non trovo più il LINK che spiegava il motivo ed in particolare in cosa differissero...
Devi accedere o registrarti per scrivere nel forum
7 risposte