class="p1">Private Sub Таймер_часов_Timer()
Время_на_часах = Time
Циферблат_часов.Text = Время_на_часах
If Время_на_часах = 0 Then Смена_даты_и_дня_недели
If Время_на_часах = Циферблат_будильника.Text Then Включить_сигнал_будильника
End Sub
Private Sub Включить_сигнал_будильника()
Плеер. Command = "Open"
Плеер. Command = "Play"
End Sub
Запустите проект и установите время на циферблате будильника. Устанавливайте аккуратно, по одной цифре за раз. Не трогайте двоеточия. Почему — скажу чуть позже. Дождитесь, когда будильник зазвонит. Завершите работу проекта, не дожидаясь конца мелодии.
Пора заняться кнопками и меткой. Подумаем вот о чем. Во время работы проекта будильник в каждый момент времени может находиться в одном из двух состояний: установлен или не установлен. Компьютер должен в любой момент времени знать, в каком именно, чтобы принять решение — звонить или не звонить. В таких случаях, когда компьютер должен в любой момент что-то знать или помнить, программист всегда придумывает переменную величину, дает ей подходящее имя и тип и организует хранение в этой переменной нужной компьютеру информации. Так было у нас с переменной Время_на_часах, которая нужна была компьютеру для перестановки дат.
Придумаем переменную и дадим ей имя Будильник_установлен. Каким типом ее объявить? Для этого надо понять, а какие значения будет принимать эта переменная? По смыслу задачи значений два — "да" и "нет". Можно придать ей тип String, но хорошая практика программирования диктует тип Boolean. Вы скоро поймете, что он удобнее.
Теперь попробуем вообразить, что должно происходить при включении будильника. Нужно сообщить компьютеру, что будильник установлен.
Нужно, чтобы текст над циферблатом был такой: "Будильник установлен на: " Нужно, чтобы текст на кнопке был такой: "Выключить будильник".
В соответствии с этим пишем процедуру:
Private Sub Включить_будильник()
Будильник_установлен = True
Метка_будильника. Caption = "Будильник установлен на:"
Кнопка_включения_выключения_будильника. Caption = "Выключить будильник"
End Sub
Теперь попробуем вообразить, что должно происходить при выключении будильника:
Нужно сообщить компьютеру, что будильник не установлен
Нужно, чтобы текст над циферблатом был такой: "Будильник отключен"
Нужно, чтобы текст на кнопке был такой: "Включить будильник"
В соответствии с этим пишем процедуру:
Private Sub Выключить_будильник()
Будильник_установлен = False
Метка_будильника. Caption = "Будильник отключен"
Кнопка_включения_выключения_будильника. Caption = "Включить будильник"
End Sub
Теперь нам удивительно легко написать процедуру щелчка по кнопке включения-выключения будильника:
Private Sub Кнопка_включения_выключения_будильника_Click()
If Будильник_установлен Then Выключить_будильник Else Включить_будильник
End Sub
Обратите внимание, что благодаря удачному выбору имен и структуры программы язык программы по своей понятности приближается к естественному, человеческо-
Поскольку переменная Будильник_установлен имеет логическое значение True или False, ее можно использовать подобно функции IsNumeric в качестве условия оператора If. Поэтому совсем необязательно было писать If Будильник_установлен = True Then…
Процедуру щелчка по кнопке выключения сигнала приведу без пояснений:
Private Sub Кнопка_выключения_сигнала_Click ()
Плеер. Command = "Close"
End Sub
В последних четырех процедурах заключена вся механика работы кнопок и метки. Последнее, о чем надо позаботиться, это о том, чтобы будильник звенел только тогда, когда включен:
If Будильник_установлен And Время_на_часах = Циферблат_будильника.Text Then Включить_сигнал_будильника
Будильник готов. Приведу полностью программу всего нашего проекта. Пока не обращайте внимания на строки, касающиеся секундомера.
Option Explicit
Private Enum типРежим_работы_секундомера
считает
пауза
в_нуле
End Enum
Dim Режим_работы_секундомера As типРежим_работы_секундомера
Dim Время_на_часах As Date
Dim Будильник_установлен As Boolean
Dim Время_на_секундомере As Single
Dim Время_запуска_секундомера As Single
Dim Время_на_паузе_секундомера As Single
Dim Цифра_десятых As Long
'НАЧАЛЬНАЯ УСТАНОВКА МЕХАНИЗМА
Private Sub Form_Load()
Плеер. DeviceType = "Sequencer"
Плеер. FileName = "c: WindowsMediaCanyon.mid"
Смена_даты_и_дня_недели
Выключить_будильник
Секундомер_обнулить
End Sub
'ПРОЦЕДУРЫ РАБОТЫ ЧАСОВ
Private Sub Таймер_часов_Timer()
Время_на_часах = Time
Циферблат_часов.Text = Время_на_часах
If Время_на_часах = 0 Then Смена_даты_и_дня_недели
If Будильник_установлен And Время_на_часах = Циферблат_будильника.Text Then Вкточить_сигнал_будильника
End Sub
Private Sub Смена_даты_и_дня_недели()
Циферблат_даты.Text = Date
Циферблат_дня_недели.Text = WeekdayName(DatePart("w", Date, vbMonday))
End Sub
'ПРОЦЕДУРЫ РАБОТЫ БУДИЛЬНИКА
Private Sub Кнопка_включения_выключения_будильника_Click()
If Будильник_установлен Then Выключить_будильник Else Включить_будильник
End Sub
Private Sub Включить_будильник()
Будильник_установлен = True
Метка_будильника. Caption = "Будильник установлен на:"
Кнопка_включения_выключения_будильника. Caption = "Выключить будильник"
End Sub
Private Sub Выключить_будильник()
Будильник_установлен = False
Метка_будильника. Caption = "Будильник отключен"
Кнопка включения выключения будильника. Caption = "Включить будильник"
End Sub
Private Sub Включить_сигнал_будильника()
Плеер. Command = "Open"
Плеер. Command = "Play"
End Sub
Private Sub Кнопка_выключения_сигнала_Сlick()
Плеер. Command = "Close"
End Sub
Private Sub Form_Terminate()
Кнопка_выключения_сигнала_Сlick
End Sub
'ПРОЦЕДУРЫ РАБОТЫ СЕКУНДОМЕРА
Private Sub Таймер_секундомера_Timer()
Время_на_секундомере = Timer — Время_запуска_секундомера + Время_на_паузе_секундомера
Цифра_десятых = Int(10 * (Время_на_секундомере Int(Время_на_секундомере)))
Циферблат_секундомера.Text = DateAdd("s", Время_на_секундомере, #12:00:00
AM#) & & Цифра_десятых
End Sub
Private Sub Кнопка_пуска_паузы_секундомера_С1ick()
If Режим_работы_секундомера О считает Then Секундомер_запустить Else Ceкундомер_остановить
End Sub
Private Sub Кнопка_обнуления_секундомера_Сlick()
Секундомер_обнулить
End Sub
Private Sub Секундомер_запустить()
Время_запуска_секундомера = Timer
Режим_работы_секундомера = считает
Таймер_секундомера. Enabled = True
Кнопка_пуска_паузы_секундомера. Caption = "ПАУЗА"
End Sub
Private Sub Секундомер_остановить()
Время_на_паузе_секундомера = Время_на_секундомере
Режим_работы_секундомера = пауза
Таймер_секундомера. Enabled = False
Кнопка_пуска_паузы_секундомера. Caption = "ПУСК"
End Sub
Private Sub Секундомер_обнулить()
Время_на_паузе_секундомера = 0
Режим_работы_секундомера = в_нуле
Таймер секундомера. Enabled = False
Кнопка_пуска_паузы_секундомера. Caption = "ПУСК"
Циферблат_секундомера.Text = "0:00:00.0"
End Sub
Обратите внимание, что при запуске проекта я в процедуре Form_Load выключаю для удобства будильник, а в процедуре Form_Terminate закрывается звуковой файл, если пользователь не удосужился закрыть его кнопкой. В ней мы обращаемся к процедуре обработки события Кнопка_выключения_сигнала_Click, как к процедуре пользователя. Это вполне допустимо.
Напоминаю, что событие Form_Terminate наступает только тогда, когда мы завершаем работу проекта, щелкнув по кнопке Close (крестику в правом верхнем углу формы), а не кнопкой End на панели инструментов.
Знакомимся с перечислимым типом данных
Чтобы грамотно