Циклы и таймеры
Открытие файлов с помощью счетчика с большой областью видимости
Бывают ли ситуации, когда использование цикла For...Next не очень эффективно или не элегантно? Конечно. На самом деле предыдущий пример, хотя и полезен с точки зрения демонстрации, был несколько усложнен окном сообщения, которое открывалось в цикле For...Next четыре раза и отвлекало от формы, на которой необходимо сосредоточить внимание пользователя. Есть ли способ, с помощью которого можно отказаться от использования окна сообщения?
Одним из решений будет удаление как функции MsgBox, так и цикла For...Next, и использование вместо них переменной-счетчика, которая имеет область видимости для всей формы. Как вы узнали из "Переменные и операторы Visual Basic .NET" , можно объявить переменную с областью видимости во всей форме, поместив оператор 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.