新しいオブジェクトをインスタンス化し、すべての変数を手動でコピーすることなく、オブジェクトを自動的に複製しようとしています。
昔 (毎日 VB6 を使っていたとき)、PropertyBag を使用してオブジェクトを複製する方法を思いついたのを覚えています。しかし、コードを紛失してしまい、その方法をもう覚えていません。
誰かが覚えているか、別の方法を持っていますか?
新しいオブジェクトをインスタンス化し、すべての変数を手動でコピーすることなく、オブジェクトを自動的に複製しようとしています。
昔 (毎日 VB6 を使っていたとき)、PropertyBag を使用してオブジェクトを複製する方法を思いついたのを覚えています。しかし、コードを紛失してしまい、その方法をもう覚えていません。
誰かが覚えているか、別の方法を持っていますか?
私が過去に使用した方法は、すべてのインスタンス変数を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
貧しい男性のシリアル化ソリューションは本当に:-)
これはあなたが探していたものですか?記事は後世のために以下にコピーされます。
データを 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
マイク・カーツ、ペンシルバニア州マッキーズ・ロックス
また読む:コンポーネントのデータの永続化。