6.2. Использование элементов управления и создание собственных диалоговых окон
Элемент управления Список(ListBox) применяется для хранения списка значений. В списке пользователь может выбрать одно или несколько значений, которые в последующем используются в программе. Выбор списка производится щелчком по элементу. Двойной щелчок применяется с целью выполнения каких-либо действий в программе, связанной с этим элементом. Наиболее часто используемые свойства:
ListIndex - возвращает номер выбранного элемента списка. Нумерация элементов списка начинается с нуля. Если ни один элемент из списка не выбран, то свойство возвращает -1;
ListCount - возвращает число элементов списка;
TopCount - возвращает элемент списка с наибольшим номером;
TextColumn - устанавливает столбец в списке, стоящий на пересечении указанной строки и столбца;
Text - возвращает выбранный в списке элемент;
List - возвращает элемент списка, стоящий на пересечении указанной строки и столбца. Синтаксис: List(Row,Source). Строки и столбцы нумеруются с нуля.
Для заполнения и удаления списка применяются методы RemoveItem, AddItem и Clear:
Clear - удаляет все элементы из списка;
RemoveItem - удаляет из списка элемент с указанным номером. Синтаксис:
RemoveItem(index), где index - номер удаляемого элемента;
AddItem - добавляет элемент в список. Синтаксис:
AddItem(item[, varIndex]), где item - элемент (строковое выражение) добавляемый, добавляемый в список; varIndex - номер добавляемого элемента
В примере на рис.3 при нажатии кнопки с надписью «Add Element»(CommandButton1) добавляется один элемент списка в элемент ListBox1 на рабочем листе Excel. При выделении мышью какого-либо элемента в списке, он отображается на листе Excel. При нажатии кнопки с надписью ”Clear ListBox ” (CommandButton2) происходит очистка списка.
Private Sub CommandButton1_Click()
Dim i As Integer
i = ListBox1.ListCount + 1
ListBox1.AddItem "Элемент" & CStr(i)
End Sub
Private Sub CommandButton2_Click()
ListBox1.Clear
End Sub
Private Sub ListBox1_Click()
Dim i As Integer
i = ListBox1.ListIndex + 1
Sheets("Лист1").Cells(i, 4).Value = ListBox1.Text
Sheets("Лист1").Cells(i, 5).Value = ListBox1.ListIndex + 1
End Sub
Для создания многоколоночного списка следует установить свойство ColumnCount, которое задаёт, сколько столбцов будет в списке. Кроме того, при работе с таким списком полезно определить значение свойства ColumnWidths, которое устанавливает ширину каждого столбца. А затем список надо заполнить. Нумерация столбцов в списке начинается с нуля. В качестве примера создания списка с несколькими столбцами рассмотрим простой проект, в котором производится вычисление значений функции sin(x) на промежутке от a до b с шагом h, а результат выводится в список с двумя столбцами. На листе расположим по три надписи, два поля ввода и список.
Private Sub CommandButton1_Click()
lstTab.ColumnCount = 2
lstTab.ColumnWidths = "60;60"
Dim a As Double, b As Double, h As Double
Dim x As Double, f As Double, i As Long
Dim Values() As Double
a = CDbl(txtA.Text)
b = CDbl(txtB.Text)
h = CDbl(txtH.Text)
If (b - a) / h < 1 Then Exit Sub
ReDim Values((b - a) / h, 1)
i = 0
For x = a To b Step h
f = Sin(x)
Values(i, 0) = x
Values(i, 1) = f
i = i + 1
Next x
lstTab.List = Values
End Sub
Р ассмотрим два примера получения в многостолбцовом списке выбранного значения из произвольного столбца. Первый пример основан на свойстве ListIndex, определяющем номер выбранной в списке строки, и свойстве List(row, column), где row - номер строки, а column - номер столбца. Здесь lstNumbers - имя списка, lblFirst и lblSecond - имена текстовых окон.
Private Sub CommandButton1_Click()
Dim i As Integer
Randomize
For i = 0 To 299
lstNumbers.AddItem i
lstNumbers.List(i,1)= Int(101 * Rnd())
lstNumbers.List(i,2)= Int(101 * Rnd())
Next i
End Sub
Private Sub lstNumbers_Click()
lblFirst.Caption = lstNumbers.List(lstNumbers.ListIndex, 1)
lblSecond.Caption = lstNumbers.List(lstNumbers.ListIndex, 2)
End Sub
Второй пример основан на свойстве TextColumn, устанавливающем номер столбца, значение которого в списке возвращается свойством Text, а также на свойстве BoundColumn, задающем номер столбца, значение которого в списке возвращается свойством Value (программа для той же группы элементов). Для работы с этими свойствами после создания списка в окне свойств для него задаются значения этих свойств. В нашем случае (для той же группы элементов) задайте - 2 для свойства TextColumn и 3 для свойства BoundColumn. Затем для тех же элементов наберите следующие коды:
Private Sub CommandButton1_Click()
Dim i As Integer
Randomize
For i = 0 To 299
lstNumbers.AddItem i
lstNumbers.List(i, 1) = Int(101 * Rnd())
lstNumbers.List(i, 2) = Int(101 * Rnd())
Next i
End Sub
Private Sub lstNumbers_Click()
lblFirst.Caption = lstNumbers.Text
lblSecond.Caption = lstNumbers.Value
End Sub
Если выделенные в списке значения ваша программа использует в вычислениях, то следует учитывать, что обращения к колонкам с целыми числами можно использовать без всяких ограничений – Visual Basic автоматически преобразует строки в целые числа. А вот при работе с вещественными числами необходимо использование встроенной функции Val, преобразующей строку в вещественное число, так как Visual Basic не преобразует автоматически строки в вещественные числа. Например, в следующем примере числа из 2 и 3 столбцов выделенной строки списка суммируются и результат выводится в текстовое окно.
Private Sub CommandButton1_Click()
Dim i As Integer
Randomize
For i = 0 To 19
ListBox1.AddItem i
ListBox1.List(i, 1) = 101 * Rnd()
ListBox1.List(i, 2) = 101 * Rnd()
Next i
End Sub
Private Sub ListBox1_Click()
Label1.Caption = Val(ListBox1.List(ListBox1.ListIndex, 1)) + _
Val(ListBox1.List(ListBox1.ListIndex, 2))
End Sub
Здесь обращения к числам в списке находятся в функции Val.
Элемент управления Поле со списком применяется для хранения списка значений. Сочетает в себе возможности списка и поля ввода. В отличие от списка у него отображается только один элемент. Возможность выделения нескольких элементов отсутствует. Позволяет пользователю вводить значения через поле ввода как в элементе Поле. Свойства ListBox,
ListIndex, методы Clear, RemoveItem и AddItem полностью аналогичны таким же свойствам в Списке. Кроме того, есть ряд уникальных свойств:
DropButtonStyle – устанавливает вид поля со списком. Допустимые значения: fmDropButtonStylePlain или 0 - кнопка без символов; fmDropButtonStyleArrow или 1 - кнопка со стрелкой; fmDropButtonStyleEllipsis или 2 - кнопка с эллипсом; fmDropButtonStyleReduce или 3 – кнопка с линией.
ListRows - устанавливает количество элементов, отображаемых в поле со списком;
MatchRequired - допустимые значения: true – в поле нельзя ввести значения, отличные от перечисленных в списке; false – значения, отличные от перечисленных в списке ввести можно.
MatchFound - допустимые значения: true – среди элементов поля со списком имеется элемент, совпадающий с элементом в поле ввода; false - в противном случае.