О пользе циклов
Расскажу
немного о циклах. Ведь почти не одна, даже очень простенькая программа,
не обходится без циклов. Циклы позволяют выполнить одну или несколько строк
кода несколько раз. Visual Vasic поддерживает следующие конструкции:
Конструкция Do...Loop.
Этот
цикл используют в том случае, если Вам самим неизвестно сколько раз должен
быть исполнен набор инструкций. Например вот короткая программа, которая
просто считывает весь текст из файла:
1.
Создайте на диске с: какой-нибудь текстовый файл (желательно несколько
строк), допустим text.txt.
2.
Впишите в модуль:
Sub
Main()
'объявляем
переменную, которая принимает строки
Dim
Linia As String
'объявляем
переменную, которая будет содержать весь текст
Dim
AllText As String
Open
"c:\text.txt" For Input As
#1 'открываем файл text.txt для чтения
' !!!
запускаем цикл, который длится до тех пор, пока
'
не будет достигнут конец файла EOF ( End Of File)
!!!
Do
Until EOF(1)
Line
Input #1, Linia 'вводим линию за линией в
переменную Linia
'записываем
каждую новою линию + переход на новую строку
AllText
= AllText + Linia + Chr(13) + Chr(10)
Loop
Close
#1 'закрываем файл
MsgBox
AllText 'выводим на экран сообщение
End
Sub
Это
пример показал, что программист не знает КОГДА наступит конец файла, но
задал условие прекратится как только конец файла будет достигнут. Теперь
о том, как можно работать с этим циклом.
Во-первых,
можно создавать конструкции со словами Until
и While:
Do
[Until
| While] условие
Если
установленно ключевое слово While,
то цикл будет запускаться до тех пор, пока условие истинно, а Until
"крутит" цикл пока условие ложно. Сейчас объясню. В нашем примере стоит
Do
Until EOF(1)
т.е.
пока EOF(1) = False цикл
работает. Другими словами строки считываются пока НЕ достигнут конец файла.
Можно поставить вместо этого это:
Do
While Not EOF(1)
Теперь
работа цикла ничуть не изменится. Ведь мы хоть и поменяли условие, но цель
оставили прежней! Not EOF(1)
значит что EOF(1) ложно, конец файла не достигнут. А так как While
работает только тогда, когда условие ложно, то цикл продолжает работать!
Во-вторых,
эти ключевые слова можно менять местами и ставить можно как в начало цикла:
Do
[Until
| While] условие
так
и в конец цикла
Loop
[Until | While]
условие
Разница
состоит в том, что цикл может исполниться хотя бы один раз или не исполнится
вообще. В нашем случае слово Until стоит
в начале, значит если файл окажется пустым, то тут же будет достигнут конец
файла, условие сразу станет ложным и цикл тут же перестаёт работать! Попробуйте
теперь взять и перенести слова Until
EOF(1) на один пробел от Loop.
Запустите проект. Ага!!! Ошибка! Знаете почему? Потому что оператор Line
Input# пытается считать строку в то время
как конец файла уже достигнут. Цикл упустил этот момент, т.к. засечь он
его может в конце, а до конца он не дойдёт. Приведу так же пример из моего
примера в "Практике":
Do
'с помощью InStr получаем местоположение искомого символа
'если оно равно нулю, покидаем цикл
ReturnNumber = InStr(1, Stroka, Symbol): If
_
ReturnNumber = 0 Then Exit Do
'строке присваем все символы слева до искомого
символа и справа
Stroka = Left(Stroka, ReturnNumber - 1) + _
Right(Stroka, Len(Stroka) - ReturnNumber)
Loop
Здесь
невозможно воспользоваться ни Until,
ни While, и вот
почему: если ReturnNumber будет равно нулю, то, допустим, здесь
Left(Stroka,
ReturnNumber - 1)
возникнет
ошибка, т.к. минимальную длину функция Left понимает только 0, а здесь
получается -1 (0 - 1)!!! Поэтому
Do
Until ReturnNumber = 0
поставить
нельзя, ведь переменная Integer
"от рождения" равна нулю и цикл проигнорирует сам себя тут же. OK, но мы
можем прежде написать:
ReturnNumber
= 1
ДА!
И цикл откроется, сделае всё и как надо, но когда искомые символы кончатся
и ReturnNumber снова будет равно нулю ПОСЛЕ проверки и поэтому опять возникает
ошибка! Тогда ставим перед Loop
Until
ReturnNumber = 0
в конец.
И здесь опять та же самая беда - ReturnNumber будет равно нулю теперь ДО
проверки и ОПЯТЬ ошибка!!! Остаётся одно - воспользоваться в нужном месте
выходом из цикла Exit Do.
Где это нужное место? А там где функцмя только узнает, что искомых символов
больше нет, т.е. сразу после неё ставим условие:
If
ReturnNumber = 0 Then Exit Do
Конструкция For...Next.
Итак,
цикл For...Next это, наверное, самый простой и нужный цикл в программирований
на Visual Basic. Его применяют, когда число повторений известно заранее.
В отличии от цикла Do, в цикле For используется переменная, называемая
переменной
цикла или счётчиком цикла. Которая увеличивается или уменьшается
на заданую величину при каждом повторении цикла. Самый-самый простой пример,
который приводит везде, где приводится ;-) :
For
x = 1 To 3
'переменную x, равную 1, возводим до 3
Beep '"бибикаем"
;-)
Next
x
'идём в начало цикла
Visual
Basic выполняет цикл For...Next в следующей последовательности:
1.
Присваевает переменной х значение 1.
2.
Сравнивает присвоеное значение икса и то, которое надо присвоить (3). Если
х больше, либо равно трём прекращает своё выполнение, при условии,
что заданные "шаги" (Step) не отрицательны.
3.
Выполняет операторы в теле цикла.
4.
У величивает переменную x на один, т.к. шаги не заданы.
5.
Повторяет пункты со 2 по 4.
Ещё
один пример (печатает на форме имена всех имеющихся шрифтов):
1.
Создаём форму.
2.
Открываем окно Code.
3.
Выбираем событие Click
4.
Вписываем:
Dim
I As Integer 'объявляем
меременную - счётчик
'запускаем
цикл столько раз, сколько имеется шрифтов
'(Screen.FontCount
возвращает кол-во всех шрифтов)
For I = 0 To Screen.FontCount
'печатает
каждое имя
Print Screen.Fonts(I)
Next
Кстати
в конце цикла положено ставить имя переменной - счётчика. Вообще-то это
необязательно, но, во-первых, это, так сказать, правило хорошего тона,
а, во-вторых, так Вы не запутаетесь.
Кострукцин For
Each...Next.
Цикл
For Each...Next похож на цикл For...Next, но он повторяет группу операторов
для каждого элемента из набора объектов или из массива. О его пользе
судить я не могу, но могу только сказать, что мне он ещё ни разу
не пригодился. Хотя я ничего полезного-то и не делал ;-)).
Короче,
если Вам нужно изменить за раз все элементы массива или коллекции, Вы можете
использовать этот цикл. Например вот код, который:
1.
Создаёт массив.
2.
Увеличивает все элементы на один.
Итак,
пишем в модуль:
Sub
Main()
Dim
a(6)
As Integer 'объявляем
массив из шести ячеек
'объявляем
"универсальную" переменную, которую
'используют
как елемент массива или набора объектов
Dim
Element As Variant
'запускаем
цикл столько раз, сколько всего ячеек в массиве а
For
x = 0 To UBound(a)
a(x) = x 'присваеваем
каждой ячейке значение
Debug.Print a(x) 'выводим
на экран, только что полученое значение
Next
'запускаем
цикл For Each..Next, где будет изменяться Element в массиве а
For
Each Element In
a
Element = Element + 1 'увелчиваем каждый элемент
на один
Debug.Print
Element
'вывод на экран увеличенный
элемент
Next
'в начало цикла
End
Sub
В окне
Immediant появятся цифры от 0 до 6 - это бывшие значения массива а, и следом
цифры от 1 до 7, а это новые значения, увеличенные на один.
И ещё
один пример, где все объекты на форме двигаются в право. Но, во-первых,
расскажу что такое Controls. Controls - это группа, где храняться все объекты
формы. Набор Controls создаётся автоматически при открытии новой формы
и пополняется при добавлении новых объектов.
Чтобы
сослаться на какой-нибудь объект, нужно написать Controls(Index). Внимание!
Важно знать, что Visual Basic хранит все объекты в обратном порядке их
создания. Например, если у Вас на форме был создан Text1, потом Label1,
а потом Combo1, то Combo1 будет иметь индекс 0, Label1 - 2, и Text1 будет
иметь 3. Неудобно, не правда ли? А теперь пример:
1.
Создайте форму.
2.
На ней создайте кучу объектов.
3.
Щёлкните два раза на форме и откройте окно Code.
4.
Выберите событие Click.
5.
Впишите следующее:
Private
Sub Form_Click()
Dim
Element As Variant
For
Each Element In
Controls
Element.Left = Element.Left + 100
Next
Element
End
Sub
Ну,
вот и поползли все объекты влево. Только будьте осторожны, если вы будете
кликать по объектам, а не по форме, они будут стоять как вкопанные.
ВСЁ!
|