Практика в делфи с использование компонента timer. Использование таймеров в Delphi. Программирование на Delphi

Компонент Delphi Timer очень простой компонент, который не виден на экране, но, тем не менее, Timer Delphi выполняет очень важные функции в программе. Delphi Timer позволяет вводить необходимые задержки между выполнением тех или иных действий.
Компонент Timer имеет всего четыре свойства и одно событие, и работать с компонентом Delphi Timer очень просто.

Помещаем компонент Delphi Timer на Форму. Задаём в свойстве Interval нужный интервал времени (измеряется в миллисекундах). Переходим на вкладку Events и видим единственное событие, поддерживаемое компонентом Delphi Timer: OnTimer. Выполнив по нему двойной щелчёк, или также двойной щелчёк по самому компоненту, мы попадём в сформированный средой Delphi обработчик события, где и введём код, предусматривающий выполнение тех или иных действий.

Так как по умолчанию сойство Enabled установлено в True, то в программе через установленный в свойстве Interval промежуток времени таймер сработает, то есть выдаст событие OnTimer. Будут выполнены необходимые действия. Иногда же запланированные действия должны произойти не автоматически при старте программы, а при выполнении каких-либо других действий. В этом случае необходимо свойство Enabled в Инспекторе Объектов установить в False. Затем в необходимый момент нужно выполнить команду:

Timer1.Enabled:=True;

Учтите, что пока Timer1.Enabled равно True, компонент продолжит генерировать событие OnTimer по истечении каждого промежутка времени, равного значению свойcтва Interval. Поэтому, если нужно только единичное срабатывание, то таймер нужно остановить, причём сразу же:


begin
Timer1.Enabled:=False;
{ Необходимые действия }
end;

Если же запрограммировать "выключение" таймера после выполнения предусмотренных в программе действий, то при достаточно малом по сравнению с продолжительностью необходимых действий значении свойства Interval таймер вновь сработает, и это может помешать ходу программы.

Компонент Delphi Timer не является очень точным и не подходит для измерения малых промежутков времени. Его точность порядка 50 миллисекунд. В качестве примера приведу простую программу, отображающую текущее время.

На форме будут только компонент Label и собственно наш компонент Delphi Timer. Свойство Timer можно оставить равным 1000, но раньше на более медленных компьютерах приходилось отображать время несколько раз в секунду, так как из-за влияния других выполняемых компьютером процессов выводимые раз в секунду показания "плавали", что было хорошо заметно на глаз. Размер шрифта возьмём побольше - 50, и подберём более гладкий, я взял Bell MT. Растянем на всю Форму: Align=alClient. Ну и, собственно, сам код:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption:=TimeToStr(Now);
end;

Вот и всё! Delphi Now - это системная функция, возвращающая текущую дату-время в соответствующем формате TDateTime. Если преобразовывать её в строку функцией TimeToStr, то она вернёт текущее время, если DateToStr, то текущую дату. Если мы хотим отображать в нашей программе и дату тоже, достаточно поставить ещё один компонент Label, и функцией DateToStr передавать в него дату.

СВОЙСТВО - НАЗНАЧЕНИЕ
Enabled
- "Включение-выключение" таймера
Interval - Интервал срабатывания (в миллисекундах)
Name - Имя компонента в программе
Tag - Произвольный числовой параметр

Использование таймеров в Delphi

Класс TTimer инкапсулирует свойства и методы для работы с таймером, позволяющем осуществлять отсчеты интервалов времени. Описание класса приводится в модуле ExtCtrls поэтому для его использования необходимо указать имя данного модуля в разделе uses.
Класс TTimer - невизуальный, это означает, что он не отображается на форме.
Данный класс имеет два свойства:


Данные свойства позволяют управлять компонентом. Свойство Interval задает
период срабатывания таймера. Через заданный интервал времени после предыдущего
срабатывания, или после программной установки свойства Interval , или после
запуска приложения, если значение Interval установлено во время проектирования,
таймер срабатывает, вызывая событие OnTimer . В обработчике этого события
записываются необходимые операции.

Если задать Interval = 0 или Enabled = False , то таймер перестает работать.
Чтобы запустить отсчет времени надо или задать Enabled = True , если установлено
положительное значение Interval , или задать положительное значение Interval ,
если Enabled = False .

