Domanda

Sto cercando di clonare automaticamente un oggetto senza dover istanziare una nuova e copiare manualmente ogni singola variabile.

Mi ricordo nel corso della giornata (quando l'ho fatto VB6 tutti i giorni) mi si avvicinò con un metodo di clonazione oggetti utilizzando il PropertyBag, che era abbastanza fresco. Ma ho perso il codice e non ricordo come si fa più.

Qualcuno ricorda o ha un altro metodo?

È stato utile?

Soluzione

questo quello che cercavi? L'articolo è copiato di seguito per i posteri.

Serialize dati utilizzando un PropertyBag

È possibile serializzare i dati in modo rapido collocandola in un oggetto PropertyBag, quindi la lettura della proprietà PropertyBags Contents. Questa proprietà è in realtà una matrice Byte che è una rappresentazione seriale dei dati contenuti nel vostro oggetto PropertyBag. È possibile utilizzare questo array di byte per vari scopi, tra cui uno strumento efficace di trasmissione di dati su DCOM:

Private Function PackData() As String
    Dim pbTemp  As PropertyBag

    'Create a new PropertyBag object
    Set pbTemp = New PropertyBag
    With pbTemp
        'Add your data to the PB giving each item a 
        'unique string key
        Call .WriteProperty("FirstName", "John")
        Call .WriteProperty("MiddleInitial", "J")
        Call .WriteProperty("LastName", "Doe")

        'Place the serialized data into a string 
        'variable.
        Let PackData = .Contents
    End With

    Set pbTemp = Nothing
End Function

Per recuperare i dati serializzati, è sufficiente creare un nuovo oggetto PropertyBag e impostare la stringa serializzata alla sua proprietà contenuto. Convertire la stringa in una matrice di byte prima di assegnarlo alla proprietà Contenuto:

Private Sub UnPackData(sData As String)
    Dim pbTemp  As PropertyBag
    Dim arData()    As Byte

    'Convert the string representation of the data to 
    'a Byte array
    Let arData() = sData

    'Create a new PropertyBag object
    Set pbTemp = New PropertyBag
    With pbTemp
        'Load the PropertyBag with data
        Let .Contents = arData()

        'Retrieve your data using the unique key
        Let m_sFirstName = .ReadProperty("FirstName")
        Let m_sMiddleInitial = _
            .ReadProperty("MiddleInitial")
        Let m_sLastName = .ReadProperty("LastName")
    End With

    Set pbTemp = Nothing
      End Sub

Mike Kurtz, McKees Rocks, Pa.

Altri suggerimenti

metodo che ho usato in passato sta mettendo tutte le variabili di istanza su un tipo definito dall'utente. Finché si mantiene l'UDT aggiornati è possibile copiare i dati di una classe con un solo metodo / dichiarazione.

Data una classe "Persona", ecco un semplice esempio:

Private Type tPerson
    ID As Long
    FirstName As String
    LastName As String
End Type  

Private m_Person As tPerson  

Public Sub InitPerson(ID As Long, FirstName As String, LastName As String)
    m_Person.ID = ID
    m_Person.FirstName = FirstName
    m_Person.LastName = LastName
End Sub  

Friend Sub SetData(PersonData As tPerson)
    m_Person = PersonData

End Sub  

Public Function GetClone() As Person
    Dim p As New Person
    p.SetData m_Person

    Set GetClone = p

End Function  

Public Property Get FirstName() As String
    FirstName = m_Person.FirstName

End Property  

Per provare il codice:

Dim p As New Person
p.InitPerson 1, "MyName", "MyLastName"

Dim p2 As Person
Set p2 = p.GetClone

MsgBox p2.FirstName

Se si mantiene tutte le istanze varianbles all'interno del UDT invece di dichiarare loro separatamente si può avere il metodo Clone semplice che ha bisogno di pochissima manutenzione.

Un altro vantaggio è che si può mettere un UDT a un handle di file per un rapido serializzazione su disco.

Public Sub Save(filePathName As String)
    Dim f As Integer
    f = FreeFile()

    Open filePathName For Binary Access Write Lock Read Write As #f
        Put #f, , m_Person
    Close #f

End Sub

Una cattiva soluzione di serializzazione uomo davvero: -)

Ogni oggetto in quadro di mia applicazione ha un metodo di leggere e memorizzare. Quello che faccio è passare loro un torrente che scrive in un ByteArray e memorizzare l'array di byte. Anche se questo non elimina dover gestire ogni proprietà si ha solo a che fare con questo, una volta per la lettura e una volta per la scrittura.

Un'alternativa è quella di utilizzare un sacchetto di proprietà come Darrel Miller dice, ma avete ancora a che fare con ogni proprietà separatamente. Se avete già leggere e memorizzare quindi il mio suggerimento dovrebbe risparmiare un po 'di tempo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top