在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的内容。 - ssorrrell 55分钟前
这似乎证实了我的怀疑。 该MyOwn.Object
类必须有一个返回字符串的默认属性或方法。
因此,当您尝试Debug.Print
它,它就会返回默认属性/方法的价值。 当你将鼠标悬停在变量在IDE中,VB6会显示默认属性/方法的价值。 当你做一个VarType
的调用y
它将返回变量类型的默认属性或方法。
其原因是,当你有类型的变量Variant
存储的Object
,而该对象的类定义了一个默认的方法或属性,变量将评估在大多数情况下,默认方法或属性的返回值。
您可以快速检查,看看是否MyOwn.Object
类有打开对象浏览器的默认成员MyOwn.Object
类,并看它的属性和方法的列表。 如果您发现有在角落里的小蓝圈图标的方法或属性,表示该方法或属性类的默认成员。 如果你发现一个,我敢打赌,它的声明返回一个字符串。
需要注意的是,即使你改变了你所有的Variant
s到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方便的拷贝,但我还记得或多或少相当经常做同样的事情,我相信,我们使用的对象,而不是变的方法签名。 变体一般是少了很多可预见的是什么类型的转换,可能对一个变量运行方面,而与对象我相当肯定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。