题
在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
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不会尝试任何类型的转换。
您确定尚未省略集合关键字
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时。