В этой лекции вы узнаете, как:
For...Next для многократного повторения операторов;Do для выполнения операторов до тех пор, пока не выполнится заданное условие;В этой лекции вы узнаете, как многократно исполнять блок операторов с помощью циклов. Для исполнения операторов заданное число раз вы будете использовать цикл For...Next, а для исполнения операторов до тех пор, пока не выполнится условное выражение - цикл Do. Вы также узнаете, как с помощью оператора конкатенации строк () выводить в объекте текстового поля более одной строки текста. Наконец, вы узнаете, как для исполнения кода вашей программы через заданные интервалы времени использовать объект таймер.
Print вы могли выводить текст непосредственно в форму - это было наследием оператора Print из GW-BASIC и Microsoft QuickBasic. В Visual Basic .NET метод Print может использоваться только для записи данных на диск. В этой лекции показан альтернативный метод вывода в форме больших фрагментов текста - в объекте многострочного текстового поля с помощью оператора конкатенации строк ().While был определен с помощью следующего синтаксиса: While...Wend. В Visual Basic .NET закрывающий оператор изменился на While...EndWhile, чтобы быть больше похожим на другие аналогичные структуры.Timer в Visual Basic .NET аналогичен, но не идентичен элементу управления Timer из Visual Basic 6. Например, процедура события Timer1_Timer (которая исполняется через каждый предустановленный интервал времени) была в Microsoft Visual Studio .NET переименована в Timer1_Tick. В дополнение к этому, вы больше не можете отключать таймер установкой его свойства Interval на значение 0.С помощью цикла For...Next вы можете выполнять группу операторов программы в процедуре события или модуле кода заданное число раз. Этот подход полезен в том случае, если вы выполняете несколько связанных вычислений, работаете с элементами на экране или обрабатываете несколько фрагментов данных, введенных пользователем. Цикл For...Next является на самом деле просто кратким способом записать длинный список операторов программы. Так как каждая группа операторов в таком списке будет делать одно и то же, Visual Basic позволяет определить одну такую группу операторов и выполнить ее столько раз, сколько вы захотите.
Синтаксис цикла For...Next имеет следующий вид:
For переменная = начальное_значение To конечное_ значение повторяемые операторы Next [переменная]
В этом описании синтаксиса For, To и Next - это обязательные ключевые слова, оператор присвоения (=) также обязателен. Вы должны заменить переменная именем числовой переменной, которая хранит текущее значение счетчика циклов (переменную после Next указывать необязательно), а начальное_значение и конечное_значение заменить числовыми значениями, представляющими начальную и конечную точки цикла. (Заметьте, что вы должны объявить переменную до того, как станете использовать ее в операторе For...Next.) Строка или строки между операторами For и Next - это операторы, которые повторяются при каждом исполнении цикла.
Например, следующий цикл For...Next воспроизводит в виде быстрой последовательности четыре звуковых сигнала:
Dim i As Integer For i = 1 To 4 Beep() Next i
Этот цикл эквивалентен написанию в процедуре оператора
Beep() Beep() Beep() Beep()
Переменная, используемая в цикле - это i, единственная буква, которая, по соглашению, обозначает первый счетчик цикла For...Next и объявляется как переменная типа Integer. При каждом исполнении цикла переменная счетчика увеличивается на единицу. (При первом проходе через цикл переменная содержит значение 1 - значение, заданное параметром начальное_значение; при последнем проходе она содержит значение 4 - конечное_значение.) Как вы увидите в следующих примерах, в циклах можно эффективно использовать эту переменную-счетчик.
Переменная-счетчик аналогична любой другой переменной процедуры события. Ее значение может быть присвоено свойству, использовано в вычислениях или отображено в программе. Одним из практических применений переменной-счетчика является ее отображение в элементе управления TextBox. Ранее в этой книге вы использовали элемент управления TextBox для отображения одной строки, но в этой лекции вы будете выводить в элемент управления TextBox несколько строк текста. Фокус при отображении более чем одной строки заключается в том, что вы просто устанавливаете свойство Multiline элемента управления TextBox на значение True, а свойство ScrollBars - на значение Vertical. При использовании этих простых настроек объект однострочного текстового поля становится объектом многострочного текстового поля с полосами прокрутки для облегчения доступа к нему.
Button, но на этот раз новым способом.Button (он находится на закладке Windows Forms). Visual Studio поместит объект кнопки в верхний левый угол формы. В случае с элементом управления Button, а также и со многими другими, двойной щелчок мышью позволяет быстро создать в форме объект со стандартными размерами. Теперь можно перетащить этот объект кнопки в нужное место и настроить его свойства.Text кнопки на значение Цикл.TextBox. Visual Studio создаст небольшое текстовое поле.Multiline этого объекта текстового поля на значение True, а свойство ScrollBars на значение Vertical. Эти настройки подготавливают текстовое поле к отображению более чем одной строки текста.Text объекта текстового поля пустым (empty).Button1_Click.Введите в этой процедуре следующие операторы программы:
Dim i As Integer Dim Wrap As String Wrap = Chr(13) Chr(10) For i = 1 To 10 TextBox1.Text = TextBox1.Text "Строка " i Wrap Next i
Эта процедура события объявляет две переменные - одну типа Integer (i), а вторую - типа String (Wrap), а затем присваивает второй переменной строковое значение, представляющее символ перевода строки. В терминах программирования символ перевода строки является эквивалентом нажатия на клавишу (Enter) на клавиатуре. Чтобы сделать его менее громоздким, я создал для этого символа специальную переменную, которая состоит из элементов "возврат каретки" (return) и "прокрутка строки" (
После объявления переменной и присвоения, я использую цикл For...Next для десятикратного отображения в объекте текстового поля строки "Строка X", где X - это текущее значение переменной-счетчика (другими словами, со "Строка 1" до "Строка 10"). Символы конкатенации строк () объединяют в текстовом поле части каждой строки воедино. В начале в объект добавляется все значение текстового поля, которое хранится в свойстве Text, так, что предыдущие строки при добавлении новых не удаляются. Затем для отображения новой строки и перевода курсора влево и на следующую строку объединяются строка "Строка", текущий номер строки и символ возврата каретки (Wrap). Оператор Next завершает цикл.
Обратите внимание, что Visual Studio автоматически добавляет оператор Next в конец цикла, когда вы вводите For в его начале. В данном случае я отредактировал оператор Next так, чтобы включить в него имя переменной i - это необязательное пояснение синтаксиса, которое мне нравится использовать.
Щелкните на кнопке Цикл.
Примечание. Готовая программа For Loop находится в папке c:\vbnet03sbs\ Гл.7\for loop.
Цикл For...Next отображает в текстовом поле 10 строк, как показано ниже.

Снова щелкните на кнопке Цикл. Цикл For...Next отображает в форме еще 10 строк, и вы можете увидеть невидимые строки, используя вертикальную полосу прокрутки. При каждом повторении цикла он добавляет в объект текстового поля 10 новых строк.
Совет. Боитесь, что в объекте текстового поля не останется места? Если вы отображаете только 10 строк, это случится очень нескоро. Объект многострочного текстового поля имеет практическое ограничение на размер текста в 32 Кб. Для текстов большего объема или для форматирования попробуйте использовать элемент управления RichTextBox.
Чтобы завершить выполнение программы, щелкните на кнопке Закрыть формы.
Совет. Если требуется исполнять набор операторов много раз, цикл For...Next значительно упростит ваш код и уменьшит общее число операторов, которые нужно вводить. В предыдущем примере цикл For...Next длиной в три строки выполнил ту же работу, что и его десятистрочный эквивалент без использования цикла.
Переменная-счетчик в цикле For...Next может стать мощным инструментом вашей программы. При некотором воображении вы можете использовать ее для создания в ваших циклах нескольких полезных последовательностей чисел. Чтобы создать цикл с шаблоном счетчика, отличным от 1, 2, 3, 4 и т.д., вы можете указать в цикле различные начальные значения, а затем использовать ключевое слово Step для увеличения счетчика на различные интервалы. Например, код
Dim i As Integer Dim Wrap As String Wrap = Chr(13) Chr(10) For i = 5 To 25 Step 5 TextBox1.Text = TextBox1.Text "Строка " i Wrap Next i
отобразит в текстовом поле следующую последовательность номеров строк:
Строка 5 Строка 10 Строка 15 Строка 20 Строка 25
Если вы объявите i как переменную с плавающей точкой одинарной или двойной точности, вы сможете указать в цикле десятичные значения. Например, цикл For...Next
Dim i As Single Dim Wrap As String Wrap = Chr(13) Chr(10) For i = 1 To 2.5 Step 0.5 TextBox1.Text = TextBox1.Text "Строка " i Wrap Next i
отобразит в текстовом поле следующие номера строк:
Строка 1 Строка 1.5 Строка 2 Строка 2.5
В дополнение к отображению переменной-счетчика, вы можете использовать этот счетчик для установки свойств, вычисления значений или обработки файлов. В следующем упражнении показано, как можно использовать счетчик для открытия значков Visual Basic, которые хранятся на вашем жестком диске в файлах, содержащих в своих именах числа. Такие файлы можно найти в папке c:\program files\microsoft visual studio.net 2003\common7\graphics\icons\misc.
PictureBox, расположенном на закладке Windows Forms, а затем нарисуйте в центре верхней половины формы объект вывода изображения средних размеров.Button, а затем нарисуйте под полем вывода изображений широкую кнопку (чтобы уместился длинный текст).Установите для этих двух объектов следующие свойства:
| Объект | Свойство | Установка |
|---|---|---|
| PictureBox1 | BorderStyle | Fixed3D |
| SizeMode | StretchImage | |
| Button1 | Text | "Показать четыре рожицы" |
Button1_Click.Введите следующий цикл For...Next:
Dim i As Integer
For i = 1 To 4
PictureBox1.Image = System.Drawing.Image.FromFile_
("c:\vbnet03sbs\Гл.7\face0" i ".ico")
MsgBox("Щелкните здесь, чтобы посмотреть следующую рожицу.")
Next
Совет. Метод FromFile в этой процедуре события слишком длинный, чтобы поместиться в одной строке этой книги, так что я разбил его на две с помощью пробела и символа продолжения строки (_). Вы можете использовать этот символ в вашей программе везде, за исключением строковых выражений.
Для загрузки четырех значков из файлов, расположенных в папке c:\vbnet03sbs\Гл.7 на вашем жестком диске, этот цикл использует метод FromFile. Имя файла создается с помощью переменной-счетчика и оператора конкатенации, который вы использовали ранее в этой лекции. Код
PictureBox1.Image = System.Drawing.Image.FromFile_
("c:\vbnet03sbs\Гл.7\face0" i ".ico")
для создания четырех корректных имен файлов значков, хранящихся на жестком диске, объединяет путь, имя файла и расширение .ico. В этом примере вы загружаете в поле вывода изображений файлы face01.ico, face02.ico, face03.ico и face04.ico. Этот оператор работает потому, что несколько файлов в папке c:\vbnet03sbs\Гл.7 имеют шаблон имен facexx.ico. Использование этого шаблона позволяет создать для этих имен файлов цикл For...Next.
Примечание. Функция отображения сообщения ( MsgBox ) используется в первую очередь для того, чтобы замедлить работу и позволить вам увидеть, что происходит в цикле For...Next. В нормальном приложении вы, вероятно, не будете использовать такие функции (хотя такая возможность у вас есть).
Чтобы запустить программу, щелкните на кнопке Start (Начать) на стандартной панели инструментов, а затем на кнопке Показать четыре рожицы. (Готовая программа For Loop Icons лежит в папке c:\vbnet03sbs\Гл.7\For loop icons.) Цикл For...Next загружает в область вывода изображений первую рожицу, а затем отображает окно сообщения.

Примечание. Если Visual Basic выдает сообщение об ошибке, проверьте код программы на предмет опечаток, а затем убедитесь, что файлы значков находятся по указанному вами в программе пути. Если вы установили файлы практических занятий этой книги в папку, отличную от папки по умолчанию, или переместили файлы значков после установки, то путь в этой процедуре события может оказаться неверным.
Чтобы показать следующую рожицу, щелкните на кнопке OK. Ваш экран будет выглядеть примерно так.

Бывают ли ситуации, когда использование цикла For...Next не очень эффективно или не элегантно? Конечно. На самом деле предыдущий пример, хотя и полезен с точки зрения демонстрации, был несколько усложнен окном сообщения, которое открывалось в цикле For...Next четыре раза и отвлекало от формы, на которой необходимо сосредоточить внимание пользователя. Есть ли способ, с помощью которого можно отказаться от использования окна сообщения?
Одним из решений будет удаление как функции MsgBox, так и цикла For...Next, и использование вместо них переменной-счетчика, которая имеет область видимости для всей формы. Как вы узнали из лекции 5, можно объявить переменную с областью видимости во всей форме, поместив оператор Dim для этой переменной в самом начале кода формы в Редакторе кода - специальном месте над процедурами событий и сразу за разделом кода, сгенерированного Конструктором Windows Forms. В следующем упражнении вы будете использовать переменную Counter типа Integer, которая сохраняет свое значение между вызовами процедуры события Button1_Click, и использовать эту переменную для открытия тех же файлов значков, но без использования функции MsgBox, которая создает паузу между действиями.
Button1_Click.Поместите курсор перед процедурой события Button1_Click, и непосредственно после раздела кода, сгенерированного Конструктором Windows Forms, объявите переменную Counter типа Integer с помощью следующей записи:
Dim Counter As Integer = 1
Здесь вы поступили необычно - в дополнение к объявлению переменной Counter вы сразу же присвоили этой переменной значение 1. Это новая синтаксическая возможность Visual Studio .NET, и иногда она очень удобна. В Visual Basic 6 одновременное объявление и присвоение было запрещено.
В процедуре события Button1_Click измените код так, чтобы он в точности соответствовал следующей группе операторов программы. Отсутствующие здесь операторы следует удалить.
PictureBox1.Image = System.Drawing.Image.FromFile_
("c:\vbnet03sbs\Гл.7\face0" Counter ".ico")
Counter += 1
If Counter = 5 Then Counter = 1
Я удалил объявление переменной i, оператора For...Next и функцию MsgBox, и изменил способ работы метода FromFile (заменил переменную i переменной Counter.) Также я добавил два новых оператора, которые используют переменную Counter. Первый оператор добавляет к Counter единицу ( Counter += 1 ), а второй сбрасывает значение переменной Counter, если оно стало 5. Такой сброс переменной позволит неограниченно долго циклически перебирать список файлов значков. Запись Counter += 1 является новой функцией краткой записи Visual Basic .NET - функциональным эквивалентом оператора
Counter = Counter + 1
Для запуска программы щелкните на кнопке Start (Начать).
Примечание. Готовая программа Counter Variable лежит в папке c:\vbnet03sbs\Гл.7\counter variable.
Программа запустится на выполнение в среде разработки.
Щелкните несколько раз на кнопке Показать четыре рожицы. Обратите внимание, как выражение рожицы изменяется от мрачного до счастливого.

For...Next, а лишь ограничением того, что процедура события Button1_Click использует только локальные переменные (другими словами, переменные, которые были объявлены в самой процедуре события). Между щелчками на кнопке эти локальные переменные теряют свое значение, и единственным способом заставить счетчик увеличиваться является создание цикла. Используя переменную типа Integer с большей областью видимости, я смог сохранить значение переменной Counter между щелчками и использовать это значение для отображения файлов в процедуре события Button1_Click.Большинство циклов For...Next выполняются до конца без каких-либо проблем, но иногда бывает нужно остановить работу цикла For...Next "досрочно" при выполнении некоторого условия. Такую возможность предоставляет использование оператора Exit For - специального оператора для досрочного завершения выполнения цикла For...Next и передачи управления на первый оператор, стоящий после этого цикла.
Например, следующий цикл For...Next запрашивает у пользователя 10 имен и отображает их одно за другим в текстовом поле до тех пор, пока пользователь не введет слово "Готово":
Dim i As Integer
Dim InpName As String
For i = 1 To 10
InpName = InputBox("Введите ваше имя или наберите Готово для выхода.")
If InpName = "Готово" Then Exit For
TextBox1.Text = InpName
Next i
Если пользователь вводит "Готово", то оператор Exit For завершает цикл, и выполнение продолжается с оператора, стоящего после Next.
В качестве альтернативы циклу For...Next можно написать цикл Do, который исполняет группу операторов до тех пор, пока некоторое условие не станет равно True. Циклы Do ценны тем, что зачастую вы не сможете заранее узнать, сколько раз цикл должен повторяться. Например, вы можете позволить пользователю вводить имена в базу данных до тех пор, пока пользователь не введет в поле ввода слово "Готово". В этом случае можно использовать цикл Do, повторяющийся до тех пор, пока не будет введено слово "Готово".
Цикл Do имеет несколько форматов, зависящих от того, где и как вычисляется условие цикла. Чаще других встречается такой синтаксис:
Do While условие блок выполняемых операторов Loop
Например, следующий цикл Do будет запрашивать у пользователя данные и отображать их в текстовом поле до тех пор, пока не будет введено слово "Готово":
Dim InpName As String
Do While InpName <> "Готово"
InpName = InputBox("Введите ваше имя или наберите Готово для выхода.")
If InpName <> "Готово" Then TextBox1.Text = InpName
Loop
Условный оператор в этом цикле имеет вид InpName <> "Готово", и компилятор Visual Basic транслирует его в значение "повторять цикл до тех пор, пока переменная InpName не будет содержать слова Готово". Это приводит к одному интересному моменту, касающемуся циклов Do: если условие в начале цикла не равно True при первом выполнении оператора Do, то цикл Do никогда не исполняется. Таким образом, если строковая переменная InpName содержит значение "Готово" до начала цикла (возможно, в результате более раннего присвоения значения в процедуре события), Visual Basic пропустит весь цикл и продолжит выполнение со строки, расположенной вслед за ключевым словом Loop.
Если вы хотите, чтобы в программе цикл всегда выполнялся хотя бы один раз, поместите проверку условия в конце цикла. Например, цикл
Dim InpName As String
Do
InpName = InputBox("Введите ваше имя или наберите Готово для выхода.")
If InpName <> " Готово" Then TextBox1.Text = InpName
Loop While InpName <> " Готово"
в основном, такой же, как и предыдущий цикл Do, но здесь условие цикла проверяется после того, как из функции InputBox было получено имя. Преимущество этого варианта в том, что он обновляет переменную InpName до того, как будет произведена проверка условия цикла, и, таким образом, предыдущее значение "Готово" не приведет к пропуску выполнения цикла. Проверка условия цикла в конце гарантирует, что ваш цикл выполнится хотя бы один раз, но часто это будет приводить к тому, что вам потребуется добавлять дополнительные операторы для обработки данных.
Примечание. Предыдущие примеры кода для выхода просили пользователя ввести слово "Готово". Обратите внимание, что проверка введенного теста учитывает регистр букв, что означает, что ввод слов "готово" или "ГОТОВО" не приведет к завершению программы. Это можно проверить нечувствительной к регистру введенного текста функцией StrComp, которая обсуждается в лекции 12 .
Из-за существующей структуры циклов Do, очень важно проектировать проверки условий таким образом, чтобы каждый цикл имел реальную точку выхода. Если проверка условий выполнения цикла никогда не даст в результате False, цикл будет выполняться бесконечно и ваша программа перестанет реагировать на ввод. Рассмотрим следующий пример:
Dim Number as Double
Do
Number = InputBox("Введите число для возведения в квадрат. Введите -1 для выхода.")
Number = Number * Number
TextBox1.Text = Number
Loop While Number >= 0
В этом цикле пользователь вводит одно число за другим, а программа возводит число в квадрат и отображает результат в текстовом поле.
К сожалению, пользователь, закончив работу, не сможет выйти, так как представленное условие выхода не работает. Когда пользователь вводит -1, программа возводит его в квадрат, и переменной Number присваивается значение 1. (Проблему можно решить, поставив другое условие выхода.) Отслеживание бесконечных циклов при написании циклов Do очень важно. К счастью, если вы тщательно тестируете программу, то их довольно легко обнаружить.
Важно! Убедитесь, что каждый цикл имеет работающее условие выхода.
В следующем упражнении показано, как можно использовать цикл Do для преобразования температур по шкале Фаренгейта в температуры по шкале Цельсия. Эта простая программа запрашивает ввод от пользователя с помощью функции InputBox, преобразует температуру и отображает вывод в окне сообщения.
Form1_Load, так что при запуске приложения Visual Basic попросит вас ввести температуру по Фаренгейту. Для запроса данных используется функция InputBox, а для отображения преобразованных данных - функция MsgBox.Form1_Load.Введите в процедуре события Form1_Load следующие операторы программы:
Dim FTemp, Celsius As Single Dim strFTemp As String Dim Prompt As String = "Введите температуру по Фаренгейту." Do strFTemp = InputBox(Prompt, "Пересчет температуры") If strFTemp <> "" Then FTemp = CSng(strFTemp) Celsius = Int((FTemp + 40) * 5 / 9 - 40) MsgBox(Celsius, , "Температура по Цельсию") End If Loop While strFTemp <> "" End
Совет. Убедитесь, что в конце процедуры события Form1_Load вы добавили оператор End.
Этот код выполняет необходимые вычисления. Первая строка объявляет две переменные одинарной точности - FTemp и Celsius - которые хранят температуры по Фаренгейту и Цельсию соответственно. Вторая строка объявляет строковую переменную с именем strFTemp, которая хранит строковую версию температуры по Фаренгейту. Третья строка объявляется строковую переменную с именем Prompt, которая будет использоваться функцией InputBox, и присваивает ей начальное значение. Цикл Do запрашивает у пользователя температуру по Фаренгейту, преобразует ее в шкалу Цельсия, а затем отображает на экране с помощью функции MsgBox.
Значение, введенное пользователем, сохраняется в переменной strFTemp. Функция InputBox всегда возвращает значение строкового типа, даже если пользователь вводит число. Так как мы хотим выполнить с введенным значением математические вычисления, переменная strFTemp должна быть преобразована в число. Для преобразования строки в число одинарной точности используется функция CSng. CSng - это одна из нескольких функций, предназначенных для преобразования строки в другие типы данных. Затем преобразованное значение одинарной точности сохраняется в переменной FTemp.
Цикл выполняется до тех пор, пока пользователь не щелкнет на кнопке Cancel (Отмена), или до тех пор, пока не нажмет на (Enter) или не щелкнет на OK при отсутствии в поле ввода какого-либо значения. Щелчок на кнопке Cancel (Отмена) или ввод пустого значения возвращают пустую строку (""). Цикл проверяет, не пуста ли строка, с помощью проверки условия While, стоящего в конце цикла. Оператор программы
Celsius = Int((FTemp + 40) * 5 / 9 - 40)
производит преобразование значений шкалы Фаренгейта в шкалу Цельсия. Этот оператор реализует стандартную формулу преобразования, но при этом использует функцию Int, чтобы возвратить в переменную Celsius значение, которое не содержит десятичных знаков. (Все, что находится справа от десятичной точки, отбрасывается.) Это отрезание приносит в жертву точность, но помогает вам избежать появления длинных нечитаемых значений типа 21.11111, которое является эквивалентом по Цельсию для температуры в 70 градусов по Фаренгейту.
Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на стандартной панели инструментов.
Celsius Conversion находится в папке c:\vbnet03sbs\Гл.7\celsius conversion.Теперь попробуйте запустить эту программу.
InputBox запросит у вас температуру по Фаренгейту.Введите 212. Ваш экран должен выглядеть примерно так.

Щелкните на OK. Температура в 212 градусов по Фаренгейту преобразуется в 100 градусов по Цельсию.

Циклы Do, с которыми вы до сих пор работали, для выполнения группы операторов до тех пор, пока условие равно True, использовали ключевое слово While. Visual Basic также позволяет использовать в циклах Do ключевое слово Until, которое приводит к повторению цикла до тех пор, пока заданное условие не станет равным True. Ключевое слово Until можно использовать для проверки условия, как в начале, так и в конце цикла Do, точно так же, как и ключевое слово While. Например, следующий цикл Do использует ключевое слово Until для повторения цикла до тех пор, пока пользователь не ввел в поле ввода слово "Готово":
Dim InpName As String
Do
InpName = InputBox("Введите ваше имя или наберите Готово для выхода.")
If InpName <> "Готово" Then TextBox1.Text = InpName
Loop Until InpName = "Готово"
Цикл, который использует ключевое слово Until, аналогичен циклу, который использует ключевое слово While, за исключением того, что проверка условия обычно содержит обратный оператор - в данном случае это оператор = (равно) вместо оператора <> (не равно).
Можно выполнять группу операторов в заданное время с помощью элемента управления Timer. Элемент управления Timer - это невидимый секундомер, который позволяет использовать системные часы. Он может быть использован как таймер для обратного отсчета от заданного интервала времени, что используется при создании пауз в программе, или повторения действий через заданные интервалы времени.
Хотя объекты таймера во время выполнения программы не видны, с каждым таймером связана процедура события, которая выполняется при истечении заданного интервала времени таймера. Установить интервал таймера можно с помощью свойства Interval, а активизирвоать таймер можно установив его свойство Enabled в значение True. Когда таймер активизирован, он постоянно работает, выполняя через заданные промежутки времени свою процедуру события до тех пор, пока пользователь не остановит программу или не отключит таймер.
Одним из наиболее практических примеров использования элемента управления Timer является создание цифровых часов. В следующем упражнении вы создадите простые цифровые часы, которые отслеживают текущее время с точностью до секунды. В этом примере вы установите свойство Interval таймера на значение 1000, указав Visual Basic обновлять время часов через каждые 1000 миллисекунд, то есть один раз в секунду. Так как операционная система Microsoft Windows является многозадачной средой и другие задачи также требуют времени на свое выполнение, Visual Basic может не получить возможности обновлять часы каждую секунду, но они всегда будут подводиться, если начнут отставать. Чтобы следить за временем через другие промежутки (например, раз в десять секунд), просто измените число в свойстве Interval.
Дважды щелкните в окне области элементов на элементе управления Timer на закладке Windows Forms. Visual Studio создаст в области компонент под формой небольшой объект таймера, как показано ниже.

Некоторые элементы управления Visual Studio не имеют визуального представления на форме (см. лекцию 4), и когда создаются объекты этих элементов управления, они появляются в области компонент, расположенной под формой. Однако вы по-прежнему можете выбрать на этой специальной панели элементы управления и установить их свойства.
Label, а затем нарисуйте метку величиной почти во всю форму. Эта метка будет использоваться для отображения времени на часах, и она должна быть очень большой, чтобы в ней уместился шрифт размером в 24 пункта, который вы будете использовать.Откройте окно Properties (Свойства) и установите следующие свойства формы и двух ее объектов.
| Объект | Свойство | Установка |
|---|---|---|
| Label1 | Text | пустой (empty) |
| Font | Times New Roman, Bold (Жирный), 24-point (12 пунктов) | |
| TextAlign | MiddleCenter | |
| Timer1 | Enabled | True |
| Interval | 1000 | |
| Form1 | Text | "Цифровые часы" |
BackgroundImage объекта Form1 путь к графическому файлу.Теперь вы должны написать программный код для таймера.
Timer1_Tick. Опытные программисты на Visual Basic 6 заметят, что эта процедура события с целью прояснения того, что она делает в программе, была переименована с Timer1_Timer в Timer1_Tick (это значит, что процедура события выполняется при каждом "тике" таймера).Введите следующий оператор:
Label1.Text = TimeString
Этот оператор получает от системных часов текущее системное время и присваивает его свойству Text объекта Label1. (Если вы хотите отображать в часах кроме времени еще и дату, используйте вместо свойства TimeString свойство System.DateTime.Now.) В этой программе требуется только один оператор, так как вы установили свойство Interval таймера с помощью окна Properties (Свойства). Все остальное обрабатывается объектом таймера.
Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на стандартной панели инструментов.
Чтобы запустить часы, щелкните на кнопке Start (Начать) на стандартной панели инструментов. Появятся часы, как показано на следующей иллюстрации (конечно, ваше время будет отличаться).

Если вы использовали свойство System.DateTime.Now, то вы также увидите на часах текущую дату, как показано ниже. Если ваш дисплей разбивается на две строки, как показано здесь, вы можете слегка увеличить форму.

Программа Digital Clock настолько удобна, что ее можно скомпилировать в виде исполняемого файла и использовать на вашем компьютере. Ее можно настроить с помощью ваших собственных рисунков, текста и цветов.
Еще одним интересным применением таймера является настройка его на ожидание заданного периода времени и последующего разрешения или запрещения какого-либо действия. Это снова похоже на установку в вашей программе секундомера - вы устанавливаете свойство Interval на время желаемой задержки, а затем запускаете часы, установив свойство Enabled на значение True.
В следующем упражнении показано, как можно использовать этот подход для установки ограничения по времени для ввода пароля. Паролем для этой программы является слово "secret". Эта программа использует таймер для собственного закрытия, если в течение 15 секунд не был введен правильный пароль. Такая программа может стать частью большого приложения. Вы также можете использовать эту методику применения таймера для отображения на экране приветствия или сообщения об авторских правах, или для повтора через некоторый интервал времени некоторого события, такого, как сохранение файла на диск через каждые десять минут.
TextBox, расположенном на закладке Windows Forms, а затем нарисуйте в центре формы текстовое поле для пароля.Label, а затем нарисуйте над текстовым полем длинную метку.Button, а затем нарисуйте под текстовым полем кнопку.Timer. Visual Studio добавит в область компонент, расположенную под формой, объект таймера.Установите в программе свойства, приведенные в следующей таблице.
| Объект | Свойство | Установка |
|---|---|---|
| Label1 | Text | "Введите свой пароль в течение 15 секунд" |
| TextBox1 | PasswordChar | "*" |
| Text | пустой (empty) | |
| Button1 | Text | "Попробовать пароль" |
| Timer1 | Enabled | True |
| Interval | 15000 | |
| Form1 | Text | "Пароль" |
Настройка PasswordChar будет отображать при вводе пользователем пароля в текстовом поле символы звездочки (*). Установка свойства Interval таймера на значение 15000 дает пользователю 15 секунд на то, чтобы ввести пароль и щелкнуть на кнопке Попробовать пароль. Установка свойства Enabled в значение True запустит таймер сразу, как только будет запущена программа. Если ваш таймер снова может понадобиться при дальнейшей работе программы, то вы можете отключить это свойство и включить его в какой-либо процедуре события.
Ваша форма должна выглядеть примерно так.

Сделайте двойной щелчок мышью в области компонент на объекте таймера, а затем введите в процедуре Timer1_Tick события следующие операторы:
MsgBox("Извините, время вышло.")
End
Первый оператор отображает сообщение, указывающее, что период времени истек, а второй останавливает программу. Visual Basic выполняет эту процедуру события в том случае, если интервал таймера достигает 15 секунд, а правильный пароль не был введен.
Отобразите форму, сделайте двойной щелчок мышью на объекте кнопки, а затем введите в процедуре события Button1_Click следующие операторы:
If TextBox1.Text = "secret" Then
Timer1.Enabled = False
MsgBox("Добро пожаловать в систему!")
End
Else
MsgBox("Извините, я вас не знаю.")
End If
Этот код программы проверяет, равен ли введенный в текстовом поле пароль слову "secret". Если да, то таймер отключается, отображается
Введите в текстовое поле слово "откройся". Символы звездочки скроют текст вашего ввода, как показано здесь.

Щелкните на кнопке Попробовать пароль. На экране появится окно сообщения, уведомляющее вас о некорректном ответе.

Щелкните на OK и подождите, пока истечет период "регистрации". Программа отобразить сообщение об истечении времени.

Программа отобразит такое сообщение.

For...Next и Do, вы можете использовать объекты таймера для повторного выполнения команд или процедур столько раз, сколько потребуется в вашей программе.| Чтобы | Сделайте следующее |
|---|---|
| Выполнить группу операторов программы заданное количество раз | Добавьте свои операторы между операторами цикла For и Next. Например: Dim i As Integer
For i = 1 To 10
MsgBox("Нажмите ОК!")
Next i
|
| Использовать с операторами заданную последовательность чисел | Поместите свои операторы в цикл Dim i As Integer For i = 2 To 8 Step 2 TextBox1.Text = TextBox1.Text i Next i |
| Избежать бесконечного цикла Do | Убедитесь, что цикл имеет проверяемое условие, которое может принять значение False. |
| Досрочно выйти из цикла For $$\dots$$ Next | Используйте оператор программы Exit For. Например: Dim InpName As String
Dim i As Integer
For i = 1 To 10
InpName = InputBox("Имя?")
If InpName = "Вася" Then Exit For
TextBox1.Text = InpName
Next i
|
| Выполнять группу операторов программы до тех пор, пока не выполнится заданное условие | Поместите эти операторы между операторами Do и Loop. Например: Dim Query As String = ""
Do While Query <> "Yes"
Query = InputBox("Вася?")
If Query = "Yes" Then MsgBox("Привет")
Loop
|
| Выполнять цикл до тех пор, пока условие не станет равно True | Используйте цикл Do с ключевым словом Until. Например: Dim GiveIn As String
Do
GiveIn = InputBox("Say 'Uncle'")
Loop Until GiveIn = "Uncle"
|
| Выполнять цикл в вашей программе в течение указанного интервала времени | Используйте элемент управления Timer. |
В этой лекции вы узнаете, как:
For...Next для многократного повторения операторов;Do для выполнения операторов до тех пор, пока не выполнится заданное условие;В этой лекции вы узнаете, как многократно исполнять блок операторов с помощью циклов. Для исполнения операторов заданное число раз вы будете использовать цикл For...Next, а для исполнения операторов до тех пор, пока не выполнится условное выражение - цикл Do. Вы также узнаете, как с помощью оператора конкатенации строк () выводить в объекте текстового поля более одной строки текста. Наконец, вы узнаете, как для исполнения кода вашей программы через заданные интервалы времени использовать объект таймер.
Print вы могли выводить текст непосредственно в форму - это было наследием оператора Print из GW-BASIC и Microsoft QuickBasic. В Visual Basic .NET метод Print может использоваться только для записи данных на диск. В этой лекции показан альтернативный метод вывода в форме больших фрагментов текста - в объекте многострочного текстового поля с помощью оператора конкатенации строк ().While был определен с помощью следующего синтаксиса: While...Wend. В Visual Basic .NET закрывающий оператор изменился на While...EndWhile, чтобы быть больше похожим на другие аналогичные структуры.Timer в Visual Basic .NET аналогичен, но не идентичен элементу управления Timer из Visual Basic 6. Например, процедура события Timer1_Timer (которая исполняется через каждый предустановленный интервал времени) была в Microsoft Visual Studio .NET переименована в Timer1_Tick. В дополнение к этому, вы больше не можете отключать таймер установкой его свойства Interval на значение 0.С помощью цикла For...Next вы можете выполнять группу операторов программы в процедуре события или модуле кода заданное число раз. Этот подход полезен в том случае, если вы выполняете несколько связанных вычислений, работаете с элементами на экране или обрабатываете несколько фрагментов данных, введенных пользователем. Цикл For...Next является на самом деле просто кратким способом записать длинный список операторов программы. Так как каждая группа операторов в таком списке будет делать одно и то же, Visual Basic позволяет определить одну такую группу операторов и выполнить ее столько раз, сколько вы захотите.
Синтаксис цикла For...Next имеет следующий вид:
For переменная = начальное_значение To конечное_ значение повторяемые операторы Next [переменная]
В этом описании синтаксиса For, To и Next - это обязательные ключевые слова, оператор присвоения (=) также обязателен. Вы должны заменить переменная именем числовой переменной, которая хранит текущее значение счетчика циклов (переменную после Next указывать необязательно), а начальное_значение и конечное_значение заменить числовыми значениями, представляющими начальную и конечную точки цикла. (Заметьте, что вы должны объявить переменную до того, как станете использовать ее в операторе For...Next.) Строка или строки между операторами For и Next - это операторы, которые повторяются при каждом исполнении цикла.
Например, следующий цикл For...Next воспроизводит в виде быстрой последовательности четыре звуковых сигнала:
Dim i As Integer For i = 1 To 4 Beep() Next i
Этот цикл эквивалентен написанию в процедуре оператора
Beep() Beep() Beep() Beep()
Переменная, используемая в цикле - это i, единственная буква, которая, по соглашению, обозначает первый счетчик цикла For...Next и объявляется как переменная типа Integer. При каждом исполнении цикла переменная счетчика увеличивается на единицу. (При первом проходе через цикл переменная содержит значение 1 - значение, заданное параметром начальное_значение; при последнем проходе она содержит значение 4 - конечное_значение.) Как вы увидите в следующих примерах, в циклах можно эффективно использовать эту переменную-счетчик.
Переменная-счетчик аналогична любой другой переменной процедуры события. Ее значение может быть присвоено свойству, использовано в вычислениях или отображено в программе. Одним из практических применений переменной-счетчика является ее отображение в элементе управления TextBox. Ранее в этой книге вы использовали элемент управления TextBox для отображения одной строки, но в этой лекции вы будете выводить в элемент управления TextBox несколько строк текста. Фокус при отображении более чем одной строки заключается в том, что вы просто устанавливаете свойство Multiline элемента управления TextBox на значение True, а свойство ScrollBars - на значение Vertical. При использовании этих простых настроек объект однострочного текстового поля становится объектом многострочного текстового поля с полосами прокрутки для облегчения доступа к нему.
Button, но на этот раз новым способом.Button (он находится на закладке Windows Forms). Visual Studio поместит объект кнопки в верхний левый угол формы. В случае с элементом управления Button, а также и со многими другими, двойной щелчок мышью позволяет быстро создать в форме объект со стандартными размерами. Теперь можно перетащить этот объект кнопки в нужное место и настроить его свойства.Text кнопки на значение Цикл.TextBox. Visual Studio создаст небольшое текстовое поле.Multiline этого объекта текстового поля на значение True, а свойство ScrollBars на значение Vertical. Эти настройки подготавливают текстовое поле к отображению более чем одной строки текста.Text объекта текстового поля пустым (empty).Button1_Click.Введите в этой процедуре следующие операторы программы:
Dim i As Integer Dim Wrap As String Wrap = Chr(13) Chr(10) For i = 1 To 10 TextBox1.Text = TextBox1.Text "Строка " i Wrap Next i
Эта процедура события объявляет две переменные - одну типа Integer (i), а вторую - типа String (Wrap), а затем присваивает второй переменной строковое значение, представляющее символ перевода строки. В терминах программирования символ перевода строки является эквивалентом нажатия на клавишу (Enter) на клавиатуре. Чтобы сделать его менее громоздким, я создал для этого символа специальную переменную, которая состоит из элементов "возврат каретки" (return) и "прокрутка строки" (
После объявления переменной и присвоения, я использую цикл For...Next для десятикратного отображения в объекте текстового поля строки "Строка X", где X - это текущее значение переменной-счетчика (другими словами, со "Строка 1" до "Строка 10"). Символы конкатенации строк () объединяют в текстовом поле части каждой строки воедино. В начале в объект добавляется все значение текстового поля, которое хранится в свойстве Text, так, что предыдущие строки при добавлении новых не удаляются. Затем для отображения новой строки и перевода курсора влево и на следующую строку объединяются строка "Строка", текущий номер строки и символ возврата каретки (Wrap). Оператор Next завершает цикл.
Обратите внимание, что Visual Studio автоматически добавляет оператор Next в конец цикла, когда вы вводите For в его начале. В данном случае я отредактировал оператор Next так, чтобы включить в него имя переменной i - это необязательное пояснение синтаксиса, которое мне нравится использовать.
Щелкните на кнопке Цикл.
Примечание. Готовая программа For Loop находится в папке c:\vbnet03sbs\ Гл.7\for loop.
Цикл For...Next отображает в текстовом поле 10 строк, как показано ниже.

Снова щелкните на кнопке Цикл. Цикл For...Next отображает в форме еще 10 строк, и вы можете увидеть невидимые строки, используя вертикальную полосу прокрутки. При каждом повторении цикла он добавляет в объект текстового поля 10 новых строк.
Совет. Боитесь, что в объекте текстового поля не останется места? Если вы отображаете только 10 строк, это случится очень нескоро. Объект многострочного текстового поля имеет практическое ограничение на размер текста в 32 Кб. Для текстов большего объема или для форматирования попробуйте использовать элемент управления RichTextBox.
Чтобы завершить выполнение программы, щелкните на кнопке Закрыть формы.
Совет. Если требуется исполнять набор операторов много раз, цикл For...Next значительно упростит ваш код и уменьшит общее число операторов, которые нужно вводить. В предыдущем примере цикл For...Next длиной в три строки выполнил ту же работу, что и его десятистрочный эквивалент без использования цикла.
Переменная-счетчик в цикле For...Next может стать мощным инструментом вашей программы. При некотором воображении вы можете использовать ее для создания в ваших циклах нескольких полезных последовательностей чисел. Чтобы создать цикл с шаблоном счетчика, отличным от 1, 2, 3, 4 и т.д., вы можете указать в цикле различные начальные значения, а затем использовать ключевое слово Step для увеличения счетчика на различные интервалы. Например, код
Dim i As Integer Dim Wrap As String Wrap = Chr(13) Chr(10) For i = 5 To 25 Step 5 TextBox1.Text = TextBox1.Text "Строка " i Wrap Next i
отобразит в текстовом поле следующую последовательность номеров строк:
Строка 5 Строка 10 Строка 15 Строка 20 Строка 25
Если вы объявите i как переменную с плавающей точкой одинарной или двойной точности, вы сможете указать в цикле десятичные значения. Например, цикл For...Next
Dim i As Single Dim Wrap As String Wrap = Chr(13) Chr(10) For i = 1 To 2.5 Step 0.5 TextBox1.Text = TextBox1.Text "Строка " i Wrap Next i
отобразит в текстовом поле следующие номера строк:
Строка 1 Строка 1.5 Строка 2 Строка 2.5
В дополнение к отображению переменной-счетчика, вы можете использовать этот счетчик для установки свойств, вычисления значений или обработки файлов. В следующем упражнении показано, как можно использовать счетчик для открытия значков Visual Basic, которые хранятся на вашем жестком диске в файлах, содержащих в своих именах числа. Такие файлы можно найти в папке c:\program files\microsoft visual studio.net 2003\common7\graphics\icons\misc.
PictureBox, расположенном на закладке Windows Forms, а затем нарисуйте в центре верхней половины формы объект вывода изображения средних размеров.Button, а затем нарисуйте под полем вывода изображений широкую кнопку (чтобы уместился длинный текст).Установите для этих двух объектов следующие свойства:
| Объект | Свойство | Установка |
|---|---|---|
| PictureBox1 | BorderStyle | Fixed3D |
| SizeMode | StretchImage | |
| Button1 | Text | "Показать четыре рожицы" |
Button1_Click.Введите следующий цикл For...Next:
Dim i As Integer
For i = 1 To 4
PictureBox1.Image = System.Drawing.Image.FromFile_
("c:\vbnet03sbs\Гл.7\face0" i ".ico")
MsgBox("Щелкните здесь, чтобы посмотреть следующую рожицу.")
Next
Совет. Метод FromFile в этой процедуре события слишком длинный, чтобы поместиться в одной строке этой книги, так что я разбил его на две с помощью пробела и символа продолжения строки (_). Вы можете использовать этот символ в вашей программе везде, за исключением строковых выражений.
Для загрузки четырех значков из файлов, расположенных в папке c:\vbnet03sbs\Гл.7 на вашем жестком диске, этот цикл использует метод FromFile. Имя файла создается с помощью переменной-счетчика и оператора конкатенации, который вы использовали ранее в этой лекции. Код
PictureBox1.Image = System.Drawing.Image.FromFile_
("c:\vbnet03sbs\Гл.7\face0" i ".ico")
для создания четырех корректных имен файлов значков, хранящихся на жестком диске, объединяет путь, имя файла и расширение .ico. В этом примере вы загружаете в поле вывода изображений файлы face01.ico, face02.ico, face03.ico и face04.ico. Этот оператор работает потому, что несколько файлов в папке c:\vbnet03sbs\Гл.7 имеют шаблон имен facexx.ico. Использование этого шаблона позволяет создать для этих имен файлов цикл For...Next.
Примечание. Функция отображения сообщения ( MsgBox ) используется в первую очередь для того, чтобы замедлить работу и позволить вам увидеть, что происходит в цикле For...Next. В нормальном приложении вы, вероятно, не будете использовать такие функции (хотя такая возможность у вас есть).
Чтобы запустить программу, щелкните на кнопке Start (Начать) на стандартной панели инструментов, а затем на кнопке Показать четыре рожицы. (Готовая программа For Loop Icons лежит в папке c:\vbnet03sbs\Гл.7\For loop icons.) Цикл For...Next загружает в область вывода изображений первую рожицу, а затем отображает окно сообщения.

Примечание. Если Visual Basic выдает сообщение об ошибке, проверьте код программы на предмет опечаток, а затем убедитесь, что файлы значков находятся по указанному вами в программе пути. Если вы установили файлы практических занятий этой книги в папку, отличную от папки по умолчанию, или переместили файлы значков после установки, то путь в этой процедуре события может оказаться неверным.
Чтобы показать следующую рожицу, щелкните на кнопке OK. Ваш экран будет выглядеть примерно так.

Бывают ли ситуации, когда использование цикла For...Next не очень эффективно или не элегантно? Конечно. На самом деле предыдущий пример, хотя и полезен с точки зрения демонстрации, был несколько усложнен окном сообщения, которое открывалось в цикле For...Next четыре раза и отвлекало от формы, на которой необходимо сосредоточить внимание пользователя. Есть ли способ, с помощью которого можно отказаться от использования окна сообщения?
Одним из решений будет удаление как функции MsgBox, так и цикла For...Next, и использование вместо них переменной-счетчика, которая имеет область видимости для всей формы. Как вы узнали из лекции 5, можно объявить переменную с областью видимости во всей форме, поместив оператор Dim для этой переменной в самом начале кода формы в Редакторе кода - специальном месте над процедурами событий и сразу за разделом кода, сгенерированного Конструктором Windows Forms. В следующем упражнении вы будете использовать переменную Counter типа Integer, которая сохраняет свое значение между вызовами процедуры события Button1_Click, и использовать эту переменную для открытия тех же файлов значков, но без использования функции MsgBox, которая создает паузу между действиями.
Button1_Click.Поместите курсор перед процедурой события Button1_Click, и непосредственно после раздела кода, сгенерированного Конструктором Windows Forms, объявите переменную Counter типа Integer с помощью следующей записи:
Dim Counter As Integer = 1
Здесь вы поступили необычно - в дополнение к объявлению переменной Counter вы сразу же присвоили этой переменной значение 1. Это новая синтаксическая возможность Visual Studio .NET, и иногда она очень удобна. В Visual Basic 6 одновременное объявление и присвоение было запрещено.
В процедуре события Button1_Click измените код так, чтобы он в точности соответствовал следующей группе операторов программы. Отсутствующие здесь операторы следует удалить.
PictureBox1.Image = System.Drawing.Image.FromFile_
("c:\vbnet03sbs\Гл.7\face0" Counter ".ico")
Counter += 1
If Counter = 5 Then Counter = 1
Я удалил объявление переменной i, оператора For...Next и функцию MsgBox, и изменил способ работы метода FromFile (заменил переменную i переменной Counter.) Также я добавил два новых оператора, которые используют переменную Counter. Первый оператор добавляет к Counter единицу ( Counter += 1 ), а второй сбрасывает значение переменной Counter, если оно стало 5. Такой сброс переменной позволит неограниченно долго циклически перебирать список файлов значков. Запись Counter += 1 является новой функцией краткой записи Visual Basic .NET - функциональным эквивалентом оператора
Counter = Counter + 1
Для запуска программы щелкните на кнопке Start (Начать).
Примечание. Готовая программа Counter Variable лежит в папке c:\vbnet03sbs\Гл.7\counter variable.
Программа запустится на выполнение в среде разработки.
Щелкните несколько раз на кнопке Показать четыре рожицы. Обратите внимание, как выражение рожицы изменяется от мрачного до счастливого.

For...Next, а лишь ограничением того, что процедура события Button1_Click использует только локальные переменные (другими словами, переменные, которые были объявлены в самой процедуре события). Между щелчками на кнопке эти локальные переменные теряют свое значение, и единственным способом заставить счетчик увеличиваться является создание цикла. Используя переменную типа Integer с большей областью видимости, я смог сохранить значение переменной Counter между щелчками и использовать это значение для отображения файлов в процедуре события Button1_Click.Большинство циклов For...Next выполняются до конца без каких-либо проблем, но иногда бывает нужно остановить работу цикла For...Next "досрочно" при выполнении некоторого условия. Такую возможность предоставляет использование оператора Exit For - специального оператора для досрочного завершения выполнения цикла For...Next и передачи управления на первый оператор, стоящий после этого цикла.
Например, следующий цикл For...Next запрашивает у пользователя 10 имен и отображает их одно за другим в текстовом поле до тех пор, пока пользователь не введет слово "Готово":
Dim i As Integer
Dim InpName As String
For i = 1 To 10
InpName = InputBox("Введите ваше имя или наберите Готово для выхода.")
If InpName = "Готово" Then Exit For
TextBox1.Text = InpName
Next i
Если пользователь вводит "Готово", то оператор Exit For завершает цикл, и выполнение продолжается с оператора, стоящего после Next.
В качестве альтернативы циклу For...Next можно написать цикл Do, который исполняет группу операторов до тех пор, пока некоторое условие не станет равно True. Циклы Do ценны тем, что зачастую вы не сможете заранее узнать, сколько раз цикл должен повторяться. Например, вы можете позволить пользователю вводить имена в базу данных до тех пор, пока пользователь не введет в поле ввода слово "Готово". В этом случае можно использовать цикл Do, повторяющийся до тех пор, пока не будет введено слово "Готово".
Цикл Do имеет несколько форматов, зависящих от того, где и как вычисляется условие цикла. Чаще других встречается такой синтаксис:
Do While условие блок выполняемых операторов Loop
Например, следующий цикл Do будет запрашивать у пользователя данные и отображать их в текстовом поле до тех пор, пока не будет введено слово "Готово":
Dim InpName As String
Do While InpName <> "Готово"
InpName = InputBox("Введите ваше имя или наберите Готово для выхода.")
If InpName <> "Готово" Then TextBox1.Text = InpName
Loop
Условный оператор в этом цикле имеет вид InpName <> "Готово", и компилятор Visual Basic транслирует его в значение "повторять цикл до тех пор, пока переменная InpName не будет содержать слова Готово". Это приводит к одному интересному моменту, касающемуся циклов Do: если условие в начале цикла не равно True при первом выполнении оператора Do, то цикл Do никогда не исполняется. Таким образом, если строковая переменная InpName содержит значение "Готово" до начала цикла (возможно, в результате более раннего присвоения значения в процедуре события), Visual Basic пропустит весь цикл и продолжит выполнение со строки, расположенной вслед за ключевым словом Loop.
Если вы хотите, чтобы в программе цикл всегда выполнялся хотя бы один раз, поместите проверку условия в конце цикла. Например, цикл
Dim InpName As String
Do
InpName = InputBox("Введите ваше имя или наберите Готово для выхода.")
If InpName <> " Готово" Then TextBox1.Text = InpName
Loop While InpName <> " Готово"
в основном, такой же, как и предыдущий цикл Do, но здесь условие цикла проверяется после того, как из функции InputBox было получено имя. Преимущество этого варианта в том, что он обновляет переменную InpName до того, как будет произведена проверка условия цикла, и, таким образом, предыдущее значение "Готово" не приведет к пропуску выполнения цикла. Проверка условия цикла в конце гарантирует, что ваш цикл выполнится хотя бы один раз, но часто это будет приводить к тому, что вам потребуется добавлять дополнительные операторы для обработки данных.
Примечание. Предыдущие примеры кода для выхода просили пользователя ввести слово "Готово". Обратите внимание, что проверка введенного теста учитывает регистр букв, что означает, что ввод слов "готово" или "ГОТОВО" не приведет к завершению программы. Это можно проверить нечувствительной к регистру введенного текста функцией StrComp, которая обсуждается в лекции 12 .
Из-за существующей структуры циклов Do, очень важно проектировать проверки условий таким образом, чтобы каждый цикл имел реальную точку выхода. Если проверка условий выполнения цикла никогда не даст в результате False, цикл будет выполняться бесконечно и ваша программа перестанет реагировать на ввод. Рассмотрим следующий пример:
Dim Number as Double
Do
Number = InputBox("Введите число для возведения в квадрат. Введите -1 для выхода.")
Number = Number * Number
TextBox1.Text = Number
Loop While Number >= 0
В этом цикле пользователь вводит одно число за другим, а программа возводит число в квадрат и отображает результат в текстовом поле.
К сожалению, пользователь, закончив работу, не сможет выйти, так как представленное условие выхода не работает. Когда пользователь вводит -1, программа возводит его в квадрат, и переменной Number присваивается значение 1. (Проблему можно решить, поставив другое условие выхода.) Отслеживание бесконечных циклов при написании циклов Do очень важно. К счастью, если вы тщательно тестируете программу, то их довольно легко обнаружить.
Важно! Убедитесь, что каждый цикл имеет работающее условие выхода.
В следующем упражнении показано, как можно использовать цикл Do для преобразования температур по шкале Фаренгейта в температуры по шкале Цельсия. Эта простая программа запрашивает ввод от пользователя с помощью функции InputBox, преобразует температуру и отображает вывод в окне сообщения.
Form1_Load, так что при запуске приложения Visual Basic попросит вас ввести температуру по Фаренгейту. Для запроса данных используется функция InputBox, а для отображения преобразованных данных - функция MsgBox.Form1_Load.Введите в процедуре события Form1_Load следующие операторы программы:
Dim FTemp, Celsius As Single Dim strFTemp As String Dim Prompt As String = "Введите температуру по Фаренгейту." Do strFTemp = InputBox(Prompt, "Пересчет температуры") If strFTemp <> "" Then FTemp = CSng(strFTemp) Celsius = Int((FTemp + 40) * 5 / 9 - 40) MsgBox(Celsius, , "Температура по Цельсию") End If Loop While strFTemp <> "" End
Совет. Убедитесь, что в конце процедуры события Form1_Load вы добавили оператор End.
Этот код выполняет необходимые вычисления. Первая строка объявляет две переменные одинарной точности - FTemp и Celsius - которые хранят температуры по Фаренгейту и Цельсию соответственно. Вторая строка объявляет строковую переменную с именем strFTemp, которая хранит строковую версию температуры по Фаренгейту. Третья строка объявляется строковую переменную с именем Prompt, которая будет использоваться функцией InputBox, и присваивает ей начальное значение. Цикл Do запрашивает у пользователя температуру по Фаренгейту, преобразует ее в шкалу Цельсия, а затем отображает на экране с помощью функции MsgBox.
Значение, введенное пользователем, сохраняется в переменной strFTemp. Функция InputBox всегда возвращает значение строкового типа, даже если пользователь вводит число. Так как мы хотим выполнить с введенным значением математические вычисления, переменная strFTemp должна быть преобразована в число. Для преобразования строки в число одинарной точности используется функция CSng. CSng - это одна из нескольких функций, предназначенных для преобразования строки в другие типы данных. Затем преобразованное значение одинарной точности сохраняется в переменной FTemp.
Цикл выполняется до тех пор, пока пользователь не щелкнет на кнопке Cancel (Отмена), или до тех пор, пока не нажмет на (Enter) или не щелкнет на OK при отсутствии в поле ввода какого-либо значения. Щелчок на кнопке Cancel (Отмена) или ввод пустого значения возвращают пустую строку (""). Цикл проверяет, не пуста ли строка, с помощью проверки условия While, стоящего в конце цикла. Оператор программы
Celsius = Int((FTemp + 40) * 5 / 9 - 40)
производит преобразование значений шкалы Фаренгейта в шкалу Цельсия. Этот оператор реализует стандартную формулу преобразования, но при этом использует функцию Int, чтобы возвратить в переменную Celsius значение, которое не содержит десятичных знаков. (Все, что находится справа от десятичной точки, отбрасывается.) Это отрезание приносит в жертву точность, но помогает вам избежать появления длинных нечитаемых значений типа 21.11111, которое является эквивалентом по Цельсию для температуры в 70 градусов по Фаренгейту.
Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на стандартной панели инструментов.
Celsius Conversion находится в папке c:\vbnet03sbs\Гл.7\celsius conversion.Теперь попробуйте запустить эту программу.
InputBox запросит у вас температуру по Фаренгейту.Введите 212. Ваш экран должен выглядеть примерно так.

Щелкните на OK. Температура в 212 градусов по Фаренгейту преобразуется в 100 градусов по Цельсию.

Циклы Do, с которыми вы до сих пор работали, для выполнения группы операторов до тех пор, пока условие равно True, использовали ключевое слово While. Visual Basic также позволяет использовать в циклах Do ключевое слово Until, которое приводит к повторению цикла до тех пор, пока заданное условие не станет равным True. Ключевое слово Until можно использовать для проверки условия, как в начале, так и в конце цикла Do, точно так же, как и ключевое слово While. Например, следующий цикл Do использует ключевое слово Until для повторения цикла до тех пор, пока пользователь не ввел в поле ввода слово "Готово":
Dim InpName As String
Do
InpName = InputBox("Введите ваше имя или наберите Готово для выхода.")
If InpName <> "Готово" Then TextBox1.Text = InpName
Loop Until InpName = "Готово"
Цикл, который использует ключевое слово Until, аналогичен циклу, который использует ключевое слово While, за исключением того, что проверка условия обычно содержит обратный оператор - в данном случае это оператор = (равно) вместо оператора <> (не равно).
Можно выполнять группу операторов в заданное время с помощью элемента управления Timer. Элемент управления Timer - это невидимый секундомер, который позволяет использовать системные часы. Он может быть использован как таймер для обратного отсчета от заданного интервала времени, что используется при создании пауз в программе, или повторения действий через заданные интервалы времени.
Хотя объекты таймера во время выполнения программы не видны, с каждым таймером связана процедура события, которая выполняется при истечении заданного интервала времени таймера. Установить интервал таймера можно с помощью свойства Interval, а активизирвоать таймер можно установив его свойство Enabled в значение True. Когда таймер активизирован, он постоянно работает, выполняя через заданные промежутки времени свою процедуру события до тех пор, пока пользователь не остановит программу или не отключит таймер.
Одним из наиболее практических примеров использования элемента управления Timer является создание цифровых часов. В следующем упражнении вы создадите простые цифровые часы, которые отслеживают текущее время с точностью до секунды. В этом примере вы установите свойство Interval таймера на значение 1000, указав Visual Basic обновлять время часов через каждые 1000 миллисекунд, то есть один раз в секунду. Так как операционная система Microsoft Windows является многозадачной средой и другие задачи также требуют времени на свое выполнение, Visual Basic может не получить возможности обновлять часы каждую секунду, но они всегда будут подводиться, если начнут отставать. Чтобы следить за временем через другие промежутки (например, раз в десять секунд), просто измените число в свойстве Interval.
Дважды щелкните в окне области элементов на элементе управления Timer на закладке Windows Forms. Visual Studio создаст в области компонент под формой небольшой объект таймера, как показано ниже.

Некоторые элементы управления Visual Studio не имеют визуального представления на форме (см. лекцию 4), и когда создаются объекты этих элементов управления, они появляются в области компонент, расположенной под формой. Однако вы по-прежнему можете выбрать на этой специальной панели элементы управления и установить их свойства.
Label, а затем нарисуйте метку величиной почти во всю форму. Эта метка будет использоваться для отображения времени на часах, и она должна быть очень большой, чтобы в ней уместился шрифт размером в 24 пункта, который вы будете использовать.Откройте окно Properties (Свойства) и установите следующие свойства формы и двух ее объектов.
| Объект | Свойство | Установка |
|---|---|---|
| Label1 | Text | пустой (empty) |
| Font | Times New Roman, Bold (Жирный), 24-point (12 пунктов) | |
| TextAlign | MiddleCenter | |
| Timer1 | Enabled | True |
| Interval | 1000 | |
| Form1 | Text | "Цифровые часы" |
BackgroundImage объекта Form1 путь к графическому файлу.Теперь вы должны написать программный код для таймера.
Timer1_Tick. Опытные программисты на Visual Basic 6 заметят, что эта процедура события с целью прояснения того, что она делает в программе, была переименована с Timer1_Timer в Timer1_Tick (это значит, что процедура события выполняется при каждом "тике" таймера).Введите следующий оператор:
Label1.Text = TimeString
Этот оператор получает от системных часов текущее системное время и присваивает его свойству Text объекта Label1. (Если вы хотите отображать в часах кроме времени еще и дату, используйте вместо свойства TimeString свойство System.DateTime.Now.) В этой программе требуется только один оператор, так как вы установили свойство Interval таймера с помощью окна Properties (Свойства). Все остальное обрабатывается объектом таймера.
Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на стандартной панели инструментов.
Чтобы запустить часы, щелкните на кнопке Start (Начать) на стандартной панели инструментов. Появятся часы, как показано на следующей иллюстрации (конечно, ваше время будет отличаться).

Если вы использовали свойство System.DateTime.Now, то вы также увидите на часах текущую дату, как показано ниже. Если ваш дисплей разбивается на две строки, как показано здесь, вы можете слегка увеличить форму.

Программа Digital Clock настолько удобна, что ее можно скомпилировать в виде исполняемого файла и использовать на вашем компьютере. Ее можно настроить с помощью ваших собственных рисунков, текста и цветов.
Еще одним интересным применением таймера является настройка его на ожидание заданного периода времени и последующего разрешения или запрещения какого-либо действия. Это снова похоже на установку в вашей программе секундомера - вы устанавливаете свойство Interval на время желаемой задержки, а затем запускаете часы, установив свойство Enabled на значение True.
В следующем упражнении показано, как можно использовать этот подход для установки ограничения по времени для ввода пароля. Паролем для этой программы является слово "secret". Эта программа использует таймер для собственного закрытия, если в течение 15 секунд не был введен правильный пароль. Такая программа может стать частью большого приложения. Вы также можете использовать эту методику применения таймера для отображения на экране приветствия или сообщения об авторских правах, или для повтора через некоторый интервал времени некоторого события, такого, как сохранение файла на диск через каждые десять минут.
TextBox, расположенном на закладке Windows Forms, а затем нарисуйте в центре формы текстовое поле для пароля.Label, а затем нарисуйте над текстовым полем длинную метку.Button, а затем нарисуйте под текстовым полем кнопку.Timer. Visual Studio добавит в область компонент, расположенную под формой, объект таймера.Установите в программе свойства, приведенные в следующей таблице.
| Объект | Свойство | Установка |
|---|---|---|
| Label1 | Text | "Введите свой пароль в течение 15 секунд" |
| TextBox1 | PasswordChar | "*" |
| Text | пустой (empty) | |
| Button1 | Text | "Попробовать пароль" |
| Timer1 | Enabled | True |
| Interval | 15000 | |
| Form1 | Text | "Пароль" |
Настройка PasswordChar будет отображать при вводе пользователем пароля в текстовом поле символы звездочки (*). Установка свойства Interval таймера на значение 15000 дает пользователю 15 секунд на то, чтобы ввести пароль и щелкнуть на кнопке Попробовать пароль. Установка свойства Enabled в значение True запустит таймер сразу, как только будет запущена программа. Если ваш таймер снова может понадобиться при дальнейшей работе программы, то вы можете отключить это свойство и включить его в какой-либо процедуре события.
Ваша форма должна выглядеть примерно так.

Сделайте двойной щелчок мышью в области компонент на объекте таймера, а затем введите в процедуре Timer1_Tick события следующие операторы:
MsgBox("Извините, время вышло.")
End
Первый оператор отображает сообщение, указывающее, что период времени истек, а второй останавливает программу. Visual Basic выполняет эту процедуру события в том случае, если интервал таймера достигает 15 секунд, а правильный пароль не был введен.
Отобразите форму, сделайте двойной щелчок мышью на объекте кнопки, а затем введите в процедуре события Button1_Click следующие операторы:
If TextBox1.Text = "secret" Then
Timer1.Enabled = False
MsgBox("Добро пожаловать в систему!")
End
Else
MsgBox("Извините, я вас не знаю.")
End If
Этот код программы проверяет, равен ли введенный в текстовом поле пароль слову "secret". Если да, то таймер отключается, отображается
Введите в текстовое поле слово "откройся". Символы звездочки скроют текст вашего ввода, как показано здесь.

Щелкните на кнопке Попробовать пароль. На экране появится окно сообщения, уведомляющее вас о некорректном ответе.

Щелкните на OK и подождите, пока истечет период "регистрации". Программа отобразить сообщение об истечении времени.

Программа отобразит такое сообщение.

For...Next и Do, вы можете использовать объекты таймера для повторного выполнения команд или процедур столько раз, сколько потребуется в вашей программе.| Чтобы | Сделайте следующее |
|---|---|
| Выполнить группу операторов программы заданное количество раз | Добавьте свои операторы между операторами цикла For и Next. Например: Dim i As Integer
For i = 1 To 10
MsgBox("Нажмите ОК!")
Next i
|
| Использовать с операторами заданную последовательность чисел | Поместите свои операторы в цикл Dim i As Integer For i = 2 To 8 Step 2 TextBox1.Text = TextBox1.Text i Next i |
| Избежать бесконечного цикла Do | Убедитесь, что цикл имеет проверяемое условие, которое может принять значение False. |
| Досрочно выйти из цикла For $$\dots$$ Next | Используйте оператор программы Exit For. Например: Dim InpName As String
Dim i As Integer
For i = 1 To 10
InpName = InputBox("Имя?")
If InpName = "Вася" Then Exit For
TextBox1.Text = InpName
Next i
|
| Выполнять группу операторов программы до тех пор, пока не выполнится заданное условие | Поместите эти операторы между операторами Do и Loop. Например: Dim Query As String = ""
Do While Query <> "Yes"
Query = InputBox("Вася?")
If Query = "Yes" Then MsgBox("Привет")
Loop
|
| Выполнять цикл до тех пор, пока условие не станет равно True | Используйте цикл Do с ключевым словом Until. Например: Dim GiveIn As String
Do
GiveIn = InputBox("Say 'Uncle'")
Loop Until GiveIn = "Uncle"
|
| Выполнять цикл в вашей программе в течение указанного интервала времени | Используйте элемент управления Timer. |
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.