如何通过后界参数

时间:2009-07-22 21:14:07

标签: vb6 parameters late-binding

在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没有什么区别。有线索吗?难以记住。

4 个答案:

答案 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,您仍会在许多地方遇到此问题。例如,即使声明yAs Object,执行Debug.Print y仍会打印出默认属性或方法的值,执行VarType(y)仍会返回8 (字符串)。

确切知道VB6何时使用默认成员以及何时不会混淆。例如,如果您将y声明为Object,那么执行TypeName(y)将返回MyOwn.Class,但VarType(y)仍会返回8(字符串)。但是,如果您将y声明为Variant,则TypeName(y)会返回String

如果您使用后期绑定,则很难避免这种副作用,因为您只能将对象变量声明为ObjectVariant