如何通过后期绑定的参数(How to Pass a Late Bound Parameter)

2019-09-20 07:49发布

在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不有所作为。 任何线索? 无法记住。

Answer 1:

我用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(串)。 但是,如果你声明yVariant ,那么TypeName(y)返回String

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



Answer 2:

我没有VB6方便的拷贝,但我还记得或多或少相当经常做同样的事情,我相信,我们使用的对象,而不是变的方法签名。 变体一般是少了很多可预见的是什么类型的转换,可能对一个变量运行方面,而与对象我相当肯定VB不会尝试任何类型的转换。



Answer 3:

你确定你没有忽略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对象浏览器一个蓝点)的默认成员的属性?



Answer 4:

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。



文章来源: How to Pass a Late Bound Parameter