Модули VB: краткий обзор
Обычно легче понять новую концепцию, если ассоциировать ее с другой, уже освоенной. Начнем с обзора модулей Visual Basic, а затем посмотрим, как те же концепции могут быть применены к модулям классов. Разработаем небольшое приложение, подсчитывающее время (оно может стать частью другого приложения, которому необходимо вычислять время выполнения своих операций). Приложение должно иметь возможность запускать и останавливать таймер по своему желанию. Когда в приложении выполняется вспомогательный программный код, необходимо иметь возможность приостановить таймер, а затем продолжить отсчет времени. После завершения операции, продолжительность которой определяется, должна быть предусмотрена возможность считывания прошедшего времени. Поместим все необходимые переменные и функции в модуль. При этом его можно будет повторно использовать в других проектах. (Вообще, такая практика является хорошим тоном в программировании — изолировать механизм определения промежутков времени от остального кода и сделать его доступным приложению через вызов нескольких процедур). Приложение, которое будет разработано в этом разделе, называется TimerMod, и его можно найти в папке этой главы на компакт-диске.
Создайте новый проект и добавьте в него модуль. Затем введите в этот модуль следующие строки.
Программа 15.1. Код модуля TimerMod
Public TotalInterval As Double
Dim T1 As Double
Sub StartCounting()
Tl = Time
End Sub
Sub StopCounting ()
Totallnterval = Totallnterval + Time – Tl
End Sub
Sub ResetTimer()
Totallnterval = 0
End Sub
Процедура
StartCounting()
запускает таймер, а процедура StopCounting() — останавливает. Каждый раз после остановки таймера переменная Totallnterval
обновляется. Для получения затраченного времени приложение должно прочесть значение этой переменной. И, наконец, процедура ResetTlmer() переустанавливает таймер. Такой механизм отсчета времени не позволяет прочитать затраченное время во время работы таймера. Необходимо сначала вызвать метод StopCounting для обновления переменной Totallnterval,
затем считать значение переменной.
А сейчас перейдите к формам приложения и поместите две кнопки на форму. Установите их заголовки в Start Timing и Show Interval, как показано на рис. 15.1. Затем добавьте следующие строки в содержимое окна кода формы.
Программа 15.2. Код тестирования
TimerMod
Private Sub Commandl_Click()
If Coinmandl.Caption = "Start" Then
StartCounting
Command1.Caption = "Stop" ' (Остановка)
Else
StopCounting
Command1.Caption = "Start" ' (Запуск)
End If
End Sub
Private Sub Command2_Click ()
MsgBox "I've been counting for " & vbCrLf & _
Hour(TotalInterval) & "hours" & vbCrLf & _
Minute(TotalInterval) & " minutes and" & vbCrLf & _
Second(TotalInterval) & " seconds" & vbCrLf
' (С начала отсчета прошло... часов... минут и... секунд)
End Sub
Выполните приложение, запустите таймер, остановите и запустите его еще несколько раз. Затем нажмите кнопку Show Interval для оценки затраченного времени в часах, минутах и секундах.
Программа работает, но потенциально существуют несколько проблем. Если другой разработчик имеет доступ к этому же модулю, он может попытаться присвоить переменной
Totallnterval
какое-либо значение:
TotalInterval = 0.00453567
Такое присваивание допустимо для интервала времени, но что произойдет, если он попытается присвоить недопустимое значение, например:
TotalInterval = 99
Рис. 15.1. Форма проекта TimerMod
Вероятнее всего, программа будет работать, но она больше не будет правильно информировать о затраченном времени. Другой программист может проигнорировать процедуру ResetTimer() и попытаться переустановить переменную Totallnterval из процедуры StartCounting(). Возможно, его действительно не интересует остановка и возобновление процесса отсчета времени и ему удобно переустанавливать переменную Totallnterval каждый раз при вызове функции StartCounting(). Его проект будет работать (и с меньшим числом вызовов), но ваш нет. В этом и заключается наиболее важное преимущество в реализации вспомогательных процедур в виде модулей классов — создание компонентов, совместимых со многими приложениями. В дополнение, реализуя механизм отсчета времени отдельно от приложения, можно скрыть детали ее реализации от разработчиков, которые ее используют. Ведь на самом деле не надо знать, как Excel вычисляет сложное математическое выражение в процессе вызова его метода Evaluate.