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

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

28.04.2019

Компонент 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 - Произвольный числовой параметр

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

ак сделать, так чтобы при установке ограничения времени,к примеру на 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;

Компонент 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;
В общем-то, про таймер мало чего еще можно рассказать, поэтому мы закончим наш урок. Как всегда, скачать исходный код примера можно по

Мы уже знакомы с системным таймером, сегодня познакомимся с мультимедийным, основное отличие которого, более высокая скорость (точность) работы. Мультимедийный таймер способен работать с интервалом вплоть до 1 ms, в то время как, интервалы работы системного таймера больше, и зависят от версии ОС. Для Windows95/98 интервал составляет ~50 ms, в Windows2000/XP интервал может быть меньше (у меня он равен ~10 ms).

Сейчас мы убедимся в этом на примере, для чего создадим два таймера: системный и мультимедийный. Оба таймера будут показывать, сколько раз в секунду им удалось сработать.

const IDTimer1 = 1; IDLabelTimer = 2; IDLabelMMTimer = 3; var Wc: TWndClassEx; Wnd: HWND; Msg: TMsg; LabelTimer: HWND; LabelMMTimer: HWND; TimerBegin: Cardinal; TimerCount: Cardinal = 0; TimerOld: Cardinal = 0; MMTimerID: Cardinal; MMTimerBegin: Cardinal; MMTimerCount: Cardinal = 0; MMTimerOld: Cardinal = 0;

В прошлом примере, для работы с системным таймером, нам приходилось обрабатывать сообщение WM_TIMER. Однако системный таймер никаких сообщений не генерирует, для работы с ним нужно использовать функцию обратного вызова (CallBack). Такую же функцию будем использовать для работы с системным таймером. Посмотрим их описание.

Обратим внимание на то, что функция использует соглашение о передаче параметров stdcall.

Определим эти функции.

procedure TimerProc(Wnd: HWND; uMsg: UINT; idEvent: UINT; dwTimer: UINT); stdcall; var tmpTimer: string; tmpTimerCount: string; begin Inc(TimerCount); Str(TimerOld, tmpTimer); Str(TimerCount, tmpTimerCount); SetWindowText(LabelTimer, PChar("Timer: " + tmpTimerCount + " [" + tmpTimer + "]")); if GetTickCount - TimerBegin >= 1000 then begin TimerOld:= TimerCount; TimerBegin:= GetTickCount; TimerCount:= 0; end; end; procedure MMTimerProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall; var tmpMMTimer: string; tmpMMTimerCount: string; begin Inc(MMTimerCount); Str(MMTimerOld, tmpMMTimer); Str(MMTimerCount, tmpMMTimerCount); SetWindowText(LabelMMTimer, PChar("MMTimer: " + tmpMMTimerCount + " [" + tmpMMTimer + "]")); if GetTickCount - MMTimerBegin >= 1000 then begin MMTimerOld:= MMTimerCount; MMTimerBegin:= GetTickCount; MMTimerCount:= 0; end; end;

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

Перейдем к созданию таймеров.

SetTimer(Wnd, IDTimer1, 1, @TimerProc); TimerBegin:= GetTickCount; MMTimerID:= timeSetEvent(1, 2, @MMTimerProc, 0, TIME_PERIODIC); MMTimerBegin:= TimerBegin;

С созданием системного таймера мы уже знакомы. Единственное отличие от предыдущего примера заключается в том, что в качестве последнего параметра мы вместо nil передаем указатель на CallBack функцию. Сразу после его создания запоминаем текущее время, от него начнем отсчет интервалов, длинной в секунду. Затем создаем мультимедийный таймер, для чего воспользуемся функцией timeSetEvent. Рассмотрим ее параметры. 1 - интервал таймера (в миллисекундах). 2 - разрешающая способность (количество миллисекунд, ограничивающее время на отработку каждого тика таймера). Если задать 0, точность будет максимальной. 3 - адрес CallBack функции. 4 - Параметр пользователя. Этот параметр передается в обработчик lpFunction и может использоваться по усмотрению программиста. 5 - одна из двух констант: TIME_ONESHOT (обработчик таймера вызывается один раз) или TIME_PERIODIC (обработчик таймера вызывается периодически).

Уничтожение таймеров выглядит следующим образом.

KillTimer(Wnd, IDTimer1); timeKillEvent(MMTimerID);

Пара слов о работе этих таймеров. Системный таймер: Если обработчик таймера не успевает закончить все действия в установленный интервал, то последующие вызовы этого обработчика становятся в очередь. Это приводит к тому, что на разных компьютерах приложение работает с разной скоростью. Сама же CallBack функция вызывается в контексте основного потока. Мультимедийный таймер: Если обработчик таймера не успевает закончить все действия в установленный интервал, то последующие вызовы накапливаться не будут. Сама же CallBack функция вызывается в контексте отдельного потока.

На сегодня это все, удачи в программировании.



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows