5

新しいオブジェクトをインスタンス化し、すべての変数を手動でコピーすることなく、オブジェクトを自動的に複製しようとしています。

昔 (毎日 VB6 を使っていたとき)、PropertyBag を使用してオブジェクトを複製する方法を思いついたのを覚えています。しかし、コードを紛失してしまい、その方法をもう覚えていません。

誰かが覚えているか、別の方法を持っていますか?

4

4 に答える 4

4

私が過去に使用した方法は、すべてのインスタンス変数をUDTに配置することです。UDTを最新の状態に保つ限り、単一のメソッド/ステートメントでクラスのデータをコピーできます。

「Person」クラスが与えられた場合、ここに簡単な例があります。

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  

コードを試すには:

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

Dim p2 As Person
Set p2 = p.GetClone

MsgBox p2.FirstName

すべてのインスタンス変数を個別に宣言するのではなく、UDT内で維持する場合は、メンテナンスをほとんど必要としない単純なクローンメソッドを使用できます。

もう1つの利点は、UDTをファイルハンドルに配置して、ディスクにすばやくシリアル化できることです。

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

貧しい男性のシリアル化ソリューションは本当に:-)

于 2009-02-24T06:49:00.930 に答える
4

これはあなたが探していたものですか?記事は後世のために以下にコピーされます。

PropertyBag を使用してデータをシリアル化する

データを PropertyBag オブジェクトに配置し、PropertyBags Contents プロパティを読み取ることで、データをすばやくシリアル化できます。このプロパティは実際には、PropertyBag オブジェクト内のデータのシリアル表現である Byte 配列です。このバイト配列は、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

マイク・カーツ、ペンシルバニア州マッキーズ・ロックス

于 2009-02-24T13:41:34.510 に答える
1

また読む:コンポーネントのデータの永続化

于 2009-02-25T06:01:53.313 に答える