VB6: Хранение и получение форм в коллекции - PullRequest
3 голосов
/ 30 августа 2011

Получаю странное поведение в 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 ]

3 голосов
/ 30 августа 2011

Вы не можете использовать подобные скобки в VB6.Попробуйте это

    formCollection.Add newForm

или это

    Call formCollection.Add(newForm)

В вашем случае скобки заставляют VB6 вычислять свойство по умолчанию для ссылки на объект, и оно сохраняется в коллекции, а не в ссылке на форму.

Обычно вы получаете дополнительный пробел в IDE непосредственно перед открывающей скобкой, как это

    formCollection.Add (newForm)

, что должно сделать вас более подозрительным.

1 голос
/ 30 августа 2011

Попробуйте:

Public Sub Foo()
    Dim someForm As frmCustomForm

    For Each someForm In formCollection
        someForm.SomeProperty = 3
    Next
End Sub
0 голосов
/ 30 августа 2011

Scripting.Dictionary может помочь вам лучше, чем коллекция. Это мощнее и быстрее, чем коллекции. Вам нужно будет ссылаться на scrrun.dll в вашем проекте.

...