FAQ по Visual Basic

Содержание / Начальные сведения о VB Поиск | Далее

§ 3.5. Как в ран-тайме добавить на форму контрол?

Прежде всего, надо создать на форме элемент управления с индексом 0. Для примера пусть это будет текстовое поле. Положите на форму TextBox и установите ему Index = 0. В нужный момент новые элементы создаются с помощью оператора Load:

Private Sub Form_Load()
    Dim i As Long
    For i = 1 To 8
        Load Text1(i)
        With Text1(i)
            .Move 0, Text1(0).Height * (i - 1)
            .Text = i
            .Visible = True
        End With
    Next i
End Sub

Обратите внимание: свойство Visible только что созданного контрола всегда равно False, поэтому чтобы он отображался на экране, это свойство нужно установить в True. Аналогично, имеет смысл определить положение и размеры контрола.

Заголовок процедуры-обработчика событий для массива контролов отличается от аналогичного для простого контрола:

Private Sub Text1_Change(Index As Integer)

End Sub

Здесь появляется лишний аргумент — индекс элемента управления, по которому можно точно определить объект, от которого пришло событие.

Если тип создаваемого объекта неизвестен или если вам не хочется создавать лишние элементы управления на форме, то можно пойти другим путем.

Private Sub Form_Load()
    Dim i As Long, tb As TextBox
    For i = 1 To 8
        Set tb = Controls.Add("VB.TextBox", _
            "Text" & i)
        With tb
            .Move 0, ScaleY(21, vbPixels) * (i - 1), _
                  ScaleX(80, vbPixels), _
                  ScaleY(21, vbPixels)
            .Text = i
            .Visible = True
        End With
    Next i
End Sub

Здесь элементы управления создаются с помощью функции Controls.Add; первый аргумент — ProgID контрола, второй — его будущее имя.

Чтобы ловить события от созданных контролов, нужно описать их с ключевым словом WithEvents. Но если создаваемых элементов много, то можно проделать такой трюк. Добавьте в проект класс clsHandler и вставьте в него следующий код:

Private WithEvents mTextBox As TextBox
Private mParent As Form1

Public Sub Initialize(ByVal Object As TextBox, _
        ByVal Parent As Form1)
    Set mTextBox = Object
    Set mParent = Parent
End Sub

Private Sub mTextBox_Change()
    Form1.TextBoxChange mTextBox
End Sub

А этот код поместите в модуль формы:

Private mHandlers() As clsHandler

Public Sub TextBoxChange(ByVal Object As TextBox)
    Object.Text = UCase$(Object.Text)
End Sub

Private Sub Form_Load()
    Dim i As Long, tb As TextBox
    ReDim mHandlers(1 To 8)
    For i = 1 To 8
        Set tb = Controls.Add("VB.TextBox", "Text" & i)
        With tb
            .Move 0, ScaleY(21, vbPixels) * (i - 1), _
                  ScaleX(80, vbPixels), _
                  ScaleY(21, vbPixels)
            .Text = i
            .Visible = True
        End With
        Set mHandlers(i) = New clsHandler
        mHandlers(i).Initialize tb, Me
    Next i
End Sub

Запустите проект и попробуйте что-либо ввести в какое-нибудь из полей ввода.

Автор:
Master

Предыдущий раздел Следующий раздел

© 2004. При цитировании, пожалуйста, не забудьте поставить ссылку на оригинальную страницу.