Нужна помощь в добавлении пользовательского объекта в пользовательскую коллекцию - PullRequest
0 голосов
/ 17 февраля 2011

Допустим, у меня есть пользовательская коллекция и пользовательский объект, имеющий отношение Parent-Child

У меня есть пользовательская форма, в которой пользователь называет коллекцию и предоставляет входные данные для других свойств коллекции.Когда они нажимают «Добавить родителя», событие click обрабатывается и вызывает следующую функцию:

Public Function AddParent()

    Dim newParent As clsParent

    Set newParent = New clsParent

    'Add Parent Properties'

        With frmAddParent
            newParent.Name = .cboParentName.Value
            newParent.Width = .txtParentWidth.Value
            newParent.Xslope = .txtParentCrossSlope.Value
        End With

    'show the form for creating the Child Object'

    frmAddLaneMaterial.Show

End Function

Затем пользователь видит новую форму для создания дочернего объекта.Когда пользователь нажимает «Добавить дочерний элемент», событие обрабатывается и вызывает следующую функцию:

Public Function AddChild()

    Dim newChild As clsChild
    Set newChild = New clsChild

        'Add child Properties'

        With frmAddChild

            newChild.Name = .cboParentName.Value
            newChild.LayerNumber = .cboLayerNum.Value
            newChild.xSlope = newParent.Xslope

        End With

    'Add the new child to the parent collection'

    newParent.Add newChild

End Function 

И затем пользователь должен иметь возможность вернуться к пользовательской форме и добавить другого дочернего элемента.

Строки, которые не будут работать:

            newChild.xSlope = newParent.Xslope

и:

newParent.Add newChild

Я получаю ошибку «Требуется объект».

Как я / гдедобавить ребенка в родительскую коллекцию?

1 Ответ

1 голос
/ 17 февраля 2011

Прежде всего, newParent является локальным для функции AddParent, поэтому AddChild не имеет ее видимости. Чтобы это исправить, вам нужно переместить Dim newParent As clsParent из функции AddParent и сделать ее переменной уровня модуля. Предполагается, что AddParent и AddChild находятся в одном модуле.

Во-вторых, newParent.Add newChild будет работать, только если вы написали метод Add в clsParent. Если нет, то вам нужно написать один. Я понятия не имею, как вы планируете использовать его, но следующий код довольно общий и должен направить вас в правильном направлении. Этот код будет идти в модуле clsParent:

Private m_oChildren As Collection

Sub Add(Child As clsChild)
    If m_oChildren Is Nothing Then Set m_oChildren = New Collection
    m_oChildren.Add Child
End Sub

Это создаст личную коллекцию clsChild объектов, которыми вы будете манипулировать, используя дополнительные методы, или открывайте через Property Get.

ОБНОВЛЕНИЕ : Чтобы ответить на ваш комментарий, если вы хотите сохранить нескольких родителей, вам нужно добавить коллекцию для этого. Например:

Dim Parents As Collection

Public Function AddParent()
Dim newParent As clsParent
    Set newParent = New clsParent

    'Add Parent Properties'
    With frmAddParent
        newParent.Name = .cboParentName.Value
        newParent.Width = .txtParentWidth.Value
        newParent.Xslope = .txtParentCrossSlope.Value
    End With

    'Initialize the collection of Parents if it has not already been done'
    If Parents Is Nothing Then Set Parents = New Collection
    'Add the new parent object to the Parents collection'
    Parents.Add newParent

    'show the form for creating the Child Object'
    frmAddLaneMaterial.Show
End Function


Public Function AddChild()
Dim newChild As clsChild
    Set newChild = New clsChild

    'Add child Properties'
    With frmAddChild
        newChild.Name = .cboParentName.Value
        newChild.LayerNumber = .cboLayerNum.Value
        newChild.xSlope = newParent.Xslope
    End With

    'Add the new child to the most recently added parent in the parent collection'
    Parents.Item(Parents.Count).Add newChild

End Function

Конечно, теперь у вас есть еще одна коллекция для отслеживания. Это действительно сложно отслеживать несколько экземпляров форм (что, я полагаю, и есть то, что вы делаете), и легко неожиданно оказаться в неуправляемом беспорядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...