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

时间:2011-08-29 23:43:49

标签: collections vb6 casting

在VB6中获得一些奇怪的行为,我正在为一些答案抛出一个网。

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

Dim formCollection As New Collection

Public Sub AddForm()
    Dim newForm As New frmCustomForm
    formCollection.Add(newForm)
End Sub

然后在另一个例程中我遍历集合。但是当我将变量强制转换回自定义表单类时,我得到了类型转换错误(“运行时错误'13':类型不匹配”)。

Public Sub Foo()
    Dim someForm As frmCustomForm
    Dim iterator As Integer

    For iterator = 1 To formCollection.Count
        Set someForm = formCollection.Item(iterator) ' The error appears here
        someForm.SomeProperty = 3
    Next iterator
End Sub

似乎虽然最初它是自定义表单类,因为它存储到集合中,它丢失了它的类型,无法返回。此外,如果我在尝试转换存储的表单之前放置​​断点然后通过Locals检查对象,则会丢失所有类特定的信息,例如属性名称,这些信息仅显示为“Item 1”,“Item 2”,第3项,等等。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

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

    formCollection.Add newForm

或者

    Call formCollection.Add(newForm)

在您的情况下,括号强制VB6评估对象引用的默认属性,并将其存储在集合中,而不是表单引用中。

通常在IDE中就像在这个

之前的开始括号中获得额外的空间
    formCollection.Add (newForm)

这会让你更加怀疑。

答案 1 :(得分:1)

尝试:

Public Sub Foo()
    Dim someForm As frmCustomForm

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

答案 2 :(得分:0)

Scripting.Dictionary可能比Collection更好。它比集合更强大,更快。您需要在项目中引用scrrun.dll。