Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8. Delphi графика.doc
Скачиваний:
33
Добавлен:
16.11.2019
Размер:
1.16 Mб
Скачать

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;

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