Перейдем теперь к следующей, уже более сложной разработке. Итак, на рабочем листе необходимо создать интерфейс, показанный на рис. 1.37. Здесь обозначения Часы, Минуты и Секунды представляют элементы управления «Надпись» и являются просто поясняющими надписями рядом с соответствующими текстовыми окнами, в которые выводится информация о времени. Вывод этих сведений инициирует щелчок на кнопке Отобразить время. Фактически таким образом мы реализуем на рабочем листе вариант электронных часов. Фрагмент Секундомер (это слово набрано просто в ячейке на листе) позволяет в тех же окнах реализовать функции секундомера. Работа секундомера запускается по нажатию кнопки Старт. В этом случае текстовое окно для отображения текущего часа очищается, а информация в окнах, отводимых для минут и секунд, начинает обновляться.
Если пользователю требуется остановить отсчет времени, то он должен щелкнуть на кнопке Стоп, после чего обновление времени останавливается. В табл. 1.1 указаны имена и тины объектов, расположенных на рис. 1.37.
Свойство Name | Тип объекта | Комментарий |
---|---|---|
Th | Текстовое окно | Для вывода текущего часа |
Tm | Текстовое окно | Для вывода минут |
Ts | Текстовое окно | Для вывода секунд |
Vrema | Кнопка | Caption — Отобразить время |
Start | Кнопка | Caption — Старт |
StopSec | Кнопка | Caption — Стоп |
В качестве первого шага введем переменную Flag, которая нам понадобится для остановки обновления времени. Эта переменная должна быть известна как процедуре обработки щелчка на кнопке Старт, так и процедуре обработки щелчка на кнопке Стоп.
В редакторе Visual Basic существует общая область, где можно описывать переменные (рис. 1.38), которые должны быть известны внутри нескольких процедур. Строка программы в окне, представленном на рис. 1.38, означает следующее:
Таким образом, мы определили переменную, которая должна быть известна всем процедурам на данном рабочем листе Excel. И если одна из процедур поменяет значение переменной Flag, то в другой процедуре это изменение можно увидеть. В дальнейшем мы этим воспользуемся для остановки обновления времени по щелчку на кнопке.
После такого вступительного комментария можно привести процедуру обработки щелчка на кнопке Отобразить время (листинг 1.18).
1 2 3 4 5 6 7 8 9 10 | ' Листинг 1.18. Процедура, выполняемая по щелчку на кнопке Отобразить время Private Sub Vrema_Click() Flag = 0 While Flag = 0 Th.Text = Format(Now(), "hh") Tm.Text = Format(Now(), "nn") Ts.Text = Format(Now(), "ss") DoEvents Wend End Sub |
Теперь разберем строки этой процедуры. Во-первых, здесь используется оператор цикла, который начинается со строки While Flag = 0
и заканчивается строкой Wend
. После ключевого слова While
располагается условие, и если оно выполняется, то выполняются все строки программы вплоть до Wend
. Затем управление опять передается на строку While
, и если условие вновь выполняется, то все повторяется. Если же условие не выполняется, то управление передается на первую строку после Wend
.
В строке Th.Text = Format(Now(), "hh")
используются несколько внутренних функций Visual Basic. Так, функция Now()
не требует входных параметров и просто выдаст текущую дату и время. В свою очередь, другая внутренняя функция, Format
, позволяет задать определенный формат для выводимой информации. Если нам необходимо выделить только текущий час, то в качестве второго аргумента функции Format
мы должны задать «hh». Соответственно в следующих двух строках из текущего времени выделяются минуты и секунды.
Далее по тексту располагается внутренняя процедура Visual Basic DoEvents
, которая позволяет переключаться из выполняемого программного кода на обработку других событий. В данном случае нам необходимо по щелчку на кнопке Стоп установить значение переменной Flag в 1, что реализуется в процедуре, приведенной в листинге 1.19.
1 2 3 4 | ' Листинг 1.19. Процедура обработки щелчка на кнопке Стоп Private Sub StopSec_Click() Flag = 1 End Sub |
Таким образом, мы обеспечили вывод текущего времени и его остановку. Что касается остановки, то она скорее требуется для секундомера. И теперь наша задача заключается в реализации его функциональности. В листинге 1.20 приведена процедура, которая выполняется по щелчку на кнопке Старт, что позволяет включить секундомер.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ' Листинг 1.20. Обработка щелчка на кнопке Старт Private Sub Start_Click() Th.Text = "" Tm.Text = 0 Ts.Text = 0 Flag В = 0 ' Получение значения секунд Sec = Format(Now(), "ss") ' В переменной Shet организуем счетчик Shet = 0 While Flag = 0 Sec2 = Format(Now(), "ss") If Sec <> Sec2 Then ' При изменении секунд Shet = Shet + 1 Sec = Sec2 ' Получение минут ChetMins = Shet 60 ' Выделение секунд ChetSecs = Shet - ChetMins * 60 Tm.Text = ChetMins Ts.Text = ChetSecs End If DoEvents Wend End Sub |
Здесь мы использовали операцию целочисленного деления () для получения числа прошедших минут. Программа для работы секундомера готова, и на рис. 1.39 показан результат ее работы.
Познакомимся на практике в рамках данного примера со свойством, которое определяет доступ к элементам управления. Как мы уже знаем, у элементов управления имеется свойство Enabled. Когда для этого свойства установлено значение True, доступ к данному элементу разрешен, а в противном случае (при значении False) доступ запрещен.
Изменим предыдущую разработку следующим образом. В окне свойств для кнопок Старт и Отобразить время значение свойства Enabled установим True, а для кнопки Стоп в качестве значения этого свойства выберем False. В результате в начале работы для действий пользователя доступна кнопка, позволяющая отобразить время, и кнопка секундомера, а кнопка Стоп недоступна. Теперь при щелчке на кнопке Старт доступ к кнопке Стоп должен разрешаться, кнопка Старт должна стать недоступной. В листинге 1.21 показана модифицированная процедура обработки щелчка па кнопке Стоп, которая затрагивает свойства двух кнопок, относящихся к секундомеру.
1 2 3 4 5 6 7 | ' Листинг 1.21. Модифицированная процедура, ' выполняемая по щелчку на кнопке Стоп Private Sub StopSec_Click() Flag = 1 StopSec.Enabled = False Start.Enabled = True End Sub |
Также требуются небольшие изменения в процедуре обработки щелчка на кнопке Старт. Ее текст представлен в листинге 1.22.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ' Листинг 1.22. Измененная процедура, ' выполняемая по щелчку на кнопке Старт Private Sub Start_Click() Th.Text = "" Tm.Text = 0 Ts.Text = 0 Flag = 0 Sec = Format(Now(), "ss") Shet = 0 StopSec.Enabled = True Start.Enabled = False While Flag = 0 Sec2 = Format(Now(), "ss") If Sec <> Sec2 Then Shet = Shet + 1 Sec = Sec2 ChetMins = Shet 60 ChetSecs = Shet - ChetMins * 60 Tm.Text = ChetMins Ts.Text = ChetSecs End If DoEvents Wend End Sub |
После выполненных изменений доступ к кнопкам в программе реализуется попеременно. Заметим, что по мере рассмотрения дальнейших разработок в наших статьях будет наблюдается общая тенденция на усложнение, поэтому рекомендуется каждый рассматриваемый пример прорабатывать детально. Необходимые сведения по VBA будут приводиться здесь и в последующих статьях в процессе рассмотрения разработок, поэтому явной необходимости в использовании дополнительной справочной информации нет. С другой стороны, было бы очень хорошо, если бы читатель познакомился с известными книгами по рассматриваемой теме.