Обновление изображения
Теперь можно написать код, который обновляет изображение и вызывает событие TimeOut. Код, который будет написан в этом разделе, не имеет никакого отношения к конструированию элемента управления ActiveX. Этот код необходим при реализации таймера как самостоятельного приложения.
Совет
Если вы еще не совсем привыкли к среде конструирования ActiveX, то можно разработать обычное приложение, которое делает то же самое (то есть отсчитывает время, показывает прошедшее или оставшееся время на элементе управления Label, и обнаруживает, когда подходит время сигнала). Затем можно скопировать необходимые процедуры и вставить их в окне проекта ActiveX.
Теперь напишем код для происходящего каждую секунду события Timer элемента управления Timer. Для этого следует установить свойство Interval элемента управления Timer равным 1000. В обработчике события Timer элемента управления Timer следует обновить изображение и проверить, не нужно ли выключить сигнал.
Программа 16.16. Событие Timer элемента управления Alarm
Private Sub Timerl_Timer()
Dim TimeDiff As Date
Dim StopNow As Boolean
If Time - m_AlarmTime > 0 Then
If NextDay = False Then
StopNow = True
Else
TimeDiff = 24 - Time + m_AlarmTime
End If
Else
If NextDay = True Then
StopNow = True
Else
TimeDiff = m_AlarmTime - Time
End If
End If
If m_CountDown Then
Label1.Caption = Format$(Hour(TimeDiff) & ":" & _
Minute(TimeDiff) & ":" & Second(TimeDiff), "hh:mm:ss")
Else
Label1.Caption = Format(Hour(Time - startTime) & ":" & _
Minute(Time - startTime) & ":" & _
SecondfTime - startTime), "hh:mm:ss")
End If
If StopNow Then
Timeri.Enabled = False
RaiseEvent TimeOut
End If
End Sub
Способ остановки таймера и вызова события TimeOut зависит от того, настроен ли элемент управления для обратного отсчета. При обратном отсчете он отображает оставшееся время, а при прямом отсчете он отображает время, прошедшее с момента запуска таймера (переменная startTime
устанавливается методом StartTimer). Когда достигается значение AlarmTime, таймер останавливается. Это условие в коде проверяется последней If-структурой. Переменная NextDay устанавливается в методе StartTimer. Когда подходит время подачи сигнала, переменная NextDay изменяет свое значение, и это событие сообщает о том, что сигнал включен.
Можно предположить, что момент для инициирования события TimeOut может быть вычислен путем сравнивания AlarmTime с текущим временем:
If Time = AlarmTime Then
Timeri.Enabled = False
RaiseEvent TimeOut
End If
Но этот код никогда не будет работать. Если компьютер слишком занят в момент, когда подходит время сигнала (например, запуск другого приложения или проверка жесткого диска), событие Timer для последней секунды может быть не вызвано. Если это событие было пропущено, нужно будет ждать 24 часа, прежде чем подойдет время следующего сигнала (и потом он снова может не сработать!). Реализация, которая выполнена в нашем примере, включит сигнал, если даже это произойдет на секунду или две позже.
Посмотрите, насколько просто генерируются собственные события. Просто необходимо вызвать метод RaiseEvent из собственного кода, и Visual Basic поймет, что о событии сообщено основному приложению. В приложении любое условие в любое время может инициировать событие. Кроме того, в начале кода наряду с объявлением переменных нужно добавить объявление события TimeOut.
Event TimeOut()
Откройте проект Alarm и исследуйте код объекта UserControl вместе с кодом тестового проекта. Код очень простой, именно поэтому он был выбран для реализации вручную. Естественно, проще реализовать пользовательские элементы управления с помощью мастера интерфейса элемента управления ActiveX, но важно понять, что происходит и что мастер делает автоматически.