Come clonare un oggetto in VB6
-
06-09-2019 - |
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?
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: -)
Leggi anche: Il persistere di un componente dati .
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.