7. Работа с таймером
Вы уже дошли до состояния, когда у вас нет времени, чтобы
разрешить те проблемы, которые отнимают у вас все время?
Из законов Мэрфи
Интересная возможность Delphi – создание процедур, автоматически выполняющихся через заданные промежутки времени. Для этого используется специальный объект Timer, находящийся на закладке System ( ). Этот объект – невизуальный, он не отображается на форме во время работы программы и его можно разместить в любом ее месте.
Главное свойство объекта Timer называется Interval и задает время в миллисекундах, по истечении которого таймер вызывает процедуру, присоединенную к его событию OnTimer. Свойство Enabled включает и выключает таймер. Когда таймер включен, он постоянно и незаметно для пользователя отсчитывает время и, как только пройдет заданный интервал, выполняет заданную процедуру, затем снова начинает отсчитывать время и т.д.
Простейший пример работы таймера – вывод в заголовке формы текущего времени. Настроим таймер так, чтобы он вызывал процедуру каждую секунду. Для этого свойство Interval нужно установить в 1000, а свойство Enabled – в True. На закладке Events инспектора объектов дважды щелкам мышью в единственном поле OnTimer пишем следующее:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Caption:=TimeToStr(Now)
end;
Функция Now возвращает текущее время по часам компьютера в виде числа секунд, прошедшего с полуночи, а функция TimeToStr превращает ее в текстовую строку привычного нам вида вроде "15:25:18". Вот как просто решается на Delphi задача отображения часов на экране.
8. Использование таймеров в графике
Когда ваш самолет опаздывает, самолет,
на который вы хотели пересесть, улетает вовремя.
Из законов Мэрфи
Заставим наше НЛО мигать – менять цвет при движении – при помощи таймера. Настроим таймер так, чтобы он срабатывал каждые 100мс. Для управления цветом заливки НЛО придется ввести глобальную переменную. Она описывается в начале программы после оператора implementation:
implementation
var clr:TColor=clGreen;
Обратите внимание на интересную особенность Delphi – глобальным переменным можно задавать начальные значения. В нашем случае в переменную clr с самого начала будет занесено значение clGreen (код зеленого цвета). TColor – это системный тип данных, предназначенный для хранения кодов цветов.
В процедуре таймера мы должны циклично менять значение переменной clr. Делается это так:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if clr=clGreen then
clr:=clYellow
else
clr:=clGreen
end;
Здесь в переменную clr будут циклически заноситься то значение clGreen, то clYellow.
Что делать дальше? Проблема в том, что в цикле процедура отрисовки НЛО вызывается дважды и оба раза она должна вызываться при одном и том же цвете НЛО, иначе не восстановится фон под картинкой и от нашей тарелки на экране останутся безобразные следы. Сделаем следующее: в процедуре TForm1.Button1Click заведем локальную переменную с типа TСolor и в нее будем запоминать текущее значение глобальной переменной clr в момент перед первым выводом тарелки на экран. Изменим и процедуру Ufo – теперь в нее нужно будет передавать не только координаты, но и цвет заливки. Получается вот что:
procedure TForm1.Button1Click(Sender: TObject);
VAR i:WORD;
c:TColor;
PROCEDURE Ufo(x,y:INTEGER; c:TColor);
BEGIN
WITH Image1.Canvas DO
BEGIN
Brush.Color:=c;
Pen.Color:=clBlue;
Pen.Width:=3;
Ellipse(x,y,x+20,y+10)
END
END;
begin
Form1.DoubleBuffered:=TRUE;
WITH Image1.Canvas DO
BEGIN
Brush.Color:=clBlack;
Brush.Style:=bsSolid;
FillRect(Image1.ClientRect);
… // вывод звездного неба
Pen.Mode:=pmNOTXOR;
FOR i:=0 TO Image1.Width DO
BEGIN
c:=clr; // запомнили значение глобальной переменной clr
Ufo(i, i DIV 2,c);
Application.ProcessMessages;
Sleep(10);
Ufo(i, i DIV 2,c)
END
END
end;
Применение нескольких таймеров позволяет организовать анимацию нескольких объектов. Например, можно создать несколько блуждающих по экрану астероидов, от которых должна увертываться управляемая пользователем летающая тарелка.