Collections VB6:在集合中存储和检索表单

Collections VB6:在集合中存储和检索表单,collections,vb6,casting,Collections,Vb6,Casting,在VB6中出现了一些奇怪的行为,我正在抛出一张网来寻找一些答案 我有一个集合,用于存储一组相同类型的自定义表单 Dim formCollection As New Collection Public Sub AddForm() Dim newForm As New frmCustomForm formCollection.Add(newForm) End Sub 然后在另一个例程中,我遍历集合。但是当我将变量转换回自定义表单类时,我得到了一个类型转换错误(“运行时错误'13'

在VB6中出现了一些奇怪的行为,我正在抛出一张网来寻找一些答案

我有一个集合,用于存储一组相同类型的自定义表单

Dim formCollection As New Collection

Public Sub AddForm()
    Dim newForm As New frmCustomForm
    formCollection.Add(newForm)
End Sub
然后在另一个例程中,我遍历集合。但是当我将变量转换回自定义表单类时,我得到了一个类型转换错误(“运行时错误'13':类型不匹配”)

看起来,虽然最初它是自定义表单类的,但当它被存储到集合中时,它丢失了它的类型,并且不能被重新铸造。此外,如果在尝试强制转换存储表单之前放置断点,然后通过局部变量检查对象,则会丢失所有特定于类的信息,例如属性名,这些信息仅显示为“Item 1”、“Item 2”、“Item 3”等


有什么想法吗?

Scripting.Dictionary可能比Collection更能帮助您。它比Collections功能强大且速度更快。您需要在项目中引用scrrun.dll。

请尝试:

Public Sub Foo()
    Dim someForm As frmCustomForm

    For Each someForm In formCollection
        someForm.SomeProperty = 3
    Next
End Sub

在VB6中不能使用这样的括号。试试这个

    formCollection.Add newForm
还是这个

    Call formCollection.Add(newForm)
在本例中,括号强制VB6计算对象引用的默认属性,该属性存储在集合中,而不是表单引用中

通常,在IDE中,在像这样的开始括号之前会有一个额外的空间

    formCollection.Add (newForm)

这会让你更加怀疑。

这也不起作用,因为我也会犯同样的错误。这个问题听起来像是我这边的一个错误,或者是打字的一个更基本的问题是由VB6处理的。哇,这很有效,谢谢!这是有趣的行为。所以括号并不总是VB6中的函数参数语法?例如,“FunctionFoo(argument)”计算参数,但“FunctionFoo(argument1,argument2)”是完全不同的行为,即函数的参数列表。此外,编译器分析“FunctionFoo(argument)”括号的方式不同于“result=FunctionFoo(argument)”,对吗?
在使用子函数/函数的返回值时必须围绕参数(此处包括调用),但在不使用返回值时不得使用这些参数。这意味着,如果将它们放入,它们将返回到@wqw提到的默认计算。
FunctionFoo(argument1,argument2)
是一个语法错误。要保留括号,您需要
Call
或将其作为表达式(包括赋值)的一部分。回答正确-括号强制参数以ByVal传递,而不管函数定义中的ByVal或ByRef关键字如何。因此,您要么需要丢失方括号,要么对单参数方法使用Call。
    formCollection.Add (newForm)