Visual Basic 6. Руководство разработчика

       

Обновление изображения


Теперь можно написать код, который обновляет изображение и вызывает событие 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, но важно понять, что происходит и что мастер делает автоматически.


Содержание раздела