Если необходимо в некоторой процедуре запустить таймер, который отсчитал бы заданный
интервал, например, 5 секунд, после чего надо выполнить некоторые операции и отключить
таймер, это можно сделать следующим образом. При проектировании таймер делается
доступным (Enabled = True ), но свойство Interval задается равным 0 .
Таймер не будет работать, пока в момент, когда нужно запустить таймер, не выполнится
оператор

Timer1.Interval:=5000;


Через 5 секунд после этого наступит событие OnTimer . В его обработчике надо
задать оператор

Timer1.Interval:=0;


который отключит таймер, после чего можно выполнять требуемые операции.

Другой эквивалентный способ решения задачи - использование свойства Enabled .
Во время проектирования задается значение Interval = 5000 и значение
Enabled = False . В момент, когда надо запустить таймер, выполняется оператор:

Timer1.Enabled:=True;


В обработчик события OnTimer , которое наступит через 5 секунд после запуска
таймера, можно вставить оператор

Timer1.Enabled:=False;


который отключит таймер.

Существует особенность использования класса TTimer вне визуальных компонентов - форм. Дело в том, что при размещении таймера на форме, для его класса будет автоматически запущен конструктор при создании формы и деструктор при ее уничтожении. При создании таймера непосредственно в процессе выполнения программы и, как следствие, использование обработчика события OnTimer, должно производиться следующим образом.
Предварительно должен быть создан вспомогательный класс, содержащий одну единственную процедуру - процедуру которая будет выполняться при срабатывании таймера.

TTimeredObject = class (TObject)
procedure TimerEvent(Sender:Tobject);
end;

procedure TTimeredObject.TimerEvent(Sender:TObject);
begin
TimeFinished:=true;
end;

Переменная логического типа Finished должна быть объевлена как глобальная переменная, там же должна быть объявлена переменная Timer1:TTimer. Для этого в разделе interface модуля после ключевого слова var запишем

var
TimeFinished:boolean;
Timer1:TTimer;

В экспортируемой функции LEntry, которая собственно и реализует тот или иной метод, запишем следующие строки:

function LEntry (.....)
var TimeredObject:TTimeredObject;
begin

// устанавливаем свойство окончания цикла по времени false
TimeFinished:=false;

// создаем таймер
Timer1:=TTimer.Create(nil);
// устанавливаем интервал
Timer1.Interval:=5000;

// создаем созданный нами вспомогательный объект
TimeredObject:=TTimeredObject.Create;

// присваиваем созданный нами обработчик методу OnClick таймера
Timer1.OnClick:=TimeredObject.TimerEvent;

// запускаем таймер и начинаем цикл
Timer1.Enabled:=true;

until Timefinished<>true;

Кратко останавлюсь на том, почему потребовалась так присваивать обработчик методу OnClick. В описании класса TTimer метод описан следующим образом

property OnTimer:TNotifyEvent read FOnTimer write SetOnTimer;

Вообще свойство объекта обеспечивает и/или чтение и/или запись с помощью некоторых процедур в некоторое поле класса. В данном случае полем, с которым связано свойство, является поле FOnTimer. Чтение происходит непосредственно из поля, а вот для записи данных в поле применяется специальная процедура SetOnTimer.
Свойство (и естественно поле, связанное с данным свойством) имеет тип TNotifyEvent, который соотвествует наступлению некоторого события. Тип TNotifyEvent определен следующим образом:

TNotifyEvent = procedure (Sender:TObject) of object;

такая конструкция определяет тип данных - ссылка на процедуру принадлежащую некоторому объекту, то есть на метод объекта. Параметром процедуры является объект вызывающий данное событие.
Мы определили вспомогательный класс, содержащий метод, в точности совпадающий с типом TNotifyEvent. Следовательно, свойству OnTimer можно назначить обработчик события TimerEvent.

Компонент TTimer в Delphi позволяет регулярно выполнять определенные действия с определенным временным интервалом. В этом уроке мы и рассмотрим данный компонент.
Научимся создавать и настраивать данный компонент в Design-time. Для этого кинем на форму компонент TTimer с вкладки System панели Tool Palette. Выглядит он следующим образом:

TTimer является невизуальным компонентом, поэтому данную иконку в самой программе мы не увидим. Рассмотрим его свойства на панеле Object Inspector:

Для того чтобы указать сами действия для таймера, необходимо воспользоваться единственным событием таймера — OnTimer. Выглядит оно следующим образом:

