Вопрос

В 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 для объекта. - ssorrrell 1 час назад

Используйте печать Y в непосредственном окне, чтобы найти содержимое Y. - Ssorrrell 55 минут назад

Кажется, это подтверждает мои подозрения. А MyOwn.Object Класс должен иметь свойство по умолчанию или метод, который возвращает строку.

Поэтому, когда вы пытаетесь Debug.Print Это вернет значение свойства/метода по умолчанию. Когда вы нажимаете на переменную в IDE, VB6 отобразит значение свойства/метода по умолчанию. Когда вы делаете VarType позвонить y Он вернет тип переменной свойства или метода по умолчанию.

Причина в том, что когда у вас есть переменная типа Variant что хранит 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 Handy, но я помню, как делал то же самое более или менее часто, и я считаю, что мы использовали объект, а не вариант в подписи метода. Вариант, как правило, намного менее предсказуем с точки зрения того, какие виды конверсий он может работать с переменной, тогда как с объектом я уверен, что VB не будет пытаться какую -либо конверсию.

Вы уверены, что не пропустили ключевое слово Set, например

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