Выполнение повторяющихся действий
Возможности компьютера лучше всего проявляются при многократном выполнении одних и тех же действий. Поскольку компьютер считает быстрее, чем человеческий мозг, на него следует возложить как можно больше повторяющейся, нетворческой работы.
Цикл For...Next
Основная форма циклов в Visual Basic — цикл For,..Next. Он используется для выполнения определенного количество итераций. Циклы For...Next обычно используются для работы со счетчиками и в других ситуациях, когда количество итераций известно заранее. Они имеют следующий синтаксис:
For Счетчик=НачальноеЗначение To КонечноеЗначение
Повторяющиеся действия
Next Счетчик
Несмотря на простоту этого фрагмента, обратите внимание на некоторые обстоятельства:
О Переменная Счетчик имеет числовой тип (Integer или Long) и указывается программистом (например, I).
О НачальноеЗначение определяет состояние переменной, с которого начинается отсчет.
О КонечноеЗначение определяет состояние переменной, в котором отсчет прекращается.
Например, чтобы переменная x в цикле принимала значения от 1 до 5, Счетчик заменяется на x, НачальноеЗначение — на 1, а КонечноеЗначение — на 5. В первой строке цикла For...Next может присутствовать ключевое слово Step. Оно позволяет изменить приращение счетчика (по умолчанию оно равно 1). Например, если значение счетчика каждый раз увеличивается на 3, строка For будет завершаться Step 3. Если счетчик увеличивается на 2, строка завершается Step 2. В следующем фрагменте счетчик изменяется от 10 до 100 с приращением 5:
For I = 10 To 100 Step 5
' Повторяющиеся действия
Next
После ключевого слово Next можно не указывать имя переменной-счетчика. В этом случае цикл For...Next просто завершается ключевым словом Next. Более того, тесты показали, что без указания имени переменной программа выполняется быстрее. Однако код должен быть структурирован, чтобы вы могли легко найти соответствие между различными For и Next.
ПОДСКАЗКАПо умолчанию в цикле For...Next приращение счетчика равно 1. Чтобы использовать другое приращение, следует указать ключевое слово Step, а после него — нужное значение.
Счетчик даже может изменяться в обратном направлении. Для этого следует задать начальное значение больше конечного и выбрать отрицательное приращение после ключевого слова Step. Например, в следующем фрагменте счетчик изменя-етсяот 10 до 1:
For I = 10 To 1 Step -1
Повторяющиеся действия
Next
А здесь счетчик изменяется от 100 до 0 с уменьшением на 10:
For I = 100 To 0 Step -10
' Повторяющиеся действия
Next
Чтобы выйти из цикла до того, как счетчик достигнет конечного значения, воспользуйтесь командой Exit For. Например:
For I = 1 To 100 Step 5
X = I * 10
If X > 100 Then
Exit For
End If
Next
Циклы For...Next встречаются во многих примерах этой книги. Столь же часто он будет использоваться и в вашей будущей работе.
Цикл Do...Loop
Другой тип циклов реализуется с помощью конструкции Do...Loop. Эта конструкция используется в тех ситуациях, когда точное количество повторений заранее неизвестно или вы хотите дождаться выполнения некоторого условия. Например, можно в цикле перебирать содержимое набора записей, полученного из базы данных. Скорее всего, точное количество записей будет неизвестно заранее, но зато можно определить, что вы достигли конца набора. Цикл Do...Loop прекрасно справляется с этой задачей.
Цикл Do...Loop может выполняться бесконечно:
Do
' Повторяющиеся действия
Loop
Цикл с условием завершения выглядит так:
Do While X < 10
X = X + 1
Loop
Он продолжает выполняться до тех пор, пока значение переменной остается меньше 10. Поскольку X не присваивалось конкретного значения, цикл будет выполняться 10 раз. Вместо ключевого слова While можно воспользоваться ключевым словом Until, но тогда вместо условия продолжения вычислений формулируется условие завершения. Наш фрагмент эквивалентен следующему:
Do Until X = 10
X = X + 1
Loop
Для выхода из цикла можно использовать практически любое логическое условие, сформулированное на Visual Basic. Оно может содержать логические операторы и операторы сравнения, а также логические переменные.
ПОДСКАЗКАДля выхода из цикла также применяется команда Exit Do. Oco-бенно часто она используется в сочетании с оператором If...Then.
Цикл While...Wend
Другая форма цикла, похожая на конструкцию Do...Loop, — цикл While...Wend. В нем последовательность команд выполняется до тех пор, пока остается истинным указанное условие. Например, следующий цикл:
While X < 10
X = X + 1
Wend
выполняется до тех пор, пока значение X не достигнет 10. Поскольку цикл While-Wend эквивалентен конструкции Do...Loop, выбор между ними является делом вкуса.
Mny76
Перебор коллекций
В Visual Basic существует еще один тип циклов, предназначенный для переборов коллекций. Для этой цели используются циклы For Each...Next. Такой способ особенно полезен в ситуации, когда точное количество объектов в коллекции неизве-стпо заранее.
ПРИМЕЧАНИЕКоллекцией называется объект, который содержит другие, взаимосвязанные объекты.
Цикл для перебора всех объектов коллекции может выглядеть так:
Dim cmd As CommandButton
*
For Each cmd In Form1
With cmd
If .Index <> Index Then
MsgBox "Кнопка " & Trim$(Str$(.Index)) &_
не была нажата"
End If
End With
Next
В первой строке объявляется объект класса CommandButton. Bo второй строке Visual Basic перебирает все объекты CommandButton на форме Form1. Далее следует оператор With cmd, который сообщает о том, что операции блока With...End With выполняются с текущим объектом коллекции cmd.
Циклы по элементам коллекций используются во многих задачах, среди которых перебор элементов деревьев и табличных списков, дочерних форм приложений MDI и объектов, принадлежащих документам DHTML (см. урок 18, «Программирование для Интернета на Visual Basic»).
Пример использования циклов
Следующий пример наглядно показывает, как организуется совместная работа цик-лов, условий и логических операторов. В нем описанные ранее разновидности циклов используются для заполнения нескольких текстовых полей на форме. Хотя такая программа не обладает особой практической ценностью, она хорошо демонстрирует работу различных циклов.
1. Создайте новый проект командой File > New Project.
2. В диалоговом окне New Project выберите значок Standard EXE и нажмите кнопку ОК.
3. Задайте свойству Name формы Form1 значение frmMain, а свойству Caption — значение Циклы.
4. Откройте редактор меню клавишами Ctrl+E. 5. Создайте меню верхнего уровня, указывая в поле Caption значение &Цикл. Введите в поле Name значение mnuLoop.
6. Создайте новый объект меню (нажмите кнопку Next в редакторе меню).
7. Нажмите кнопку со стрелкой , расположенную прямо над списком (рис. 6.7), чтобы снабдить созданный объект единичным отступом. При этом он становится командой меню верхнего уровня.
Рис. 6.7. Создание команды меню
8. Введите в поле Caption значение &For... Next, а в поле Name — значение mnuLoop ForNext.
9. Нажмите кнопку Next, чтобы создать следующую команду меню. Обратите внимание: она уже снабжена необходимым отступом, поэтому нажимать кнопку со стрелкой не нужно.
10. Введите в поле Caption значение &Do... Loop, а в поле Name — значение mnuLoopDo-Loop.
11. Нажмите кнопку Next, чтобы создать следующую команду меню. Введите в поле Caption значение &While... Wend, а в поле Name — значение mnuLoopWhileWend.
12. Нажмите кнопку Next, чтобы создать следующую команду меню. Введите в поле Caption значение «-» (дефис), а в поле Name — значение mnuLoopSep1.
ПОДСКАЗКА
Когда в поле Caption объекта меню вводится дефис (-), объект представляет собой разделитель, предназначенный для визуальной группировки команд меню. Более подробная информация о создании меню приведена в уроке 5, «Создание и использование меню и панелей инструментов».
13. Создайте следующую команду меню,введите в поле Caption значение&Очис-тить,а в поле Name — значение mnuLоорС1еаг.
14. Нажмите кнопку OK, чтобы закрыть редактор меню.
15. Сохраните проект командой File > Save Project.
ВНИМАНИЕПри выполнении длинных или сложных операций почаще сохра-няйте свою работу. Если система «зависнет», потери будут минимальными.
16. Создайте на форме frmMain текстовое поле, расположите его в левом верхнем углу формы и задайте его свойству Name значение txtTextBox. Удалите текущее содержимое свойства Text.
17. Активизируйте элемент, щелкнув на элементе txtTextBox в конструкторе форм.
18. Нажмите Ctrl+C, чтобы скопировать элемент в буфер обмена.
19. Щелкните на форме frmMain.
20. Нажмите Ctrl+V, чтобы вставить текстовое поле из буфера на форму. Появляется диалоговое окно (рис. 6.8), в котором вам предлагается создать массив элементов. Нажмите кнопку Yes.
Рис. 6.8. Создание массива элементов
21.Расположите новое текстовое поле справа от первого.
22. Снова щелкните на форме и нажмите Ctrl+V, чтобы вставить из буфера следующее текстовое поле. Расположите его справа от полей, созданных при выполнении шагов 20 и 21.
Мы создали ряд из трех текстовых полей. Продолжайте вставлять на форму копии текстового поля и расположите их в виде таблицы, состоящей из трех столбцов и пяти строк. Форма с 15 текстовыми элементами должна выглядеть так, как показано на рис. 6.9.
23. Выберите команду For...Next из меню Циклы формы frmMain. Открывается окно программы с процедурой события mnuLoopForNext_Click.
24. Вставьте в процедуру следующий фрагмент:
Private Sub mnuLoopForNext_Click()
Dim i As Integer
'Заполнить текстовые поля в цикле
For...Next For i = 0 to 14
txtTextBox(i).Text = "i = " & Trim$(Str$(i))
Next
End Sub
Рис. 6.9. Форма с массивом текстовых полей
25. Перейдите к процедуре события mnuDoLoop_Click и вставьте в нее следующий фрагмент:
Private Sub mnuDoLoop_Click()
Dim i As Integer
'Заполнить текстовые поля в цикле For...Next
i = 0
Do While i < 15
txtTextBox(i).Text = "i = " & Trim$.(Str$(i'))
i = i + 1
Loop
End Sub
26. Вставьте следующий фрагмент в процедуру события mnuWhileWend_Click:
Private Sub fnnuWhileWend_Click()
Dim i As Integer
'Заполнить текстовые поля в цикле For...Next
i = 0
While i < 15
txtTextBox(i).Text = "i = " & Trim$(Str$(i))
i = i + 1
Wend
End Sub
27. Вставьте следующий фрагмент в процедуру mnuLoopClear_Click:
Private Sub mnuWhileWend_Click()
Dim x As Control
' Перебрать все текстовые поля на форме
' и стереть их содержимое
For Each x In frmMain.Controls
If UCase$(Left$(x.Name, 3)) = "TXT" Then
x.Text = ""
End If
Next
End Sub
28.Coxpaните и запустите проект.
Выберите один из циклов, перечисленных в меню Циклы, и проследите за изменением текстовых полей. Все типы циклов дают одинаковый результат, но разными способами (рис. 6.10). Как вы вскоре убедитесь, одна и та же задача в программировании может решаться по-разному. Проследив за работой циклов, выберите из меню Циклы команду Очистить. Программа перебирает все объекты на форме и очищает свойство Text каждого текстового поля. Запомните этот прием, он пригодится вам при создании ваших собственных приложений.
ПОДСКАЗКАЕсли вы — начинающий программист или новичок в Visual Basic,
выделите немного времени на просмотр программ-примеров.
Запустите их, чтобы понять, что они делают, а затем просмотрите текст программы. Изучение программ, написанных другими, — лучший способ освоить язык программирования!
Рис. 6.10. Пример работы с циклами
Что нового мы узнали?
В этом уроке мы научились:
Работать с двоичной логикой.
Использовать логические операторы Visual Basic для обработки условий.
Использовать условные операторы для принятия решений.
Использовать различные типы циклов для выполнения повторяющихся действий.
Создавать«мыслящие»приложения.
Урок 7
Типы переменных
Переменные
Массивы
Константы
Любое приложение в той или иной форме обрабатывает данные. Следовательно, вы должны хорошо разбираться в том, как представляются и используются данные. В этом уроке рассказано о том, как данные хранятся в памяти компьютера и как работать с ними при помощи различных типов (в том числе переменных, массивов и констант). Вы узнаете, какие типы данных лучше подходят для конкретных задач, как динамически создавать новые данные и определять константы, упрощающие программирование.