Как передать параметр с поздней привязкой
-
19-09-2019 - |
Вопрос
В 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
С Object
S, вы все равно столкнетесь с этим поведением в ряде мест. Например, даже если 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.