Как клонировать объект в VB6 - PullRequest
5 голосов
/ 24 февраля 2009

Я пытаюсь автоматически клонировать объект без необходимости создавать новый экземпляр и вручную копировать каждую переменную.

Я помню, в те времена (когда я делал VB6 каждый день), я придумал метод клонирования объектов с использованием PropertyBag, который был довольно крутым. Но я потерял код и больше не помню, как это сделать.

Кто-нибудь помнит или есть другой метод?

Ответы [ 4 ]

4 голосов
/ 24 февраля 2009

это , что вы искали? Статья скопирована ниже для потомков.

Сериализация данных с использованием PropertyBag

Вы можете быстро сериализовать ваши данные, поместив их в объект PropertyBag, а затем прочитав свойство PropertyBags Contents. Это свойство действительно является байтовым массивом, который представляет собой последовательное представление данных в вашем объекте PropertyBag. Вы можете использовать этот байтовый массив для многих целей, включая эффективные средства передачи данных через 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

Чтобы извлечь сериализованные данные, просто создайте новый объект PropertyBag и установите для сериализованной строки его свойство Contents. Преобразуйте строку в байтовый массив, прежде чем назначить ее свойству Contents:

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

Майк Курц, McKees Rocks, Пенсильвания.

4 голосов
/ 24 февраля 2009

Метод, который я использовал в прошлом, помещает все переменные экземпляра в UDT. Пока вы поддерживаете UDT в актуальном состоянии, вы можете копировать данные класса с помощью одного метода / оператора.

Для класса "Person" приведем простой пример: </p> <pre><code>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

Чтобы попробовать код:

</p> <pre><code>Dim p As New Person p.InitPerson 1, "MyName", "MyLastName" Dim p2 As Person Set p2 = p.GetClone MsgBox p2.FirstName

Если вы поддерживаете все переменные экземпляра внутри UDT вместо того, чтобы объявлять их отдельно, у вас может быть простой метод Clone, который требует минимального обслуживания.

Еще одним преимуществом является то, что вы можете поместить UDT в дескриптор файла для быстрой сериализации на диск.

</p> <pre><code>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

Плохое мужское решение для сериализации на самом деле: -)

1 голос
/ 25 февраля 2009

Каждый объект в структуре моего приложения имеет метод Read and Store. Что я делаю, так это передаю им поток, который записывает в байтовый массив и сохраняет байтовый массив. Хотя это не избавляет от необходимости обрабатывать каждое свойство, вы должны иметь дело с этим только один раз для чтения и один раз для записи.

Альтернативой является использование пакета свойств, как говорит Даррел Миллер, но вам все равно придется иметь дело с каждым свойством отдельно. Если вы уже прочитали и сохранили, мое предложение должно сэкономить время.

1 голос
/ 25 февраля 2009
...