在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 类并查看其属性和方法列表。如果您在角落里看到具有小蓝色圆圈图标的方法或属性,则指示该方法或属性是类的默认成员。如果您找到一个,我愿意打赌,它被宣布返回字符串。

请注意,即使您更改了所有 VariantS到 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副本,但是我记得经常做同样的事情,我相信我们使用了对象而不是在方法签名中的变体。通常,变体在变量上可能运行的转换类型的方式要少得多,而对于对象,我确定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时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top