Структура цикла
Структуры циклов позволяют повторно выполнять одну или несколько строк кода. Структуры циклов, поддерживаемые Visual Basic:
1.Делать...Петля
2.Для...Далее
3.Для каждого...Далее
Делай...Петля
Используйте цикл Do для многократного выполнения блока операторов переменное количество раз. Существует несколько вариантов оператора Do...Loop, но каждый из них оценивает числовое условие, чтобы решить, продолжать ли выполнение. Подобно If...Thencondition должно быть числовым значением или выражением, значение которого равно True (ненулевое) или False (нулевое). В следующем цикле Do...Loop операторы выполняются, пока условие истинно.
Выполнить условие
заявления
Петля
Когда Visual Basic выполняет этот цикл Do, он сначала проверяет условие. Если условие имеет значение False (ноль), все операторы пропускаются. Если условие имеет значение True (отличное от нуля), Visual Basic выполняет инструкцию, а затем возвращается к инструкции DoWhile, чтобы еще раз проверить условие.
Таким образом, цикл может выполняться столько раз, сколько необходимо, пока условие истинно или ненулевое. Если условие с самого начала имеет значение False, оператор не будет выполнен. Например, следующая процедура подсчитывает количество раз, когда целевая строка появляется в другой строке, и выполняет цикл всякий раз, когда целевая строка найдена:
FunctionCountStrings(длинная строка,цель)
Размерность, кол.
позиция=1
DoWhileInStr(позиция, длинная строка, цель)
позиция=InStr(позиция,длинная строка,цель)_
1
счет=счет 1
Петля
CountStrings=количество
Конечнаяфункция
Если целевая строка не появляется в другой строке, InStr возвращает 0, и цикл больше не выполняется.
Другой вариант оператора Do...Loop заключается в том, что сначала выполняется оператор, а затем проверяется условие после каждого выполнения. Эта форма гарантирует, что операторы выполняются хотя бы один раз:
Делать
заявления
ЦиклПокаусловие
Два других варианта аналогичны первым двум, за исключением того, что они выполняют цикл всякий раз, когда условие имеет значение False, а не True.
Для...Следующих000
Если вы не знаете, сколько раз оператор должен быть выполнен в цикле, уместно использовать цикл Do. Однако, когда вы знаете, сколько раз вы хотите выполнить операцию, лучше использовать цикл For...Next. В отличие от цикла Do, цикл For использует переменную, называемую счетчиком. При каждом повторении цикла значение переменной счетчика увеличивается или уменьшается. Синтаксис цикла For следующий:
Forcounter=startToend[Stepincrement]
заявления
Следующий[счетчик]
Параметры Counter, Start, End и приращение являются числовыми.
Обратите внимание, что параметр приращения может быть положительным или отрицательным. Если приращение положительное, значение Start должно быть меньше или равно значению end, иначе оператор внутри цикла не может быть выполнен. Если приращение отрицательное, значение Start должно быть больше или равно значению end, чтобы можно было выполнить тело цикла. Если шаг не установлен, значение приращения по умолчанию равно 1.
При выполнении цикла For Visual Basic
1. Установите счетчик равным стартовому.
2. Проверьте, превышает ли счетчик значение end. Если это так, Visual Basic выходит из цикла. (Если приращение отрицательное, Visual Basic проверяет, меньше ли значение счетчика конца.)
3. Выполните оператор.
4. Счетчик увеличивается на единицу или увеличивается (если указано).
5. Повторите шаги 2–4.
Следующий код выводит все допустимые имена экранных шрифтов:
PRivateSubForm_Click()
ДимИасИнтегер
Фори=0ToScreen.FontCount
PrintScreen.Fonts(i)
Следующий
EndSub
В примере приложения VCR процедура HighlightButton использует цикл For...Next для пошагового прохождения коллекции элементов управления формы VCR и отображения соответствующего элемента управления Shape:
SubHighlightButton (MyControlAsVariant)
ДимиАсИнтегер
Fori=0TofrmVCR.Controls.Count-1
IfTypeOffrmVCR.Controls(i)IsShapeThen
IffrmVCR.Controls(i).Name=MyControlThen
frmVCR.Controls(i).Visible=Истина
Еще
frmVCR.Controls(i).Visible=False
КонецЕсли
КонецЕсли
Следующий
EndSub
ForEach...Далее
Цикл ForEach...Next аналогичен циклу For...Next, но он повторяет набор операторов для каждого элемента массива или коллекции объектов, а не повторяет операторы определенное количество раз. Цикл ForEach...Next полезен, если вы не знаете, сколько элементов содержит коллекция.
Синтаксис цикла ForEach...Next следующий:
ForEachelementIngroup
заявления
Следующийэлемент
Например, следующая подпрограмма открывает Biblio.mdb и добавляет имя каждой таблицы в список.
SubListTableDefs()
База данных DimobjDbAs
DimMyTableDefasTableDef
SetobjDb=OpenDatabase(c:/vb/biblio.mdb,_
Правда, неправда)
ForEachMyTableDefInobjDb.TableDefs()
List1.AddItemMyTableDef.Name
СледующийMyTableDef
EndSub
Пожалуйста, имейте в виду несколько ограничений при использовании ForEach... Далее:
1. Для коллекций элементом может быть только переменная Variant, общая переменная объекта или объект, указанный в «Обозревателе объектов».
2. Для массивов элементом может быть только переменная Variant.
3.ForEach...Next нельзя использовать с массивами пользовательских типов, поскольку Variant не может содержать пользовательские типы.
Используйте структуры управления
Вложенные структуры управления помещают структуру управления внутри другой структуры управления (например, блок If...Then в цикле For...Next). Структура управления, содержащая другую структуру управления, называется гнездом. В Visual Basic нет ограничений на количество вложенных уровней управляющих структур. Как правило, чтобы сделать структуры суждений и структуры циклов более читабельными, текст структур суждений или циклов всегда пишется с отступом.
Например, следующий процесс распечатывает все имена шрифтов, общие для принтера и экрана:
PrivateSubForm_Click()
ДимСФонт, ПФонт
ФорЕачСФонтИнСкрин.Фонтс()
ФорЕачПФонтИнПринтер.Фонтс()
ЕслиSFont=PFontThen
PrintSFont
КонецЕсли
СледующийPFont
СледующийSFont
EndSub
Обратите внимание, что первый оператор Next закрывает внутренний цикл For, а последний For — внешний цикл For. Аналогично, во вложенных операторах If оператор EndIf автоматически объединяется с ближайшим предыдущим оператором If. Вложенные структуры Do...Loop работают одинаково: самый внутренний оператор Loop соответствует самому внутреннему оператору Do.
структура контроля выхода
Используйте оператор Exit для прямого выхода из цикла For, цикла Do, подпроцесса или процесса функции. Синтаксис оператора Exit очень прост: нет ограничений на количество раз, когда ExitFor может появляться в цикле For, и нет ограничений на количество раз, когда ExitDo может появляться в цикле Do.
Forcounter=startToend
[Шаговый шаг]
[блок инструкций]
[ВыходДля]
[блок инструкций]
Следующий[счетчик[,счетчик][,...]]
Выполнить[{Пока|До}условия]
[блок инструкций]
[ВыходDo]
[блок инструкций]
Петля
Оператор ExitDo можно использовать во всех версиях синтаксиса цикла Do.
ExitFor и ExitDo полезны, поскольку иногда целесообразно немедленно выйти из цикла, не выполняя никаких дальнейших итераций или операторов внутри цикла. Например, в предыдущем примере шрифта, совместно используемого экраном печати и принтером, программа продолжала сравнивать шрифт принтера с заданным экранным шрифтом даже после того, как нашла соответствующий шрифт пишущей машинки. Существует более эффективная версия этой функции, которая выходит из цикла, как только найден подходящий шрифт:
PrivateSubForm_Click()
ДимСФонт, ПФонт
ForEachSFontInScreen.Fonts()
ФорЕачПФонтИнПринтер.Фонтс()
ЕслиSFont=PFontThen
ПечатьШрифт
ExitFor 'Выход из внутреннего цикла.
КонецЕсли
СледующийPFont
СледующийSFont
EndSub
Как показано в этом примере, операторы Exit почти всегда появляются внутри операторов If или операторов SelectCase, которые вложены в циклы.
Когда цикл прерывается оператором Exit, значение переменной счетчика будет отличаться в зависимости от способа выхода из цикла:
1. Когда цикл завершен, значение счетчика равно значению верхнего предела плюс значение шага.
2. При досрочном выходе из цикла переменная-счетчик сохраняет свое значение в соответствии с общими правилами, касающимися диапазонов значений.
3. При итерации вне коллекции, если переменная счетчика имеет тип Object, ее значение равно Nothing; если переменная счетчика имеет тип Variant, ее значение равно Empty.
Выход из подпрограммы или функциональной процедуры
Из процедуры также можно выйти из структуры управления. Синтаксис ExitSub и ExitFunction аналогичен синтаксису ExitFor и ExitDo из предыдущего раздела «Структура управления выходом». ExitSub может появляться в любом месте тела подпроцесса столько раз, сколько необходимо.
ExitSub и ExitFunction полезны, когда процедура завершила каждую задачу и может вернуться напрямую. Например, если вы хотите изменить предыдущий пример, чтобы печатался только первый шрифт, найденный для принтера и экрана, вы можете использовать ExitSub:
PrivateSubForm_Click()
ДимСФонт, ПФонт
ФорЕачСФонтИнСкрин.Фонтс()
ФорЕачПФонтИнПринтер.Фонтс()
ЕслиSFont=PFontThen
ПечатьШрифт
ExitSub 'Выход из процесса.
КонецЕсли
СледующийPFont
СледующийSFont
EndSub
->