For…Next
Цикл For. . .Nextявляется самой старой и самой простой конструкцией:
For Счетчик = Начальное_значениеТоКонечное_значение [StepШаг]
[Операторы]
Next[Счетчик]
В начале выполнения цикла значение Счетчик устанавливается в Начальное значение. При каждом проходе переменная Счетчик увеличивается на 1 или на величину шаг. Если она достигает или становится больше (меньше, при отрицательном шаге) Конечное значение, то цикл завершается и выполняются следующие операторы. Разность между начальным и конечным значением, деленная на величину шага, составляет число проходов:
For I = 1 То 10
Print I * 100 Next I
For L °= 100 To 5 Step k0.5
X k Y * L Next
I * ~__
For II = 1 To 5
For 12 = 10 To 20 Print II + 12
Next 12 Next II ‘Или ..(Next
12,11)
В этом примере представлены разные конструкции циклов For.. .Next. Часто для вычислений внутри цикла используются числовые переменные:
‘(General)(Declaration)
Dim aArray(1997 To 2050)
Private Sub Comniandl_Click ()
For I = LBound(aArray) To UBound(aArray)
Print aArray (I)
Next I
EndSub
В этом примере выводится все содержимое массива. Для безусловного выхода из цикла используется оператор Exit For.
Do... Loop
Если количество проходов должно зависеть от условия, используют цикл Do... Loop. В зависимости от позиции условия различают два варианта циклаDo...Loop.Цикл, управляемый в начале::
Do [(While | Until) Условие]
[Опера торы]
[Bxit Do]
[Операторы]
Loop
Цикл, управляемый в конце
Do
[Операторы]
[Exit Do]
[Операторы]
Loop [{While | Until} Условие]
Если условие проверяется в начале цикла, то он никогда не выполняется в случае невыполнения условия. Если же проверка происходит в конце, цикл выполняется как минимум один раз, независимо от того, выполнено условие или нет.
Тело цикла выполняется неопределенное число раз, пока условие не вызовет выход из цикла:
Do Until EOF(Файл)
Input #1, SomeData
Loop
Do
X = X + 1 Print “Hello”
Loop While X < 9
Рассмотренные варианты циклов Do... Loopпредоставляют разработчику большие возможности организации повторяющихся вычислений.
While…Wend
В Visual Basic цикл While. .. Wendиграет второстепенную роль. Он используется только для совместимости с другими диалектами Basic, а также для совместимости с более ранними версиями Visual Basic, в которых не было оператораDo. . .Loop.
WhileУсловие
[Операторы]
Wend
Принцип его действия такой же, как и цикла Do While.. . Loop. Поэтому вместо него проще использовать Do.. .Loop. Кроме того, для циклаWhile. . .Wendнет оператора досрочного выхода типа Exit:
While X = True
PrintTime
Wend
Массивы элементов управления
Массивы элементов управления подобны обычным массивам переменных.
Сам массив и его отдельные элементы различаются индексом. Пожалуй, вам уже приходилось создавать массив элементов управления. Это происходит при копировании элемента управления в буфер обмена. При вставке в ту же форму в ней находится еще и первоначальный элемент с тем же именем, что и в буфере обмена. Поэтому Visual Basic запрашивает, нужно ли создать массив элементов или следует дать новое имя добавляемому элементу управления.
Рис. 2.6. Îêíî Visual Basic при вставке в форму одноименного элемента управления из буфера обмена
Если на запрос ответить Нет, Visual Basic поместит в форму элемент управления и даст ему имя по умолчанию, например Command1. После ответа Да в форме появятся два элемента управления с одинаковым именем. Чтобы Visual Basic мог различать эти элементы, автоматически устанавливается свойство index.
Это можно заметить и в окне свойств. В списке элементов отображается несколько элементов управления с одинаковым именем, после которого в скобках указывается индекс. Значение индекса совпадает с указанным в строке index.
Рис. 2.6. Массив элементов управления в окне свойств
Если же вы хотите создать массив элементов управления, не обязательно идти окольным путем с использованием буфера обмена. Достаточно установить определенное значение для свойства index, в результате чего элемент управления автоматически становится первым членом массива. При добавлении следующего элемента он получает то же имя, но другой индекс. При этом все элементы управления в массиве должны иметь одинаковый тип. Еще одно преимущество использования массива элементов управления состоит в том, что все его элементы используют одни и те же процедуры событий. Для определения элемента, вызвавшего событие. Visual Basic передает в процедуру события аргумент Index.
Этот аргумент принимает различные значения для каждого элемента массива. Проверив это значение, можно определить, какое действие следует выполнять:
Private Sub CutCopy_Click(Index As Integer)
Call Copy
If Index = 0 Then Call Delete
End Sub
В этом примере всегда вызывается процедура Copy.Если элемент имеет индекс 0, то послеCopyдополнительно выполняется процедураDelete. Для массива элементов управления нс требуется указание индексов по порядку — каждому элементу можно присвоить произвольное значение, которое будет использовано в коде.
Предположим, вы хотите с помощью кнопки установить состояние формы, воспользовавшись свойством WindowState, которое может принимать три значения:
0 — для окна в нормальном представлении, 1 — в виде пиктограммы и 2 — для развернутого вида.
Теперь в форму добавим три кнопки с одинаковыми именами, значения индексов которых соответствует значениям свойства WindowState.
Рис. 2.7. Пример массиаа элементов управления
В общсп процедуре click индекс можно присвоить непосредственно свойству WndowStаte
Private Sub Window_Click(Index As Integer)
Form1.WindowState = Index
End Sub
Если щелкнуть на кнопке с индексом 0, форма отображается в обычном виде. Кнопка с индексом 1 сворачивает форму в пиктограмму, а третья кнопка разворачивает форму на весь экран.
Load
Иногда требуется использовать массив элементов управления, не зная заранее их количество. В этом случае следует воспользоваться оператором Load, который позволяет загрузить элемент управления во время работы приложения. Для этого нужен только элемент управления, определенный как массив (свойство index содержит определенное значение):
Private Sub Commandl_Click(Index As Integer)
Static nCounter As Integer
nCounter = nCounter + 1
Load Commandl(nCounter)
Command1(nCounter).Visible = True
Commandl(nCounter).Top = nCounter * 100
EndSub
В этом примере в форме изначально присутствует кнопка с индексом 0. В ходе выполнения программы каждый щелчок на любой кнопке добавляет новую. Переменная nCounter используется для определения индекса вновь загруженного элемента. С помощью свойства visible новый элемент отображается. Так как все свойства совпадают со свойствами исходного объекта, следует изменить также свойство Тор, чтобы кнопки не накладывались одна на другую.
Unload
С помощью оператора Unload удаляются в любой последовательности все загруженные во время выполнения элементы управления (за исключением тех, которые были созданы при проектировании):
Private Sub Commandl_Click(Index As Integer)
Unload Commandl(Index)
End Sub
Массивы элементов управления позволяют значительно сократить объем кода, который необходимо написать для управления программой.
Динамическое добавление элементов управления
Другой метод добавления элементов управления заключается в использовании метода Add семейства Controls. С помощью этого метода вы можете добавить в форму: элемент управления на основании существующего (например, еще одно поле для ввода); элемент управления нового типа (например, кнопку в форму в которой кнопок не было); элемент управления, ссылки на который до этого в проекте не было. Динамическое добавление элементов управления может быть использовано для расширения функциональных возможностей приложения даже после его создания и установки. Например, вы можете создать приложение, способное не только изменять набор доступных пользователю элементов управления в зависимости от прав пользователя или круга решаемых задач, но и считывать этот набор из файла или базы данных, что позволит модифицировать приложение без перекомпиляции и переустановки.
Синтаксис метода Add следующий:
object.Add (ProgiD, name, container)
где: object— обязательный параметр, представляющий собой объект (семействоControls), в который добавляется элемент управления.progiD — обязательный аргумент — строка идентификатор элемента управления. ЗначениеProgiDдля большинства элементов управления можно определить с помощью утилитыObject Browser;это значение обычно составляется из имени библиотеки и имени класса конкретного элемент управления (например, для элементаCommandButton ProgiD= VB.CommandButton).
name— обязательный аргумент — строка, идентифицирующая элемент семейства.container — необязательный аргумент — ссылка на объектkконтейнер для элемент управления. Если этот аргумент не определен или равен NULL, то принимается по умолчанию контейнер, которому принадлежит семейство controls. Приведем несколько примеров использования этого метода. В первом примере при загрузке формы динамически добавляется элемент управления CommandButton:
Private Sub Form_Load()
Forml.Controls.Add “VB.CommandButton”, “cmdObjl”, Framel
With FormlicmdObjl .Visible = True
Width = 2000
.Caption = “Динамическая кнопка”
EndWith
EndSub
Во втором примере объектная переменная типа CommandButton объявляется с использованием ключевого слова withEvents, что позволяет приложению обрабатывать события добавляемого элемента управления.
Option Explicit Private WithEvents btnObj As CommandButton
Private Sub btnObj_Click ()
MsgBox «Это динамически добавленная кнопка.»
End Sub
Private Sub Form_Load()
Set btnObj = Controls.Add(“VB.CommandButton”, “btnObj”)
With btnObj
.Visible = True .Width =2000
Caption= “Hello”
.Top= 1000
.Left= 1000
EndWith
EndSub
В третьем примере добавляется элемент управления, ссылки на который в проекте не было. Для обработки событий такого элемента управления вы должны объявить объектную переменную типа VBControlExtenderи затем присвоить ей ссылку на объект, возвращаемую методомAdd.Обработка всех событий элемента управления выполняется в процедуре обработки событияObjectEvent.
Option Explicit
Dim ctlExtender As VBControlExtender
Private Sub Form_Load()
Set ctlExtender = Controls.Add(“Projectl.UserControll”, “MyControl”)
With ctlExtender
Visible = True
Top [ 1000 \. .Left = 1000
End With
End Sub
Private Sub extObj_ObjectEvent(Info As Eventlnfo)