Таймер, или Обуздаем время

 

Среда Delphi позволяет достаточно легко работать со временем и датами. Кроме того, с помощью компонента Timer можно периодически вызывать события через равные промежутки времени (например, через 1 сек.).

Задачи урока

  • Работа с компонентом таймера —Timer.
  • Определение текущего времени.
  • Перевод времени в строку.
  • Вычисление разницы во времени между двумя событиями.

Выполнение упражнения

В этом упражнении мы создадим приложение «Часы», которое показывает текущее время с точностью до 1 секунды и выводит время, которое прошло с момента запуска приложения (рисунок 1).

image001
Рисунок 1. Окно приложения

1. Дизайн приложения

1. Расположите компоненты, как показано на рисунке 2а и измените значения их свойств согласно рисунку 2б. У меток label2 и Label4 очищено свойство Caption. Также у них жирный шрифт размером 24 пункта.

 а)image003  б) image004
Рисунок 2

 

2. Вставка таймера

1. Для того чтобы часы шли, программа должна каждую секунду определять текущее время. В этом нам поможет невизуальный компонент Timerimage006 , расположенный на вкладке System. Поместите таймер на форму (рисунок 3).

image007
Рисунок 3

2. Измените имена компонентов следующим образом:

Имя, которое было

Имя, на которое

необходимо изменить

Label2 LabelNowTime
Label4 LabelAplTime
Button1 (Остановить время) ButtonStop
Button2 (Выход) ButtonClose
Timer1 Timer

3. Обработка события от таймера

1. Выберите таймер и посмотрите на его свойства и события в окне Инспектор объектов (рисунок 4). Их не так уж и много.

а)image008 б)image009
Рисунок 4

Первое свойство — Enabled. Оно имеет логический тип. Если Enabled = True, то таймер работает, если False, то не работает.

Второе свойство — Interval. Задаёт интервал между генерацией события таймера OnTimer (рисунок 4б) в миллисекундах. По умолчанию это свойство равно 1000, т. е. интервал равен одной секунде. В данном случае нас это вполне устраивает, поэтому менять интервал не будем.

2. Каждый раз, когда таймер «тикает», необходимо обновлять время. Для этого сделаем обработчик события «Тиканье часов» (называется он OnTimer). Щёлкните дважды по таймеру на форме. Появится единственный для этого компонента обработчик события. Допишите его следующим образом:

Procedure

 TForm1.TimerTimer(Sender: TObject);
begin

  LabelNowTime.Caption := TimeToStr( now );

end;

 

Листинг 1

Что это означает?

  • Now — это системная константа, которая возвращает текущее время и дату в виде значения типа TDateTime.
  • TimeToStr — функция, которая переводит тип TDateTime в тип String, причём принимает во внимание только время, а дату игнорирует.

Иначе говоря, указанную выше процедуру можно перевести так: «когда таймер тикает (каждую секунду), текст метки LabelNowTime меняется на текущее время».

3. Теперь необходимо вычислить и отобразить время, в течение которого работает наше приложение. Для этого необходимо запомнить время старта приложения и занести его в переменную типа TDateTime. Назовём её StartTime. Затем при каждом срабатывании таймера будем вычислять и отображать разность между текущим временем и временем, содержащимся в переменной StartTime.

Для этого объявите глобальную переменную StartTime типа TDateTime (выделено жёлтым цветом):

var
  Form1: TForm1;
  StartTime: TDateTime;

implementation

{$R *.dfm}

Листинг 2

4. Допишите обработчик события таймера OnTimer следующим образом:

procedure TForm1.TimerTimer(Sender: TObject);
begin

  LabelNowTime.Caption := TimeToStr( Now );
  LabelAplTime.Caption := TimeToStr( Now — StartTime );

end;

Листинг 3

Чтобы вычислить разность между двумя временными интервалами (либо между датами), достаточно просто найти их разность.

5. Обработайте событие OnCreate для формы следующим образом:

procedure TForm1.FormCreate(Sender: TObject);
begin

  // Переменной StartTime присваиваем текущее время
  StartTime := now;        
  // Вызываем обработчик таймера, чтобы в момент запуска программы произошло отображение начального времени
  TimerTimer(Sender);

