Уроки 61–62 · 2 урока · Н. И. Тайлаков (общий редактор), А. Б. Ахмедов, М. Д. Пардаева, А. А. Абдуганиев, У. М. Мирсанов. Информатика и информационные технологии, 10 класс, 1-е издание. «Extremum-Press», Ташкент, 2017
61
Объект Timer и его использование
Учебник: с. 138–143
ЦельИспользует свойства Interval и Enabled и событие OnTimer объекта Timer: создаёт электронные часы, обратный отсчёт и кнопку остановки/запуска.
Новые слова
Timer: невидимый объект, вызывающий событие через равные промежутки времени · TimerInterval: время между двумя событиями таймера в миллисекундах · IntervalOnTimer: событие, выполняемое каждый раз по истечении интервала · OnTimerмиллисекунда: одна тысячная секунды · millisekund
Объяснение
Для задач, зависящих от времени – часы, обратный отсчёт, анимация, – используется Timer (вкладка System). Он не виден в окне приложения, но если он включён, то через заданное время вызывает событие OnTimer, процедура выполняется, и приложение продолжает работу. У Timer два свойства: Enabled (при True он работает, при False останавливается; сначала True) и Interval – время между событиями в миллисекундах (сначала 1000, то есть 1 секунда). 1 секунда = 1000 миллисекунд, поэтому чтобы он срабатывал 20 раз в секунду, Interval = 1000 / 20 = 50. Для часов запишите Label1.Caption := TimeToStr(Now); Now – текущее время часов компьютера, а TimeToStr преобразует его в текст. Для обратного отсчёта нужна глобальная переменная, потому что значение должно сохраняться от одного выполнения OnTimer до другого; не давайте ей имя свойства, например Left, Top, Width или Caption, иначе внутри процедуры формы это имя будет означать собственное свойство формы. Интервал таймера неточен: Windows может немного его задерживать, поэтому если нужно точное время, используйте Now вместо подсчёта срабатываний.
Примеры
Часы: Label1 (Font.Size = 36), Timer1 (Interval = 1000). procedure TForm1.Timer1Timer(Sender: TObject); ⏎ begin ⏎ Label1.Caption := TimeToStr(Now); ⏎ end; Текст обновляется каждую секунду, например с 09:15:07 на 09:15:08.
Обратный отсчёт (старт гонки): глобально var qoldi: Integer; Кнопка Ready: qoldi := 10; Timer1.Enabled := True; Timer1 (Interval = 1000): procedure TForm1.Timer1Timer(Sender: TObject); ⏎ begin ⏎ qoldi := qoldi - 1; ⏎ if qoldi > 0 then ⏎ Label1.Caption := IntToStr(qoldi) ⏎ else ⏎ begin ⏎ Label1.Caption := 'Start!'; ⏎ Timer1.Enabled := False; ⏎ end; ⏎ end; Label показывает 9, 8, …, 1, а затем появляется Start! При Interval = 1000 это занимает 10 секунд, а при Interval = 500 – 10·500 мс = 5 секунд.
Работа в классе
«Счёт»: пара создаёт приложение с обратным отсчётом на 20 секунд, добавляет кнопку «Стоп/Продолжить» (Enabled := not Enabled) и заранее вычисляет, как изменяется время отсчёта при изменении Interval.
Упражнения
1
В каких единицах измеряется свойство Interval компонента Timer?
В миллисекундах
2
Если Interval = 250, сколько раз срабатывает Timer за 1 секунду?
4
3
Обратный отсчёт начинается с 45 при Interval = 1000. Через сколько секунд он достигнет 0?
45
4
Почему значение обратного отсчёта хранится в глобальной переменной?
Локальная переменная исчезает, когда процедура заканчивается, а значение нужно сохранить до следующего выполнения OnTimer.