среда, 27 апреля 2011 г.

Урок 6. Не много ли два таймера в одной программе?! (компонент TTimer)


Мой любимый сатирик Михаил Михайлович Жванецкий в одном из своих произведений сказал такую фразу: «У меня в доме все по два, по четыре, по шесть, по восемь...» Но, как бы я не относился к творчеству и личности замечательного писателя, но для разработки начатой нами несколько уроков назад программы, мы все же не будем пользоваться его советом.
Тем не менее, забегая вперед, отмечу, что обойтись одним компонентом «Таймер» нам вряд ли удастся.
Итак, открываем палитру компонентов, находим раздел «System» и перетаскиваем на форму компонент Ttimer.






В свойствах этого элемента нужно указать:
Enabled=False         иначе таймер начнет отсчет сразу после запуска приложения, а мы такой цели себе не ставили
Interval= любое целое число, например: 3000 (что соответствует 3 секундам). Этого вполне достаточно для отладки.
Если дважды щелкнуть на нем, то оболочка создаст заготовку процедуры, обрабатывающей момент срабатывания таймера. В этот самый момент нам нужно:

  • прекратить отсчет времени, остановить таймер,
  • перевести элементы управление (кнопки, пункты меню, если необходимо) и т.п. в положение при котором будет воспроизводиться звуковой сигнал
  • вывести сообщение оператору об окончании отсчета,
  • воспроизвести звуковой сигнал заданное количество раз,
  • вернуть элементы управления в стартовое состояние.
Наполним процедуру операторами и комментариями (в тех местах алгоритма, которые еще остаются непонятными).
procedure TForm1.Timer1Timer(Sender: Tobject);
begin

// Остановить таймер
Timer1.Enabled:=False;
// Кнопки в положение “Проигрывание”

// Вывод сообщения оператору
MyLabel4.Caption:='Отсчет завершен';

// Воспроизвести звук несколько раз или бесконечно
// Вернуть элементы управления в стартовое состояние
end;

Теперь для заготовленного нами действия «Start» напишем процедуру: пора запустить, наконец, наш таймер.
procedure TForm1.Do_StartExecute(Sender: TObject);
begin
// Старт таймер
Timer1.Enabled:=True;
end;

Если Вы все сделали правильно, то через три секунды, заданные в качестве интервала срабатывания таймера, вы увидите надпись “Отсчет завершен”.
“Ну и что?” - скажете Вы. “Не красиво”, - отвечу я.
Хочется, чтобы что-то мелькало, чтобы видно было, что ведется отсчет. Т.е. каждую секунду, мы хотим видеть, как уменьшается заданный интервал времени, как ведется обратный отсчет. Ключевая фраза - “каждую секунду”. Какой же еще компонент, кроме TTimer способен отсчитать секунду? Но, один единственный компонент, уже имеющийся в нашем приложении занят отсчетом “от забора и до обеда”. Вот тут-то и понадобится наличие второго компонента TTimer. Скорее разместите его на форме, установив также в False его свойство Enabled.
Добавьте строчку в программу Timer1Timer:
Timer2.Enabled:=False; // После окончания отсчета основного времени второй таймер тоже должен остановиться.
А затем так же дважды щелкните по изображению компонента Timer2.
Нам хотелось бы, чтобы в надписи на форме отображался обратный отсчет времени, как в фильмах про бомбы с часовым механизмом :-).
MyLabel4.Caption:=IntToStr(А что же здесь?????);
Для решения этого вопроса ,как и для решения многих других существует несколько путей. Можно завести глобальную переменную, а можно воспользоваться вспомогательным скрытыс полем по имени Sec, которое я организовал на предыдущем видео уроке, тогда процедура примет вид:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Sec.Value:=Sec.Value-1;
MyLabel4.Caption:=IntToStr(Sec.Value);
end;
Предвижу законный вопрос: “А откуда же возьмется начальное значение в этом поле?”
Давайте с этой целью создадим процедуру, не забыв дать ее объявление в разделе Private:
procedure TForm1.SetMyLabel();
begin
Sec.Value:=3;                                   // В секундах
MyLabel4.Caption:=Sec.Value;
end;

Чтобы вспомогательное поле было готово выполнять свою функцию, в него нужно занести значение в момент создания формы (процедура FormCreate):

SetMyLabel();
Не забудьте добавить в процедуру Do_StartExecute строчку, визуализирующую изменения, и строчку, запускающую второй таймер:
SetMyLabel();
Timer2.Enabled:=True;
Нужно еще “научить” программу прерывать все отсчеты при нажатии кнопки “Стоп”:
procedure TForm1.Do_StopExecute(Sender: TObject);
begin

// Остановка таймера
Timer1.Enabled:=False;
MyLabel4.Caption:='Таймер остановлен';
Timer2.Enabled:=False;

end;
Теперь, когда все готово, компилируем приложение и получаем настоящий таймер: секунды мелькают на экране.

Комментариев нет:

Отправить комментарий