Cómo clonar un objeto en VB6
-
06-09-2019 - |
Pregunta
Estoy tratando de clonar un objeto de forma automática sin tener que crear una instancia de una nueva y copiar manualmente cada variable individual.
Recuerdo que en el día (cuando lo hice todos los días VB6) me ocurrió con un método de clonación de objetos utilizando el PropertyBag, que era bastante guay. Pero he perdido el código y no recuerdo cómo hacerlo nunca más.
¿alguien recuerda o tiene otro método?
Solución
este lo que estabas buscando? El artículo se copia a continuación para la posteridad.
Serialize de datos utilizando un PropertyBag
Puede serializar sus datos rápidamente colocándolo en un objeto PropertyBag, entonces la lectura de la propiedad PropertyBags Contenido. Esta propiedad es realmente una matriz de bytes que es una representación de serie de los datos en el objeto PropertyBag. Se puede utilizar esta matriz de bytes para muchos propósitos, incluyendo un medio eficaz de transmisión de datos a través de 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
Para recuperar los datos serializados, basta con crear un nuevo objeto PropertyBag y establecer la cadena serializada a su propiedad Contenidos. Convertir la cadena en una matriz de bytes antes de asignarlo a la propiedad Contenido:
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.
Otros consejos
método que he utilizado en el pasado está poniendo todas las variables de instancia de un UDT. Como siempre que se mantenga la UDT al día puede copiar los datos de una clase con un método único / comunicado.
Dada una clase "Persona" aquí está un ejemplo sencillo:
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
Para probar el código:
Dim p As New Person
p.InitPerson 1, "MyName", "MyLastName"
Dim p2 As Person
Set p2 = p.GetClone
MsgBox p2.FirstName
Si usted mantiene todas las instancias varianbles dentro de la UDT en lugar de declarar ellos por separado puede tener método Clone simple que necesita muy poco mantenimiento.
Otra de las ventajas es que se puede poner un UDT a un identificador de archivo para la serialización rápida en el 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 mala solución de serialización de los hombres de verdad: -)
Lea también: La persistencia de un componente de datos .
Cada objeto en el marco de mi aplicación tiene un método de lectura y tienda. Lo que hago es pasar una corriente que escribe en un bytearray y almacenar la matriz de bytes. Si bien esto no elimina tener que manejar cada propiedad es suficiente para hacer frente a esto de una vez por la lectura y una vez para la escritura.
Una alternativa es utilizar una bolsa de propiedades como Darrel Miller dice, pero todavía tiene que lidiar con cada propiedad por separado. Si ya ha leído y almacenar entonces mi sugerencia debe ahorrar algo de tiempo.