Элементами массивов могут быть элементы управления, располагаемые на форме. Если вы часто копируете элементы управления при разработке форм, то, наверное, не раз перед вставкой скопированного элемента на форму сталкивались с сообщением, «любезно» предоставляемым VB-редактором и похожим на то, которое вы видите на рис. 10.2.
Рис. 10.2
При вставке ранее скопированного в Clipboard элемента управления, скорее всего, вы получите такое сообщение-вопрос
Таким образом Visual Basic предупреждает вас о том, что элемент управления с именем Option1 уже имеется на форме, и предлагает создать массив элементов типа Option с именем Option1. Вы можете даже никогда не столкнуться с таким сообщением, если вам не лень обращаться за новыми элементами формы к панели ToolBox. Но, с другой стороны, если вы действительно хотите создать массив элементов управления одного тира, то использование этого диалогового окна — один из способов построить такой массив.
Если вашим ответом на VB-вопрос будет «Yes», то Visual Basic создаст массив элементов управления с именем скопированного в Clipboard элемента. Первым (с индексом 0) элементом массива будет скопированный элемент управления, вторым (с индексом 1) — вставляемый элемент. Далее вы можете продолжить операцию вставки и разместить на форме несколько однотипных элементов массива.
Работать с массивом элементов управления также легко, как и с обычным массивом. Только в данном случае вы будете иметь дело с массивом объектов, которые обладают свойствами, методами и событиями.
В качестве примера (в общем-то, непростого) рассмотрим следующую форму (в режиме разработки), на которой расположены массивы элементов управления (рис. 10.3).
Рис. 10.3
Форма в режиме разработки, на которой расположены массивы элементов управления
Как обычно, приведем таблицу со свойствами элементов управления, но не со всеми (их слишком много), а с теми, которые будут использоваться в рассматриваемом далее коде.
Тип элемента
Свойство
Значение
Примечание
Frame
Name
Frame1
Содержит элемент List1
Caption
Склад
ListBox
Name
List1
Список складов
Frame
Name
Frame2
Содержит три массива элементов управления
Caption
Типы накладных
OptionButton
Name
Option1(0)
Caption
Продажа/Возврат
OptionButton
Name
Option1(1)
Caption
Прием:
OptionButton
Name
Option1(2)
Caption
Предача:
OptionButton
Name
Option1(3)
Caption
Регистрация
CheckBox
Name
Check1(0)
Caption
со складов
CheckBox
Name
Check1(1)
Caption
из оптовых магазинов
CheckBox
Name
Check1(2)
Caption
из рознич. магазинов
CheckBox
Name
Check2(0)
Caption
на склады
CheckBox
Name
Check2(1)
Caption
в оптовые магазины
CheckBox
Name
Check2(2)
Caption
в рознич. магазины
CommandButton
Name
OK
Caption
OK
ListBox
Name
List2
Список групп товаро
ListBox
Name
List4
Список контрагентов
Обратите внимание на наличие в этой таблице массивов Option1(),Check1() и Check2(). В листинге 10.4 приведен код процедуры OKED, которая управляет состоянием (свойством Enabled) кнопки ОК в зависимости от состояния других элементов управления. Эта процедура вызывается в коде событийных процедур элементов управления, которые должны влиять на возможность работы формы, в частности, кнопки ОК.
истинг 10.4. Тестирование функции inervals
1 Private Sub OKED()
2 'управление состоянием кнопки OK
3 Dim i As Integer
5 'какая кнопка выбрана в Option1
6 For i = 0 To 3
7 If Option1.Item(i) Then
8 Exit For
9 End If
10 Next
12 Select Case i
14 Case Is = 0, 3
15 If FunSelectList(List1) And FunSelectList(List2) Then
16 OK.Enabled = True
17 Else
18 OK.Enabled = False
19 End If
21 Case Is = 1, 2
22 If FunSelectList(List1) And FunSelectList(List2) _
23 And FunSelectList(List4) Then
24 OK.Enabled = True
25 Else
26 OK.Enabled = False
27 End If
29 End Select
31 End Sub
В строках 6–10 определяется номер выбранной кнопки массива Option1(). Номер кнопки сохраняется в переменной i. В строках 12–29 посредством структуры Select Case происходит анализ переменной i и выполняются соответствующие операторы, в том числе и управляющие значением свойства Enabled кнопки OK.
Результат функции FunSelectList (строки 15, 22–23) также учитывается при определении значения свойства Enabled кнопки OK. Функция FunSelectList содержит следующий код и уже была описана в главе 8.
Function FunSelectList(ObjList As Object) As Boolean
' проверка наличия выделенных элементов в списке List
Dim i As Integer
FunSelectList = False
For i = 0 To ObjList.ListCount - 1
If ObjList.Selected(i) Then
FunSelectList = True
Exit For
End If
Next
End Function
Событийные процедуры элементов Check1(), Check2() и List1 вызывают процедуру OKED:
Private Sub Check1_Click(Index As Integer)
Update_List4 (1)
Call OKED
End Sub
Private Sub Check2_Click(Index As Integer)
Update_List4 (2)
Call OKED
End Sub
Private Sub List1_Click()
Call OKED
End Sub
Обратите внимание на синтаксис заголовков событийных процедур для объектов, содержащихся в массивах: для всего массива используется только одна процедура, с параметром — индексом элемента.