begin
// Действия, которые должен выполнять таймер
end;
Например вывод обыкновенного сообщения на экран будет выглядеть таким образом:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ShowMessage(‘сайт’);
end;
Как видите, в работе с таймером нет ничего сложного. Теперь научимся создавать его в режиме Run-time, т.е. непосредственно в программном коде, а не визуально на форме приложения.
Создавать таймер мы будем внутри события OnClick у кнопки Button1, т.е. таким образом какое-либо действие этого таймера начнет выполняться при нажатии на определенную кнопку.
procedure TForm1.Button1Click(Sender: TObject);
var
MyTimer: TTimer; // Объявляем экземпляр класса TTimer
begin
MyTimer:= TTimer.Create(Form1);
// Создаем таймер. Конструктору Create необходимо передать владельца (родителя таймера). Укажем форму программы
MyTimer.OnTimer:= MyTimerEvent;
// Указываем событие для таймера. Оно должно быть вида procedure(Sender: TObject) и являться методом какого-либо класса.
// В нашем случае — это метод MyTimerEvent класса нашей формы TForm1, который мы создали вручную.
// Сразу после этого таймер запускается. Если после создания запускать таймер не нужно, то можно указать свойству Enabled значение false.
// А когда вновь потребуется запустить таймер, можно передать этому значению true.
MyTimer.Interval:= 1500; // Интервал таймера
end;
В качестве события OnTimer для нашего таймера необходимо использовать метод какого-либо класса. Поэтому мы создадим метод procedure MyTimerEvent(Sender: TObject) у нашей формы (класс TForm1):
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure MyTimerEvent(Sender: TObject); // Будущее событие для таймера, которое является методом класса нашей формы.
end;
Cам метод будет выглядеть так:
procedure MyTimerEvent(Sender: TObject);
begin

end;
Часто требуется сделать так, чтобы таймер выполнил указанные в его событии OnTimer действия определенное количество раз, после чего выключился. Реализовать это просто. Достаточно завести какую-либо глобальную переменную типа Integer, которая будет играть роль счетчика выполнения таймера:
var
Form1: TForm1;
a: integer; // Счетчик выполнения таймера
Перед запуском таймера мы обнулим эту переменную:
a:= 0;
А в обработчике таймера (событии OnTimer) будем каждый раз увеличивать эту переменную на единицу, а также будем проверять, превысила ли эта переменная определенный лимит:
procedure TForm1.MyTimerEvent(Sender: TObject);
begin
ShowMessage(‘сайт is the best web resource about programming.’); // Выводим сообщение в таймере
Inc(a);
if a > 5 then
begin
a:= 0;
(Sender as TTimer).Enabled:= False; // Обращаемся к таймеру через Sender и выключаем его.
end;
end;
В общем-то, про таймер мало чего еще можно рассказать, поэтому мы закончим наш урок. Как всегда, скачать исходный код примера можно по

ак сделать, так чтобы при установке ограничения времени,к примеру на 30 сек,через 30 сек вышло Showmessage ВРЕМЯ ВЫШЛО! потом и так далее для 1 мин,2 мин,5 мин для кнопки GO

Serge_Bliznykov
чуть-чуть усложнил вашу задачу.
Если что — выкиньте лишнее

если кратко, то вот PAS код модуля:

Unit Unit1;

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
TForm1 = class(TForm)
trckbr1: TTrackBar;
btCloseAll: TButton;
Label1: TLabel;
Label2: TLabel;
tmr1: TTimer;
btGO: TButton;
btStop: TButton;
Memo1: TMemo;
lbRemainTime: TLabel;
procedure FormCreate(Sender: TObject);
procedure trckbr1Change(Sender: TObject);
procedure btGOClick(Sender: TObject);
procedure StopTimerAndPrepareToNext;
procedure tmr1Timer(Sender: TObject);
procedure btCloseAllClick(Sender: TObject);
procedure btStopClick(Sender: TObject);
private
TimerSeconds: integer;
StartTime: TDateTime;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses DateUtils;
{$R *.dfm}

const
buf: array of String = ("нет", "30 сек", "1 мин", "2 мин" , "5 мин");
bufInterval: array of Integer = (0, 30, 60, 2*60, 5*60);

procedure TForm1.FormCreate(Sender: TObject);
begin
StopTimerAndPrepareToNext;

