таймера часов, то задача будет решена. Но мне жаль компьютер. 24 часа в сутки по 10 раз в секунду он будет спрашивать у Windows, какое нынче число, и стараться вывести в текстовое поле одну и ту же дату, хотя делать это нужно только два раза — при запуске проекта и в полночь. Здесь еще и вопрос экономии: бегая, как белка в колесе, компьютер тратит ресурсы (силы), нужные в это же время для другого дела, для того же секундомера хотя бы. Вспоминаем: при запуске проекта вырабатывается событие FormLoad, а полночь — это когда показания часов равны нулю. Ага. Дописываем программу:
Private Sub Form_Load()
Циферблат_даты.Text = Date 'Это чтобы дата появлялась на циферблате
при запуске проекта
End Sub
Private Sub Таймер_часов_Timer()
Циферблат часов.Text = Time
If Time = 0 Then Циферблат_даты.Text = Date 'Это чтобы дата меня
лась в полночь End Sub
Чтобы проверить, как работает проект, переставьте системные часы Windows на "Двенадцать без пяти". Только потом не забудьте переставить обратно.
Все работает, но мы начинаем допускать погрешности против правильного стиля программирования, которые в будущем могут выйти нам боком:
Первое. Показания часов напрашиваются быть переменной величиной. Ведь они нам еще понадобятся и для будильника. Мы их анализируем, а это лучше делать с переменной величиной, а не со свойством Циферблат_часов.Text или функцией Time. Поэтому придумаем переменную Время_на_часах, объявим ее, как имеющую тип Date и будем пользоваться только ей.
Второе. Как при запуске проекта, так и в полночь нам придется менять не только дату, но и день недели. Я предвижу повторяющийся фрагмент как минимум из двух операторов (пока это только один оператор Циферблат_даты.Text = Date). Поэтому оформим его, как процедуру с именем Смена_даты_и_дня_недели.
Третье. Поскольку у нас появились переменные, поручим Бэйсику при помощи оператора Option Explicit присматривать, не забыли ли мы какую-нибудь переменную объявить.
С учетом всего вышесказанного перепишем программу:
Option Explicit
Dim Время_на_часах As Date
Private Sub Form_Load()
Смена_даты_и_дня_недели End Sub
Private Sub Таймер_часов_Timer()
Время_на_часах = Time
Циферблат_часов.Text = Время_на_часах
If Время_на_часах = 0 Then Смена_даты_и_дня_недели
End Sub
Private Sub Смена_даты_и_дня_недели()
Циферблат_даты.Text = Date
End Sub
В этот момент вы совершенно искренне и с большим чувством можете сказать: "Ну зачем все эти усложнения? Ведь все и так работает!" В ответ на это я могу только отослать вас к началу раздела.
Занимаемся днем недели
Копируем объекты. Нам не хочется трудиться, размещая на форме, а потом еще и настраивая рамку и текстовое поле для дня недели. Замечаем, что они почти такие же, как для даты. Скопируем их, как это принято в Windows. Можно копировать по-отдельности, а удобнее вместе. Для этого обведите их рамочкой, при этом оба объекта выделятся, после чего скопируйте их хотя бы при помощи пунктов Copy, Paste меню Edit. Visual Basic при этом задаст вам про каждый объект вопрос, смысл которого вы поймете позже, а пока он вам не нужен. Отвечайте No.
Даем полю имя Циферблат_дня_недели. Чтобы там появился правильный день недели, нужно выполнить оператор
Циферблат_дня_недели.Text = WeekdayName(DatePart("w", Date, vbMonday))
Попробуйте разобраться в нем сами в качестве упражнения к функциям работы с датами. Если не удалось, то вот вам пояснение:
Сначала хорошенько еще раз разберитесь с функциями WeekdayName и DatePart из 0. А теперь нужно разобраться со скобками. Вы поняли, какая пара скобок к какой функции относится? Если нет, то я перепишу один оператор в два:
А = DatePart("w", Date, vbMonday)
Циферблат_дня_недели.Text = WeekdayName(A)
Здесь А будет равняться номеру дня недели (число от 1 до 7). Функция WeekdayName по номеру дня недели получает строковое название этого дня.
Раз мы организовали процедуру Смена_даты_и_дня_недели, то нам нет нужды вспоминать, в какие моменты времени проект должен менять день недели. Вставляем наш оператор в эту процедуру:
Private Sub Смена_даты_и_дня_недели()
Циферблат_даты.Text = Date
Циферблат_дня_недели.Text = WeekdayName(DatePart("w", Date, vbMonday))
End Sub
В качестве последнего штриха исправим одну неприятную вещь. Дело в том, что наши циферблаты совершенно беззащитны перед шаловливым пользователем. В режиме работы проекта вы можете щелкнуть мышкой внутри текстового окна и с клавиатуры безнаказанно как угодно менять его содержимое. Чтобы прекратить это, воспользуйтесь свойством Locked.
Итак, часы с датой и днем недели готовы.
Знакомимся с типом Boolean
Чтобы грамотно запрограммировать будильник, нам нужно познакомиться с новым типом переменных величин — Boolean. Это так называемый логический тип. Вы уже позакомились с логическими выражениями. Их главная черта в том, что они могут принимать всего два значения — True и False (истина и ложь). Логическая переменная величина отличается той же чертой. Объявляется она так:
Dim С As Boolean
А зачем она нужна, выяснится из следующего параграфа.
Делаем будильник
Поместим на форму все объекты, необходимые для будильника. Дадим им имена:
Meтка_будильника
Циферблат_будильника
Кнопка_включения_выкточения_будильника
Кнопка_выключения_сигнала
В циферблат занесем в режиме проектирования текст 12:00:00. Просто для того, "чтобы было".
Давайте пока забудем о кнопках, метках и прочих подробностях, а возьмем быка за рога и заставим будильник исполнять мелодию при совпадении времени на часах и на будильнике.
Вспомните, как вы занимались музыкой в "Калькуляторе". Поместите на форму Microsoft Multimedia Control 6.0 и дайте ему имя "Плеер". Для работы с мелодией нам нужно 5 операторов:
Плеер. DeviсеТуре = "Sequencer"
Плеер. FileName = "c: WindowsMediaCanyon.mid"
Эти два достаточно выполнить один раз за время работы проекта при его запуске.
Плеер. Command = "Open"
Плеер. Command = "Play"
Эти два нужно выполнять каждый раз, когда нужно начать воспроизведение сигнала. А этот оператор:
Плеер. Command = "Close"
каждый раз, чтобы его закончить.
Вторая парочка, несмотря на то, что встретится в программе скорее всего только один раз, в глазах программиста просится стать процедурой. Здесь принцип такой: Если группа операторов (или даже один сложный оператор) представляет собой некое единое целое в том смысле, что решает какую-то свою задачу, то оформляйте ее процедурой. Это улучшит понятность и читабельность программы — один из важнейших факторов ее качества.
Вот как дополнился теперь наш проект (я показываю только те процедуры, которых коснулись дополнения):
Private Sub Form_Load()
Плеер. DeviceType = "Sequencer"
Плеер. FileName = "c: WindowsMediaCanyon.mid"
Смена_даты_и_дня_недели
End Sub