在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没有什么区别。有线索吗?难以记住。
答案 0 :(得分:2)
我没有VB6的副本,但我记得或多或少经常做同样的事情,我相信我们在方法签名中使用了Object而不是Variant。 Variant在变量上可以运行的转换类型通常不太可预测,而使用Object我很确定VB不会尝试任何类型的转换。
答案 1 :(得分:0)
您确定没有省略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对象浏览器中标有蓝点)?
答案 2 :(得分:0)
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时,您创建的对象不是Variant。 通常传递Object时,使用ByRef。
答案 3 :(得分:0)
我使用了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
。