end;

Листинг 4

Описание кода дано в комментариях.

 

4. Переключение режимов работы таймера

1. Программа автоматически включает таймер в момент старта приложения (т. к. свойство Enabled = True). В работающем приложении остановить его нельзя. Давайте введём эту возможность. Обработайте событие OnClick кнопки «Остановить время» следующим образом:

procedure TForm1.ButtonStopClick(Sender: TObject);
begin

  Timer.Enabled := False;

end;

Листинг 5

2. Запустите приложение и посмотрите на результат его работы. Нажмите кнопку «Остановить время».

Теперь вы всегда будете знать, сколько сейчас времени!

5. Коротко о главном

  • С помощью компонента Timer можно вызывать периодические события OnTimer через равные промежутки времени.
  • Промежуток времени таймера задаётся свойством Interval.
  • Включить/выключить таймер можно с помощью логического свойства Enabled.
  • Now — это системная константа в среде Delphi, которая возвращает текущее время и дату в виде значения типа TDateTime.
  • Чтобы вычислить разность между двумя временными интервалами (либо между датами), достаточно просто вычесть одно значение из другого.

6. Выполнение заданий

Задания I уровня сложности

1. Напишите приложение «Секундомер«. При нажатии на кнопку «Старт» должен запускаться таймер. При этом заголовок кнопки «Старт» меняется на «Стоп». При повторном нажатии на эту кнопку таймер останавливается, а заголовок возвращается в исходное состояние. При старте таймера время начинается с ноля и отображается в компоненте Label.


 

2. Напишите приложение «Обратный отсчёт«. При нажатии на кнопку «Старт» запускается таймер, а в компоненте Label отображается оставшееся время, начиная с 10 секунд. Когда время выйдет, заголовок метки изменится на «Время вышло».


 

3. Напишите приложение «Разница между датами«. На форме должно быть расположено два однострочных редактора и кнопка «Вычислить». В однострочные редакторы вводятся даты, между которыми необходимо узнать разницу. Результат (чч.мм.гггг) отображается в компоненте Label после нажатия на кнопку «Вычислить».


 

4. Напишите приложение, сравнивающее текущую дату и дату, введенную пользователем. Если введенная дата больше, то в компоненте Label появляется сообщение «Вы в будущем», если меньше, то выводится сообщение «Вы в прошлом», и если даты совпадают, то «Вы в настоящем!». Сравнение дат происходит при нажатии на кнопку «Сравнить».


5. Напишите приложение, в котором будут отображаться текущее время и дата. Приложение должно находиться поверх всех окон и быть «прижато» к правому верхнему углу экрана.


6. Напишите приложение, в котором происходит вычисление количества прожитых вами дней. Пользователь вводит дату рождения в однострочный редактор. При нажатии на кнопку «Вычислить» в компоненте Label происходит отображение результата.


7. Напишите приложение, в котором к текущей дате и времени прибавляется заданное число дней и часов. Они вводятся в своих однострочных редакторах. Вывод результата происходит после нажатия на кнопку «Вычислить».


8. Напишите приложение, в котором происходит отсчёт времени, оставшегося до ближайшего Нового года, а также сколько времени прошло от предыдущего. Время отсчитывается в часах.


9. Напишите приложение с двумя однострочными редакторами и кнопкой «Вычислить». В каждый однострочный редактор вводится по дате (например: «20.07.2004» и «18.09.2005»). При нажатии на кнопку «Вычислить» анализируется, входит ли настоящая дата в введенный диапазон. Если входит, то в компоненте Label выводится надпись «Попали в диапазон». В противном случае выводятся сообщения «Раньше» либо «Позже».

 

Задания II уровня сложности

1. Создайте приложение «Будильник«. На форме находятся однострочный редактор для ввода времени срабатывания будильника и кнопка «Пуск», при нажатии на которую будильник становится активным. Второй однострочный редактор позволяет вводить текст, который появится при срабатывании будильника.

При срабатывании будильника поверх всех окон, в центре экрана, появляется вторая форма красного цвета с этой надписью.