На этом шаге мы рассмотрим компонент TTimer.
Компонент Timer позволяет задавать в приложении интервалы времени . Таймер находит многочисленные применения: синхронизация мультипликации, закрытие каких-то окон, с которыми пользователь долгое время не работает, включение хранителя экрана или закрытие связей с удаленным сервером при отсутствии действий пользователя, регулярный опрос каких-то источников информации, задание времени на ответ в обучающих программах - все это множество задач, в которых требуется задавать интервалы времени, решается с помощью таймера.
Таймер - невизуальный компонент, который может размещаться в любом месте формы. Компонент TTimer имеет два свойства:
Свойство | Описание |
---|---|
Property Enabled: Boolean; | Устанавливается в значение True, если требуется, чтобы включился системный генератор сообщений WM_Timer. |
Property Interval: Cardinal; | Задает промежуток времени в миллисекундах между приходом сообщений. |
Данные свойства позволяют управлять компонентом. Свойство Interval задает период срабатывания таймера. Через заданный интервал времени после предыдущего срабатывания, или после программной установки свойства Interval, или после запуска приложения, если значение Interval установлено во время проектирования, таймер срабатывает, вызывая событие OnTimer. В обработчике этого события записываются необходимые операции.
Если задать Interval = 0 или Enabled = False, то таймер перестает работать. Чтобы запустить отсчет времени надо или задать Enabled = True, если установлено положительное значение Interval, или задать положительное значение Interval, если Enabled = False.
Например, если требуется, чтобы через 5 секунд после запуска приложения закрылась форма - заставка, отображающая логотип приложения, на ней надо разместить таймер, задать в нем интервал Interval = 5000, а в обработчик события OnTimer вставить оператор Close, закрывающий окно формы.
Если необходимо в некоторой процедуре запустить таймер, который отсчитал бы заданный интервал, например, 5 секунд, после чего надо выполнить некоторые операции и отключить таймер, это можно сделать следующим образом. При проектировании таймер делается доступным (Enabled = True), но свойство Interval задается равным 0. Таймер не будет работать, пока в момент, когда нужно запустить таймер, не выполнится оператор
Timer1.Interval:=5000;
Timer1.Interval:=0;
Другой эквивалентный способ решения задачи - использование свойства Enabled. Во время проектирования задается значение Interval = 5000 и значение Enabled = False. В момент, когда надо запустить таймер, выполняется оператор:
Timer1.Enabled:=True;
Timer1.Enabled:=False;
Таймер точно выдерживает заданные интервалы Interval, если они достаточно велики - сотни и тысячи миллисекунд. Если же задавать интервалы длительностью десятки или единицы миллисекунд, то реальные интервалы времени оказываются заметно больше вследствие различных накладных расходов, связанных с вызовами функций и иными вычислительными аспектами.
Таким образом, компонент TTimer используется в тех случаях, когда в программе необходимо периодически выполнять определенное действие и при этом не загружать процессор проверкой некоторых условий. Например, простой периодический контроль текущего времени (с помощью подпрограмм получения текущих даты/времени или стандартной функции GetTickCount, возвращающей число миллисекунд, прошедших с полуночи) непосредственно из программы - решение не оптимальное. Оно не позволяет системе Windows эффективно управлять работой других программ.
Microsoft рекомендует отслеживать сообщения, поступающие от системного таймера Windows (такое системное сообщение обозначается WM_Timer). С помощью компонента TTimer можно включить генерацию подобных сообщений с заданной периодичностью и выполнять определенную часть вычислений именно в обработчике этого события.
Приведем стандартный пример использования таймера - создадим электронные часы (рис.1.).
Рис.1. Использование компонента TTimer
Для этого разместим на форме следующие компоненты TTimer и TLabel (рис.2).
Рис.2. Windows-окно примера при проектировании
Обработчик события OnTimer выглядит следующим образом:
procedure TForm1.Timer1Timer(Sender: TObject); begin Label2.Caption:=TimeToStr(Time); end;
Значение свойства Interval установлено в 1000 мс (одна секунда). Текущее время возвращается стандартной функцией Time и затем преобразуется в строку с помощью функции TimeToStr.
На следующем шаге мы рассмотрим компонент TPaintBox.