Visual Basic .NET на уроках информатики

Циклы и таймеры

Разбить на страницы
Показывать лекцию целиком

В этой лекции вы узнаете, как:

  • использовать цикл For...Next для многократного повторения операторов;
  • отображать вывод в многострочном текстовом поле с помощью конкатенации строк;
  • использовать цикл Do для выполнения операторов до тех пор, пока не выполнится заданное условие;
  • использовать объект таймера для выполнения кода в заданное время;
  • создать собственные цифровые часы и утилиту для работы с паролями, имеющими срок действия.
  • В этой лекции вы узнаете, как многократно исполнять блок операторов с помощью циклов. Для исполнения операторов заданное число раз вы будете использовать цикл For...Next, а для исполнения операторов до тех пор, пока не выполнится условное выражение - цикл Do. Вы также узнаете, как с помощью оператора конкатенации строк () выводить в объекте текстового поля более одной строки текста. Наконец, вы узнаете, как для исполнения кода вашей программы через заданные интервалы времени использовать объект таймер.

    Что нового в Visual Basic .NET?

  • В Visual Basic 6 с помощью метода Print вы могли выводить текст непосредственно в форму - это было наследием оператора Print из GW-BASIC и Microsoft QuickBasic. В Visual Basic .NET метод Print может использоваться только для записи данных на диск. В этой лекции показан альтернативный метод вывода в форме больших фрагментов текста - в объекте многострочного текстового поля с помощью оператора конкатенации строк ().
  • В Visual Basic 6 цикл 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 вы можете выполнять группу операторов программы в процедуре события или модуле кода заданное число раз. Этот подход полезен в том случае, если вы выполняете несколько связанных вычислений, работаете с элементами на экране или обрабатываете несколько фрагментов данных, введенных пользователем. Цикл 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()
    Beep()

    Переменная, используемая в цикле - это i, единственная буква, которая, по соглашению, обозначает первый счетчик цикла For...Next и объявляется как переменная типа Integer. При каждом исполнении цикла переменная счетчика увеличивается на единицу. (При первом проходе через цикл переменная содержит значение 1 - значение, заданное параметром начальное_значение; при последнем проходе она содержит значение 4 - конечное_значение.) Как вы увидите в следующих примерах, в циклах можно эффективно использовать эту переменную-счетчик.

    Отображение переменной-счетчика в элементе управления TextBox

    Переменная-счетчик аналогична любой другой переменной процедуры события. Ее значение может быть присвоено свойству, использовано в вычислениях или отображено в программе. Одним из практических применений переменной-счетчика является ее отображение в элементе управления TextBox. Ранее в этой книге вы использовали элемент управления TextBox для отображения одной строки, но в этой лекции вы будете выводить в элемент управления TextBox несколько строк текста. Фокус при отображении более чем одной строки заключается в том, что вы просто устанавливаете свойство Multiline элемента управления TextBox на значение True, а свойство ScrollBars - на значение Vertical. При использовании этих простых настроек объект однострочного текстового поля становится объектом многострочного текстового поля с полосами прокрутки для облегчения доступа к нему.

    Отображение информации с помощью цикла For ... Next

  • Запустите Visual Studio и создайте в папке c:\vbnet03sbs\Гл.7 новый проект Windows Application (Приложение Windows) на Visual Basic с именем My For Loop. В Windows Forms Designer (Конструкторе Windows Forms) появится пустая форма. Прежде всего вы добавите в форму элемента управления Button, но на этот раз новым способом.
  • Дважды щелкните мышью в окне области элементов на элементе управления Button (он находится на закладке Windows Forms). Visual Studio поместит объект кнопки в верхний левый угол формы. В случае с элементом управления Button, а также и со многими другими, двойной щелчок мышью позволяет быстро создать в форме объект со стандартными размерами. Теперь можно перетащить этот объект кнопки в нужное место и настроить его свойства.
  • Перетащите объект кнопки вправо и поместите его в центре верхней части формы.
  • Откройте окно Properties (Свойства), а затем установите свойство 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) и "прокрутка строки" (linefeed).

    После объявления переменной и присвоения, я использую цикл For...Next для десятикратного отображения в объекте текстового поля строки "Строка X", где X - это текущее значение переменной-счетчика (другими словами, со "Строка 1" до "Строка 10"). Символы конкатенации строк () объединяют в текстовом поле части каждой строки воедино. В начале в объект добавляется все значение текстового поля, которое хранится в свойстве Text, так, что предыдущие строки при добавлении новых не удаляются. Затем для отображения новой строки и перевода курсора влево и на следующую строку объединяются строка "Строка", текущий номер строки и символ возврата каретки (Wrap). Оператор Next завершает цикл.

    Обратите внимание, что Visual Studio автоматически добавляет оператор Next в конец цикла, когда вы вводите For в его начале. В данном случае я отредактировал оператор Next так, чтобы включить в него имя переменной i - это необязательное пояснение синтаксиса, которое мне нравится использовать.

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на стандартной панели инструментов. Теперь запустите эту программу.
  • Щелкните на кнопке Start (Начать) стандартной панели инструментов.
  • Щелкните на кнопке Цикл.

    Примечание. Готовая программа For Loop находится в папке c:\vbnet03sbs\ Гл.7\for loop.

    Цикл For...Next отображает в текстовом поле 10 строк, как показано ниже.

  • Снова щелкните на кнопке Цикл. Цикл For...Next отображает в форме еще 10 строк, и вы можете увидеть невидимые строки, используя вертикальную полосу прокрутки. При каждом повторении цикла он добавляет в объект текстового поля 10 новых строк.

    Совет. Боитесь, что в объекте текстового поля не останется места? Если вы отображаете только 10 строк, это случится очень нескоро. Объект многострочного текстового поля имеет практическое ограничение на размер текста в 32 Кб. Для текстов большего объема или для форматирования попробуйте использовать элемент управления RichTextBox.

  • Чтобы завершить выполнение программы, щелкните на кнопке Закрыть формы.

    Совет. Если требуется исполнять набор операторов много раз, цикл For...Next значительно упростит ваш код и уменьшит общее число операторов, которые нужно вводить. В предыдущем примере цикл 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.

    Открытие файлов с помощью цикла For ... Next

  • В меню File (Файл) укажите на New (Создать), а затем щелкните на Project (Проект). Появится диалоговое окно New Project (Создать проект).
  • В папке c:\vbnet03sbs\Гл.7 создайте новый проект Windows Application (Приложение Windows) на Visual Basic с именем My For Loop Icons. Будет создан новый проект, и в Windows Forms Designer (Конструктор Windows Forms) появится пустая форма.
  • Щелкните в окне области элементов на элементе управления 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. В нормальном приложении вы, вероятно, не будете использовать такие функции (хотя такая возможность у вас есть).

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на стандартной панели инструментов.
  • Чтобы запустить программу, щелкните на кнопке Start (Начать) на стандартной панели инструментов, а затем на кнопке Показать четыре рожицы. (Готовая программа For Loop Icons лежит в папке c:\vbnet03sbs\Гл.7\For loop icons.) Цикл For...Next загружает в область вывода изображений первую рожицу, а затем отображает окно сообщения.

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

  • Чтобы показать следующую рожицу, щелкните на кнопке OK. Ваш экран будет выглядеть примерно так.

  • Щелкните на кнопке OK еще три раза, чтобы увидеть весь набор рожиц. Если хотите, то можете повторить всю последовательность.
  • Когда закончите, щелкните на кнопке Close формы, чтобы выйти из программы. Программа остановится, и вернется среда разработки.
  • Открытие файлов с помощью счетчика с большой областью видимости

    Бывают ли ситуации, когда использование цикла For...Next не очень эффективно или не элегантно? Конечно. На самом деле предыдущий пример, хотя и полезен с точки зрения демонстрации, был несколько усложнен окном сообщения, которое открывалось в цикле For...Next четыре раза и отвлекало от формы, на которой необходимо сосредоточить внимание пользователя. Есть ли способ, с помощью которого можно отказаться от использования окна сообщения?

    Одним из решений будет удаление как функции MsgBox, так и цикла For...Next, и использование вместо них переменной-счетчика, которая имеет область видимости для всей формы. Как вы узнали из лекции 5, можно объявить переменную с областью видимости во всей форме, поместив оператор Dim для этой переменной в самом начале кода формы в Редакторе кода - специальном месте над процедурами событий и сразу за разделом кода, сгенерированного Конструктором Windows Forms. В следующем упражнении вы будете использовать переменную Counter типа Integer, которая сохраняет свое значение между вызовами процедуры события Button1_Click, и использовать эту переменную для открытия тех же файлов значков, но без использования функции MsgBox, которая создает паузу между действиями.

    Использование глобального счетчика

  • С помощью Редактора кода найдите в проекте My For Loop Icons процедуру события 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.
  • Оператор Exit For

    Большинство циклов 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.

    Цикл Do

    В качестве альтернативы циклу 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, преобразует температуру и отображает вывод в окне сообщения.

    Преобразование температур с помощью цикла Do

  • В меню File (Файл) укажите на New (Создать), а затем щелкните на Project (Проект). Появится диалоговое окно New Project (Создать проект).
  • В папке c:\vbnet03sbs\Гл.7 создайте новый проект Windows Application (Приложение Windows) на Visual Basic с именем My Celsius Conversion. Будет создан новый проект и в Windows Forms Designer (Конструкторе Windows Forms) появится пустая форма. На этот раз вы поместите весь код программы в процедуре события 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.

    Теперь попробуйте запустить эту программу.

  • Щелкните на кнопке Start (Начать) стандартной панели инструментов. Программа запустится, и функция InputBox запросит у вас температуру по Фаренгейту.
  • Введите 212. Ваш экран должен выглядеть примерно так.

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

  • Щелкните на OK. Введите в поле ввода 72 и снова щелкните на OK. Температура в 72 градуса по Фаренгейту преобразуется в 22 градуса по Цельсию.
  • Щелкните на OK, а затем выйдите из программы, щелкнув на Cancel (Отмена) в диалоговом окне ввода. Программа закроется, и вернется среда разработки.
  • Использование в циклах Do ключевого слова Until

    Циклы 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. Элемент управления Timer - это невидимый секундомер, который позволяет использовать системные часы. Он может быть использован как таймер для обратного отсчета от заданного интервала времени, что используется при создании пауз в программе, или повторения действий через заданные интервалы времени.

    Хотя объекты таймера во время выполнения программы не видны, с каждым таймером связана процедура события, которая выполняется при истечении заданного интервала времени таймера. Установить интервал таймера можно с помощью свойства Interval, а активизирвоать таймер можно установив его свойство Enabled в значение True. Когда таймер активизирован, он постоянно работает, выполняя через заданные промежутки времени свою процедуру события до тех пор, пока пользователь не остановит программу или не отключит таймер.

    Создание цифровых часов с помощью элемента управления Timer

    Одним из наиболее практических примеров использования элемента управления Timer является создание цифровых часов. В следующем упражнении вы создадите простые цифровые часы, которые отслеживают текущее время с точностью до секунды. В этом примере вы установите свойство Interval таймера на значение 1000, указав Visual Basic обновлять время часов через каждые 1000 миллисекунд, то есть один раз в секунду. Так как операционная система Microsoft Windows является многозадачной средой и другие задачи также требуют времени на свое выполнение, Visual Basic может не получить возможности обновлять часы каждую секунду, но они всегда будут подводиться, если начнут отставать. Чтобы следить за временем через другие промежутки (например, раз в десять секунд), просто измените число в свойстве Interval.

    Создание программы Digital Clock

  • В меню File (Файл) выберите New (Создать), а затем щелкните на Project (Проект). Появится диалоговое окно New Project (Создать проект).
  • В папке c:\vbnet03sbs\Гл.7 создайте новый проект с именем My Digital Clock. Будет создан новый проект и в Windows Forms Designer (Конструкторе Windows Forms) появится пустая форма.
  • Измените размер формы так, чтобы она приняла вид небольшого прямоугольного окна (по ширине больше, чем по высоте). Ваши цифровые часы не должны занимать много места.
  • Дважды щелкните в окне области элементов на элементе управления 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 (Сохранить все) на стандартной панели инструментов.

    Примечание. Готовая программа Digital Clock находится в папке c:\vbnet03sbs\Гл.7\digital clock.
  • Чтобы запустить часы, щелкните на кнопке Start (Начать) на стандартной панели инструментов. Появятся часы, как показано на следующей иллюстрации (конечно, ваше время будет отличаться).

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

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

    Следующий шаг: использование объекта таймера для установки ограничения по времени

    Еще одним интересным применением таймера является настройка его на ожидание заданного периода времени и последующего разрешения или запрещения какого-либо действия. Это снова похоже на установку в вашей программе секундомера - вы устанавливаете свойство Interval на время желаемой задержки, а затем запускаете часы, установив свойство Enabled на значение True.

    В следующем упражнении показано, как можно использовать этот подход для установки ограничения по времени для ввода пароля. Паролем для этой программы является слово "secret". Эта программа использует таймер для собственного закрытия, если в течение 15 секунд не был введен правильный пароль. Такая программа может стать частью большого приложения. Вы также можете использовать эту методику применения таймера для отображения на экране приветствия или сообщения об авторских правах, или для повтора через некоторый интервал времени некоторого события, такого, как сохранение файла на диск через каждые десять минут.

    Установка ограничения по времени на ввод пароля

  • В меню File (Файл) укажите на New (Создать), а затем щелкните на Project (Проект). Появится диалоговое окно New Project (Создать проект).
  • В папке c:\vbnet03sbs\Гл.7 создайте новый проект с именем My Timed Password. Будет создан новый проект, и в Конструкторе Windows Forms появится пустая форма.
  • Придайте форме размеры небольшого прямоугольного окна, примерно с окно ввода.
  • Щелкните в окне области элементов на элементе управления 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". Если да, то таймер отключается, отображается приветственное сообщение и программа завершается. Более полезная программа может в этом месте продолжить работать. Если введенный пароль неверен, пользователь получает уведомление в окне сообщения и получает еще одну попытку ввести пароль. Но у пользователя есть только 15 секунд, чтобы это сделать!

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на панели инструментов.
  • Примечание. Готовая программа Timed Password лежит в папке c:\vbnet03sbs\Гл.7\timed password.

    Тестирование программы Timed Password

  • Чтобы запустить программу, щелкните на кнопке Start (Начать). Программа запустится, и 15-секундные часы начнут тикать.
  • Введите в текстовое поле слово "откройся". Символы звездочки скроют текст вашего ввода, как показано здесь.

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

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

  • Щелкните на OK, чтобы закрыть программу.
  • Снова запустите программу, введите в текстовом поле secret (правильный пароль), а затем щелкните на Попробовать пароль.
  • Программа отобразит такое сообщение.

  • Щелкните на OK, чтобы закрыть программу. Появится среда разработки Visual Basic. Существуют различные способы практического применения объектов таймера. Как и в случае с циклами For...Next и Do, вы можете использовать объекты таймера для повторного выполнения команд или процедур столько раз, сколько потребуется в вашей программе.
  • Краткая справка по лекции 7

    Чтобы Сделайте следующее
    Выполнить группу операторов программы заданное количество раз

    Добавьте свои операторы между операторами цикла For и Next. Например:

    Dim i As Integer
    For i = 1 To 10
    MsgBox("Нажмите ОК!")
    Next i
    Использовать с операторами заданную последовательность чисел

    Поместите свои операторы в цикл For...Next и используйте для определения последовательности чисел ключевые слова To и Step. Например:

    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. Вы также узнаете, как с помощью оператора конкатенации строк () выводить в объекте текстового поля более одной строки текста. Наконец, вы узнаете, как для исполнения кода вашей программы через заданные интервалы времени использовать объект таймер.

    Что нового в Visual Basic .NET?

  • В Visual Basic 6 с помощью метода Print вы могли выводить текст непосредственно в форму - это было наследием оператора Print из GW-BASIC и Microsoft QuickBasic. В Visual Basic .NET метод Print может использоваться только для записи данных на диск. В этой лекции показан альтернативный метод вывода в форме больших фрагментов текста - в объекте многострочного текстового поля с помощью оператора конкатенации строк ().
  • В Visual Basic 6 цикл 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 вы можете выполнять группу операторов программы в процедуре события или модуле кода заданное число раз. Этот подход полезен в том случае, если вы выполняете несколько связанных вычислений, работаете с элементами на экране или обрабатываете несколько фрагментов данных, введенных пользователем. Цикл 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()
    Beep()

    Переменная, используемая в цикле - это i, единственная буква, которая, по соглашению, обозначает первый счетчик цикла For...Next и объявляется как переменная типа Integer. При каждом исполнении цикла переменная счетчика увеличивается на единицу. (При первом проходе через цикл переменная содержит значение 1 - значение, заданное параметром начальное_значение; при последнем проходе она содержит значение 4 - конечное_значение.) Как вы увидите в следующих примерах, в циклах можно эффективно использовать эту переменную-счетчик.

    Отображение переменной-счетчика в элементе управления TextBox

    Переменная-счетчик аналогична любой другой переменной процедуры события. Ее значение может быть присвоено свойству, использовано в вычислениях или отображено в программе. Одним из практических применений переменной-счетчика является ее отображение в элементе управления TextBox. Ранее в этой книге вы использовали элемент управления TextBox для отображения одной строки, но в этой лекции вы будете выводить в элемент управления TextBox несколько строк текста. Фокус при отображении более чем одной строки заключается в том, что вы просто устанавливаете свойство Multiline элемента управления TextBox на значение True, а свойство ScrollBars - на значение Vertical. При использовании этих простых настроек объект однострочного текстового поля становится объектом многострочного текстового поля с полосами прокрутки для облегчения доступа к нему.

    Отображение информации с помощью цикла For ... Next

  • Запустите Visual Studio и создайте в папке c:\vbnet03sbs\Гл.7 новый проект Windows Application (Приложение Windows) на Visual Basic с именем My For Loop. В Windows Forms Designer (Конструкторе Windows Forms) появится пустая форма. Прежде всего вы добавите в форму элемента управления Button, но на этот раз новым способом.
  • Дважды щелкните мышью в окне области элементов на элементе управления Button (он находится на закладке Windows Forms). Visual Studio поместит объект кнопки в верхний левый угол формы. В случае с элементом управления Button, а также и со многими другими, двойной щелчок мышью позволяет быстро создать в форме объект со стандартными размерами. Теперь можно перетащить этот объект кнопки в нужное место и настроить его свойства.
  • Перетащите объект кнопки вправо и поместите его в центре верхней части формы.
  • Откройте окно Properties (Свойства), а затем установите свойство 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) и "прокрутка строки" (linefeed).

    После объявления переменной и присвоения, я использую цикл For...Next для десятикратного отображения в объекте текстового поля строки "Строка X", где X - это текущее значение переменной-счетчика (другими словами, со "Строка 1" до "Строка 10"). Символы конкатенации строк () объединяют в текстовом поле части каждой строки воедино. В начале в объект добавляется все значение текстового поля, которое хранится в свойстве Text, так, что предыдущие строки при добавлении новых не удаляются. Затем для отображения новой строки и перевода курсора влево и на следующую строку объединяются строка "Строка", текущий номер строки и символ возврата каретки (Wrap). Оператор Next завершает цикл.

    Обратите внимание, что Visual Studio автоматически добавляет оператор Next в конец цикла, когда вы вводите For в его начале. В данном случае я отредактировал оператор Next так, чтобы включить в него имя переменной i - это необязательное пояснение синтаксиса, которое мне нравится использовать.

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на стандартной панели инструментов. Теперь запустите эту программу.
  • Щелкните на кнопке Start (Начать) стандартной панели инструментов.
  • Щелкните на кнопке Цикл.

    Примечание. Готовая программа For Loop находится в папке c:\vbnet03sbs\ Гл.7\for loop.

    Цикл For...Next отображает в текстовом поле 10 строк, как показано ниже.

  • Снова щелкните на кнопке Цикл. Цикл For...Next отображает в форме еще 10 строк, и вы можете увидеть невидимые строки, используя вертикальную полосу прокрутки. При каждом повторении цикла он добавляет в объект текстового поля 10 новых строк.

    Совет. Боитесь, что в объекте текстового поля не останется места? Если вы отображаете только 10 строк, это случится очень нескоро. Объект многострочного текстового поля имеет практическое ограничение на размер текста в 32 Кб. Для текстов большего объема или для форматирования попробуйте использовать элемент управления RichTextBox.

  • Чтобы завершить выполнение программы, щелкните на кнопке Закрыть формы.

    Совет. Если требуется исполнять набор операторов много раз, цикл For...Next значительно упростит ваш код и уменьшит общее число операторов, которые нужно вводить. В предыдущем примере цикл 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.

    Открытие файлов с помощью цикла For ... Next

  • В меню File (Файл) укажите на New (Создать), а затем щелкните на Project (Проект). Появится диалоговое окно New Project (Создать проект).
  • В папке c:\vbnet03sbs\Гл.7 создайте новый проект Windows Application (Приложение Windows) на Visual Basic с именем My For Loop Icons. Будет создан новый проект, и в Windows Forms Designer (Конструктор Windows Forms) появится пустая форма.
  • Щелкните в окне области элементов на элементе управления 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. В нормальном приложении вы, вероятно, не будете использовать такие функции (хотя такая возможность у вас есть).

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на стандартной панели инструментов.
  • Чтобы запустить программу, щелкните на кнопке Start (Начать) на стандартной панели инструментов, а затем на кнопке Показать четыре рожицы. (Готовая программа For Loop Icons лежит в папке c:\vbnet03sbs\Гл.7\For loop icons.) Цикл For...Next загружает в область вывода изображений первую рожицу, а затем отображает окно сообщения.

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

  • Чтобы показать следующую рожицу, щелкните на кнопке OK. Ваш экран будет выглядеть примерно так.

  • Щелкните на кнопке OK еще три раза, чтобы увидеть весь набор рожиц. Если хотите, то можете повторить всю последовательность.
  • Когда закончите, щелкните на кнопке Close формы, чтобы выйти из программы. Программа остановится, и вернется среда разработки.
  • Открытие файлов с помощью счетчика с большой областью видимости

    Бывают ли ситуации, когда использование цикла For...Next не очень эффективно или не элегантно? Конечно. На самом деле предыдущий пример, хотя и полезен с точки зрения демонстрации, был несколько усложнен окном сообщения, которое открывалось в цикле For...Next четыре раза и отвлекало от формы, на которой необходимо сосредоточить внимание пользователя. Есть ли способ, с помощью которого можно отказаться от использования окна сообщения?

    Одним из решений будет удаление как функции MsgBox, так и цикла For...Next, и использование вместо них переменной-счетчика, которая имеет область видимости для всей формы. Как вы узнали из лекции 5, можно объявить переменную с областью видимости во всей форме, поместив оператор Dim для этой переменной в самом начале кода формы в Редакторе кода - специальном месте над процедурами событий и сразу за разделом кода, сгенерированного Конструктором Windows Forms. В следующем упражнении вы будете использовать переменную Counter типа Integer, которая сохраняет свое значение между вызовами процедуры события Button1_Click, и использовать эту переменную для открытия тех же файлов значков, но без использования функции MsgBox, которая создает паузу между действиями.

    Использование глобального счетчика

  • С помощью Редактора кода найдите в проекте My For Loop Icons процедуру события 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.
  • Оператор Exit For

    Большинство циклов 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.

    Цикл Do

    В качестве альтернативы циклу 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, преобразует температуру и отображает вывод в окне сообщения.

    Преобразование температур с помощью цикла Do

  • В меню File (Файл) укажите на New (Создать), а затем щелкните на Project (Проект). Появится диалоговое окно New Project (Создать проект).
  • В папке c:\vbnet03sbs\Гл.7 создайте новый проект Windows Application (Приложение Windows) на Visual Basic с именем My Celsius Conversion. Будет создан новый проект и в Windows Forms Designer (Конструкторе Windows Forms) появится пустая форма. На этот раз вы поместите весь код программы в процедуре события 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.

    Теперь попробуйте запустить эту программу.

  • Щелкните на кнопке Start (Начать) стандартной панели инструментов. Программа запустится, и функция InputBox запросит у вас температуру по Фаренгейту.
  • Введите 212. Ваш экран должен выглядеть примерно так.

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

  • Щелкните на OK. Введите в поле ввода 72 и снова щелкните на OK. Температура в 72 градуса по Фаренгейту преобразуется в 22 градуса по Цельсию.
  • Щелкните на OK, а затем выйдите из программы, щелкнув на Cancel (Отмена) в диалоговом окне ввода. Программа закроется, и вернется среда разработки.
  • Использование в циклах Do ключевого слова Until

    Циклы 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. Элемент управления Timer - это невидимый секундомер, который позволяет использовать системные часы. Он может быть использован как таймер для обратного отсчета от заданного интервала времени, что используется при создании пауз в программе, или повторения действий через заданные интервалы времени.

    Хотя объекты таймера во время выполнения программы не видны, с каждым таймером связана процедура события, которая выполняется при истечении заданного интервала времени таймера. Установить интервал таймера можно с помощью свойства Interval, а активизирвоать таймер можно установив его свойство Enabled в значение True. Когда таймер активизирован, он постоянно работает, выполняя через заданные промежутки времени свою процедуру события до тех пор, пока пользователь не остановит программу или не отключит таймер.

    Создание цифровых часов с помощью элемента управления Timer

    Одним из наиболее практических примеров использования элемента управления Timer является создание цифровых часов. В следующем упражнении вы создадите простые цифровые часы, которые отслеживают текущее время с точностью до секунды. В этом примере вы установите свойство Interval таймера на значение 1000, указав Visual Basic обновлять время часов через каждые 1000 миллисекунд, то есть один раз в секунду. Так как операционная система Microsoft Windows является многозадачной средой и другие задачи также требуют времени на свое выполнение, Visual Basic может не получить возможности обновлять часы каждую секунду, но они всегда будут подводиться, если начнут отставать. Чтобы следить за временем через другие промежутки (например, раз в десять секунд), просто измените число в свойстве Interval.

    Создание программы Digital Clock

  • В меню File (Файл) выберите New (Создать), а затем щелкните на Project (Проект). Появится диалоговое окно New Project (Создать проект).
  • В папке c:\vbnet03sbs\Гл.7 создайте новый проект с именем My Digital Clock. Будет создан новый проект и в Windows Forms Designer (Конструкторе Windows Forms) появится пустая форма.
  • Измените размер формы так, чтобы она приняла вид небольшого прямоугольного окна (по ширине больше, чем по высоте). Ваши цифровые часы не должны занимать много места.
  • Дважды щелкните в окне области элементов на элементе управления 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 (Сохранить все) на стандартной панели инструментов.

    Примечание. Готовая программа Digital Clock находится в папке c:\vbnet03sbs\Гл.7\digital clock.
  • Чтобы запустить часы, щелкните на кнопке Start (Начать) на стандартной панели инструментов. Появятся часы, как показано на следующей иллюстрации (конечно, ваше время будет отличаться).

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

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

    Следующий шаг: использование объекта таймера для установки ограничения по времени

    Еще одним интересным применением таймера является настройка его на ожидание заданного периода времени и последующего разрешения или запрещения какого-либо действия. Это снова похоже на установку в вашей программе секундомера - вы устанавливаете свойство Interval на время желаемой задержки, а затем запускаете часы, установив свойство Enabled на значение True.

    В следующем упражнении показано, как можно использовать этот подход для установки ограничения по времени для ввода пароля. Паролем для этой программы является слово "secret". Эта программа использует таймер для собственного закрытия, если в течение 15 секунд не был введен правильный пароль. Такая программа может стать частью большого приложения. Вы также можете использовать эту методику применения таймера для отображения на экране приветствия или сообщения об авторских правах, или для повтора через некоторый интервал времени некоторого события, такого, как сохранение файла на диск через каждые десять минут.

    Установка ограничения по времени на ввод пароля

  • В меню File (Файл) укажите на New (Создать), а затем щелкните на Project (Проект). Появится диалоговое окно New Project (Создать проект).
  • В папке c:\vbnet03sbs\Гл.7 создайте новый проект с именем My Timed Password. Будет создан новый проект, и в Конструкторе Windows Forms появится пустая форма.
  • Придайте форме размеры небольшого прямоугольного окна, примерно с окно ввода.
  • Щелкните в окне области элементов на элементе управления 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". Если да, то таймер отключается, отображается приветственное сообщение и программа завершается. Более полезная программа может в этом месте продолжить работать. Если введенный пароль неверен, пользователь получает уведомление в окне сообщения и получает еще одну попытку ввести пароль. Но у пользователя есть только 15 секунд, чтобы это сделать!

  • Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на панели инструментов.
  • Примечание. Готовая программа Timed Password лежит в папке c:\vbnet03sbs\Гл.7\timed password.

    Тестирование программы Timed Password

  • Чтобы запустить программу, щелкните на кнопке Start (Начать). Программа запустится, и 15-секундные часы начнут тикать.
  • Введите в текстовое поле слово "откройся". Символы звездочки скроют текст вашего ввода, как показано здесь.

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

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

  • Щелкните на OK, чтобы закрыть программу.
  • Снова запустите программу, введите в текстовом поле secret (правильный пароль), а затем щелкните на Попробовать пароль.
  • Программа отобразит такое сообщение.

  • Щелкните на OK, чтобы закрыть программу. Появится среда разработки Visual Basic. Существуют различные способы практического применения объектов таймера. Как и в случае с циклами For...Next и Do, вы можете использовать объекты таймера для повторного выполнения команд или процедур столько раз, сколько потребуется в вашей программе.
  • Краткая справка по лекции 7

    Чтобы Сделайте следующее
    Выполнить группу операторов программы заданное количество раз

    Добавьте свои операторы между операторами цикла For и Next. Например:

    Dim i As Integer
    For i = 1 To 10
    MsgBox("Нажмите ОК!")
    Next i
    Использовать с операторами заданную последовательность чисел

    Поместите свои операторы в цикл For...Next и используйте для определения последовательности чисел ключевые слова To и Step. Например:

    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.
    Вернуться к учебному плану