سؤال

في VB6، أحاول اجتياز كائن متأخر في شكل آخر.

frmmain.vb.

Dim x
Set x = CreateObject("MyOwn.Object")
Dim f as frmDialog
Set f = New frmDialog
f.SetMyOwnObject x

frmdialog.

Dim y
Public Sub SetMyOwnObject(ByVal paramX As Variant)
  Set y = paramX
End Sub

محتويات y هي سلسلة تحتوي على اسم نوع الكائن المحدد في وقت متأخر، "Myown.Object". Byval و Byref لا تحدث فرقا. أي أدلة؟ تواجه مشكلة في التذكر.

هل كانت مفيدة؟

المحلول

لقد استخدمت Vartype (Y). والنتيجة هي 8، ل vBString. يجب أن يكون 9 للكائن. - ssorrrel منذ ساعة واحدة

استخدم طباعة Y في النافذة الفورية للعثور على محتويات Y. - SSorrreLL منذ 55 دقيقة

يبدو أن هذا يؤكد شكوكي. ال MyOwn.Object يجب أن تحتوي الطبقة على خاصية أو طريقة افتراضية تقوم بإرجاع سلسلة.

لذلك، عند محاولة ذلك Debug.Print هذا، سيعود قيمة الخاصية الافتراضية / الطريقة. عندما تحوم فوق المتغير في IDE، سيعرض VB6 قيمة الخاصية الافتراضية / الطريقة. عندما تفعل VarType في اتصال y سيعود نوع المتغير الخاص بالملكية أو الطريقة الافتراضية.

السبب هو أنه عندما يكون لديك متغير من النوع Variant التي تخزن an. Object, وحدد فئة الكائن طريقة أو خاصية افتراضية، وسيقوم المتغير بتقييم قيمة الإرجاع للطريقة أو الممتلكات الافتراضية في معظم المواقف.

يمكنك التحقق بسرعة لمعرفة ما إذا كان MyOwn.Object الطبقة لديها عضو افتراضي عن طريق فتح مستعرض كائن إلى MyOwn.Object فئة ونظر إلى قائمة الخصائص والأساليب الخاصة بها. إذا رأيت طريقة أو خاصية لها أيقونة مع دائرة زرقاء صغيرة في الزاوية، فإنها تشير إلى الطريقة أو الخاصية هي العضو الافتراضي في الفصل. إذا وجدت واحدة، فأنا على استعداد للمراهنة أنها أعلنت إرجاع سلسلة.

لاحظ أنه حتى لو قمت بتغيير كل ما تبذلونه Variantب ObjectS، ستظل تواجه هذا السلوك في عدد من الأماكن. على سبيل المثال، حتى لو y أعلن As Object, ، القيام Debug.Print y ما زلت أطبع قيمة الخاصية الافتراضية أو الطريقة، وفعل VarType(y) سوف لا تزال تعود 8 (سلسلة).

معرفة بالضبط عندما يستخدم VB6 العضو الافتراضي وعندما لن يكون الأمر مربكا. على سبيل المثال، إذا كنت تعلن y مثل Object, ، ثم القيام بذلك TypeName(y) سيعود MyOwn.Class, ، لكن VarType(y) سوف لا تزال تعود 8 (سلسلة). ومع ذلك، إذا كنت تعلن y مثل Variant, ، من ثم TypeName(y) عائدات String.

إذا كنت تستخدم الربط المتأخر، فمن الصعب تجنب هذا التأثير الجانبي، حيث ستتمكن فقط من إعلان متغير جسمك كما Object أو Variant.

نصائح أخرى

ليس لدي نسخة من VB6 مفيد، ولكن يمكنني أن أتذكر القيام بنفس الشيء أكثر أو أقل في كثير من الأحيان، وأعتقد أننا استخدمنا كائن بدلا من البديل في توقيع الطريقة. يتغير البديل بشكل عام أقل بكثير من حيث أنواع التحويلات التي قد يتم تشغيلها على متغير، بينما مع كائن، فأنا بالتأكيد لنحاول VB أي نوع من التحويل.

هل أنت متأكد أنك لم تحذف الكلمة الأساسية المحددة على سبيل المثال

Dim y
Public Sub SetMyOwnObject(ByVal paramX As Variant)
  ' Set y = paramX  ' thought you had this...
  y = paramX        ' ...actually have this
End Sub

إذا كانت هذه هي الحالة، فستكون قيمة y القيمة الافتراضية للكائن. هل لديك فئة myown.Object لديك خاصية تعرض وصفا لنوعها وحددها كعضو افتراضي للفئة (ملحوظ مع نقطة زرقاء في مستعرض كائن VB)؟

frmmain.vb.

Dim x As Object
Set x = CreateObject("MyOwn.Object")
Dim f as frmDialog
Set f = New frmDialog
f.SetMyOwnObject x

frmdialog.

Dim y As Object
Public Sub SetMyOwnObject(ByRef paramX As Object)
  Set y = paramX
End Sub

عند استخدام CreateObject، تقوم بإنشاء كائن وليس متغيرا. عند تمرير كائن عموما، تستخدم ByRef.

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