كيفية استنساخ كائن في VB6
-
06-09-2019 - |
سؤال
أنا أحاول تلقائيا استنساخ كائن دون الحاجة إلى إنشاء واحدة جديدة يدويا نسخ كل متغير.
أتذكر مرة في اليوم (عندما لم VB6 اليومية) لقد جاء مع طريقة استنساخ الكائنات باستخدام PropertyBag التي كانت باردة جدا.ولكن لقد فقدت رمز و لا أتذكر كيف تفعل ذلك بعد الآن.
هل يتذكر أحد أو يكون وسيلة اخرى ؟
المحلول
يكون هذه ما كنت تبحث عنه؟ يتم نسخ المقالة أدناه للأجيال القادمة.
تسلسل البيانات باستخدام PropertyBag
يمكنك تسلسل بياناتك بسرعة عن طريق وضعه في كائن Voyalbag، ثم قراءة خاصية محتويات ProjectionBags. هذه الخاصية هي حقا صفيف بايت هو تمثيل تسلسلي للبيانات في كائن Recentalbag الخاص بك. يمكنك استخدام مجموعة البايت هذه لأغراض عديدة، بما في ذلك وسيلة فعالة لنقل البيانات عبر 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
لاسترداد البيانات المتسلسلة، ما عليك سوى إنشاء كائن VENECTENT جديد وتعيين السلسلة المتسلسلة إلى خاصية محتوياتها. قم بتحويل السلسلة إلى صفيف بايت قبل تعيينه إلى خاصية المحتويات:
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
مايك كورتز، ماكيس الصخور، السلطة الفلسطينية.
نصائح أخرى
الطريقة التي استخدمتها في الماضي هي وضع جميع المتغيرات المثيل على UDT. طالما كنت تبقي UDT حتى الآن، يمكنك نسخ بيانات الفصل مع طريقة واحدة / عبارة واحدة.
بالنظر إلى فئة "شخص" هنا مثال بسيط:
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 بدلا من الإعلان عنها بشكل منفصل، فيمكنك الحصول على طريقة استنساخ بسيطة تحتاج إلى الصيانة القليل جدا.
ميزة أخرى هي أنه يمكنك وضع 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
حل تسلسل رجالي فقير حقا :-)
قراءة أيضا: استمرار بيانات المكون.
كل كائن في طلبي هذا الإطار قراءة وتخزين الأسلوب.ما أقوم به هو تمرير لهم تيار أن يكتب إلى bytearray وتخزين صفيف بايت.في حين أن هذا لا يلغي الحاجة إلى التعامل مع كل الممتلكات لديك فقط للتعامل مع هذا مرة واحدة عن القراءة مرة للكتابة.
والبديل هو استخدام خاصية حقيبة مثل داريل يقول ميلر ولكن لا يزال لديك للتعامل مع كل خاصية على حدة.إذا كان لديك بالفعل قراءة وتخزين ثم اقتراحي أن حفظ بعض الوقت.