سؤال

أنا أحاول تلقائيا استنساخ كائن دون الحاجة إلى إنشاء واحدة جديدة يدويا نسخ كل متغير.

أتذكر مرة في اليوم (عندما لم 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 وتخزين صفيف بايت.في حين أن هذا لا يلغي الحاجة إلى التعامل مع كل الممتلكات لديك فقط للتعامل مع هذا مرة واحدة عن القراءة مرة للكتابة.

والبديل هو استخدام خاصية حقيبة مثل داريل يقول ميلر ولكن لا يزال لديك للتعامل مع كل خاصية على حدة.إذا كان لديك بالفعل قراءة وتخزين ثم اقتراحي أن حفظ بعض الوقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top