Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ch01.doc
Скачиваний:
15
Добавлен:
03.09.2019
Размер:
350.72 Кб
Скачать

Пример вывода информации о текущем времени

Перейдем теперь к следующей — уже более сложной разработке. Итак, на рабочем листе необходимо создать интерфейс, показанный на рис. 1.37.

Здесь обозначения Часы, Минуты и Секунды представляют элементы управления ”Надпись” и являются просто поясняющими подписями рядом с соответствующими текстовыми окнами, в которые выводится информация о времени. Этот вывод инициирует щелчок по кнопке Отобразить время. Фактически, таким образом, мы реализуем на рабочем листе вариант электронных часов.

Фрагмент Секундомер (это слово набрано просто в ячейке на листе) позволяет в тех же окнах реализовать функции секундомера. Работа секундомера запускается по кнопке Старт. В этом случае текстовое окно для отображения текущего часа очищается, а информация в окнах, отводимых для минут и секунд, начинает обновляться.

Если пользователю требуется остановить отсчет, то он должен щелкнуть по кнопке Стоп, после чего обновление времени останавливается.

В табл. 1.1 указаны имена и типы объектов, расположенных на рис. 1.37.

В качестве первого шага введем переменную Flag, которая нам понадобится для остановки обновления времени. Эта переменная должна быть известна как процедуре обработки щелчка по кнопке Старт, так и процедуре обработки щелчка по кнопке Стоп.

В редакторе VBA существует общая область, где можно описывать переменные (рис. 1.38), которые должны быть известны внутри нескольких процедур.

Строка программы в окне, представленном на рис. 1.38 означает следующее:

  • Dim — определить (это ключевое слово Visual Basic);

  • Flag — имя переменной;

  • As Integer — определение данной переменной как целой (значениями переменной могут быть только целые числа).

Рис. 1.37. Реализация часов и секундомера

Рис. 1.38. Определение переменной в общей области

Таким образом, мы определили переменную, которая должна быть известна всем процедурам на данном рабочем листе Excel. И если одна из процедур поменяет значение переменной Flag, то в другой процедуре это изменение можно увидеть. В дальнейшем мы этим воспользуемся для остановки обновления времени по щелчку по кнопке.

Таблица 1.1. Имена объектов на рис.1.37

Свойство Name

Тип объекта

Комментарий

Th

Текстовое окно

Для вывода текущего часа

Tm

Текстовое окно

Для вывода минут

Ts

Текстовое окно

Для вывода секунд

Vrema

Кнопка

Caption — Отобразить время

Start

Кнопка

Caption — Старт

StopSec

Кнопка

Caption — Стоп

После такого вступительного комментария можно привести процедуру обработки щелчка по кнопке Отобразить время (листинг 1.18).

Листинг 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.19. Процедура обработки щелчка по кнопке Стоп

Private Sub StopSec_Click()

Flag = 1

End Sub

Таким образом, мы обеспечили вывод текущего времени и его остановку. Что касается остановки, то она скорее требуется для секундомера. И теперь наша задача заключается в реализации его функциональности. На листинге 1.20 приведена процедура, которая выполняется по щелчку по кнопке Старт, что позволяет включить секундомер.

Листинг 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 показан результат ее работы.

Рис. 1.39. Пример работы секундомера

Познакомимся на практике в рамках данного примера со свойством, которое определяет доступ к элементам управления. Как мы уже знаем, у элементов управления имеется свойство Enabled . Когда для этого свойства установлено значение True, то доступ к данному элементу разрешен, а в противном случае (при значении False) доступ запрещен.

Изменим предыдущую разработку следующим образом.

В окне свойств для кнопок Старт и Отобразить время значение свойства Enabled установим True, а для кнопки Стоп в качестве значения этого свойство выберем False. В результате в начале работы для действий пользователя доступна кнопка, позволяющая отобразить время и кнопка секундомера, а кнопка Стоп недоступна. Теперь при щелчке по кнопке Старт доступ к кнопке Стоп должен разрешаться, кнопка Старт должна стать недоступной. На листинге 1.21 показана модифицированная процедура обработки щелчка по кнопке Стоп, которая затрагивает свойства двух кнопок, относящихся к секундомеру.

Листинг 1.21. Модифицированная процедура, выполняемая по щелчку по кнопке Стоп

Private Sub StopSec_Click()

Flag = 1

StopSec.Enabled = False

Start.Enabled = True

End Sub

Также требуются небольшие изменения в процедуре обработки щелчка по кнопке Старт. Ее текст представлен на листинге 1.22.

Листинг 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 будут приводиться здесь и в последующих главах в процессе рассмотрения разработок, поэтому явной необходимости в использовании дополнительной справочной информации нет. С другой стороны, было бы очень хорошо, если бы читатель познакомился с известными книгами по рассматриваемой теме [3–4].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]