lbRemainTime.Caption:= "";
TimerSeconds:= 0;
StartTime:= Now;
end;

procedure TForm1.StopTimerAndPrepareToNext;
begin
tmr1.Enabled:= false; // сразу выключили таймер
Memo1.Enabled:= false; // запретили ввод в мемо
trckbr1.Enabled:= true; // включили трекбар
btStop.Enabled:= false; // выключили кнопку СТОП
end;

procedure TForm1.trckbr1Change(Sender: TObject);
begin
Label2.Caption:= buf;
end;

procedure TForm1.btGOClick(Sender: TObject);
begin
trckbr1.Enabled:= false; // выключили трекбар

if trckbr1.Position>0 then begin {задали время выключения}
TimerSeconds:= bufInterval;
StartTime:= Now;
tmr1.Interval:= 1000; // каждую секунду таймер будет срабатывать
// и делать нужные обработки
tmr1.Enabled:= true; // запустили таймер
end;

btStop.Enabled:= true; // включили кнопку остановки таймера
Memo1.Enabled:= true; // открыли контрол, где можно что-то вводить
end;

procedure TForm1.btStopClick(Sender: TObject);
begin
StopTimerAndPrepareToNext;
lbRemainTime.Caption:= "";
end;

procedure TForm1.tmr1Timer(Sender: TObject);
var Secs: integer;
begin
Secs:= SecondsBetween(Now, StartTime);
if Secs>=TimerSeconds then begin
// баста!! Время вышло!
StopTimerAndPrepareToNext;

lbRemainTime.Caption:= "время вышло";
ShowMessage("Ваше время истекло!!");
TimerSeconds:= 0;
end
else
lbRemainTime.Caption:= "Осталось "+IntToStr(TimerSeconds - Secs)+" сек.";
end;

procedure TForm1.btCloseAllClick(Sender: TObject);
begin
Close;
end;

Таймер - компонент Timer

Компонент Timer позволяет задавать в приложении интервалы времени. Таймер находит многочисленные применения: синхронизация мультипликации, закрытие каких-то окон, с которыми пользователь долгое время не работает, включение хранителя экрана или закрытие связей с удаленным сервером при отсутствии действий пользователя, регулярный опрос каких-то источников информации, задание времени на ответ в обучающих программах - все это множество задач, в которых требуется задавать интервалы времени, решается с помощью таймера.

Таймер - невизуальный компонент, который может размещаться в любом месте формы. Он имеет два свойства, позволяющие им управлять: Interval - интервал времени в миллисекундах и Enabled - доступность. Свойство Interval задает период срабатывания таймера. Через заданный интервал времени после предыдущего срабатывания, или после программной установки свойства Interval, или после запуска приложения, если значение Interval установлено во время проектирования, таймер срабатывает, вызывая событие OnTimer. В обработчике этого события записываются необходимые операции.

Если задать Interval = 0 или Enabled = false, то таймер перестает работать. Чтобы запустить отсчет времени надо или задать Enabled = true, если установлено положительное значение Interval, или задать положительное значение Interval, если Enabled = true.

Например, если требуется, чтобы через 5 секунд после запуска приложения закрылась форма - заставка, отображающая логотип приложения, на ней надо разместить таймер, задать в нем интервал Interval = 5000, а в обработчик события OnTimer вставить оператор Close, закрывающий окно формы.

Если необходимо в некоторой процедуре запустить таймер, который отсчитал бы заданный интервал, например, 5 секунд, после чего надо выполнить некоторые операции и отключить таймер, это можно сделать следующим образом. При проектировании таймер делается доступным (Enabled = true), но свойство Interval задается равным 0. Таймер не будет работать, пока в момент, когда нужно запустить таймер, не выполнится оператор

который отключит таймер, после чего можно выполнять требуемые операции.

Другой эквивалентный способ решения задачи - использование свойства Enabled. В время проектирования задается значение Interval = 5000 и значение Enabled = false. В момент, когда надо запустить таймер выполняется оператор

который отключит таймер.

Таймер точно выдерживает заданные интервалы Interval, если они достаточно велики - сотни и тысячи миллисекунд. Если же задавать интервалы длительностью десятки или единицы миллисекунд, то реальные интервалы времени оказываются заметно больше вследствие различных накладных расходов, связанных с вызовами функций и иными вычислительными аспектами.