Программа «Светофор» как набор функций.

Используем рассмотренные ранее компоненты «ListBox» и «Timer» при создания имитации работы светофора.

В итоге форма должна приобрести следующий вид:

Внешний вид

Основой для оформления внешнего вида послужит компонент «Panel». Мы уже неоднократно использовали этот компонент, но рассматривали только основные его свойства.

Теперь расширим список свойств компонента «Panel», позволяющих изменить его внешний вид.

Будем рассматривать их на примере компонента «Panel4», придав ему для наглядности цвет «Color=clLime»

Пример панели

Используем, во-первых, рамку вокруг компонента. Эта рамка может быть только толщиной 1 пиксел и цвета, заданного по умолчанию. Выставляем «BorderStyle» равным единственному значению «bsSingle». Получаем:

Панель с рамкой

Для придания видимости объёма можно использовать свойство «Bevel». Например, внешний бордюр «BevelInner». Он может принимать значение «bvRaised» — эффект выпуклости:

Панель с выпуклым бордюром

Здесь ширина бордюра «BevelWidth» принята равной 40 пикселам.

Вогнутый бордюр: «BevelInner» принимает значение «bvLowred»:

Панель с вогнутым бордюром

Как видно из рисунка 1, светофор состоит из двух панелей. На перврй панели размещены три компонента «Shape». Этот компонент находится во вкладке «Additional» палитры компонентов:

Компонент Shape

Устанавливаем его свойство «Shape» в значение «stCircle» — окружность.

Свойство «Brush» (кисть) имеет две характеристики: «Color» и «Style». Для первой характеристики выбираем значение «clBlue» и «bsDiagCross» (перекрёстная штриховка), которая будет выполнена синим цветом. Сквозь сетку будет просвечивать фон, на котором расположен компонент «Shape».

Если «Style» равен «bsSolid», то вся площадь фигуры будет закрашена цветом «Color».

Вокруг первой панели размещён бордюр шириной 6 пикселей.

На фигуру «Shape» на правой панели положен компонент «Image» с изображение стрелки. Чтобы он был поверх всех элементов, устанавливем его z-порядок.

Для этого по щелчку правой кнопки вызываем контекстное меню, выбираем пункт «Control», и значение «Bring to Front».

Теперь визуальное проектирование завершено и можно приступать к разработке логики программы.

Логика работы программы «Светофор».

  1. Внешний вид «Светофора» разрабатывается в визуальном редакторе с использованием визуальных компонентов «Panel», «Shape», «Image» «ListBox» и «BitBtn», а также невизуального компонента «Timer».
  2. Начальное состояние «Светофора» устанавливается на этапе запуска программы в событии «onFormCreate» через обработчик «FormCreate».
  3. Начало функционирования «Светофора» осуществляется кнопкой «Пуск», останов — «Стоп».
  4. Кнопка «Пуск» обеспечивает:
    4.1) Перевод светофора в неактивное состояние (светофор выключен).
    4.2) Установка интервалов срабатывания таймеров 1 и 2.
    4.3) Запуск таймеров 1 и 2.
  5. Таймер 2 управляет стрелкой. Таймер 1 управляет работой «светофора».
  6. Кнопка «Стоп» переводит светофор в неактивное состояние и останавливает таймеры.

Перевод светофора в неактивное состояние осуществляется в функции f1().

Установка интервалов таймера осуществляется в функции f2().

Цикл переключения фонарей «светофора» осуществляется функцией f3(номер_цикла)

Начальные значения полей nom и interval и заполнение строк списка «ListBox» осуществляется в обработчике «FormCreate»

Код программы «Светофор»

Задача.

При нажатии на кнопку «Пуск» должен загореться красный свет и одновременно стрелка «Поворот направо». Стрелка должна гореть 70% от времени горения красного сигнала.

По прошествию заданного времени красный сигнал гаснет и загорается желтый свет. Время горения жёлтого света — 30% от времени горения красного сигнала.

После отработки желтого светофора загорается зелёный свет и горит столько же, сколько красный.

Далее цикл повторяется. «Светофор» работает до тех пор, пока не будет нажата кнопка «Стоп».

В списке «ListBox» будут помещены интервалы времени горения красного сигнала, отличные от заданного по умолчанию.

Выбирая значение из списка, мы тем самым будем менять темп работы светофора.

Начальные значения.

Начальные значения задаются в обработчике события «FormCreate».

Предварительно класс Tform1 дополним двумя полями: num и integval:

type
TForm1 = class(TForm)
ListBox1: TListBox;

procedure BitBtn1Click(Sender: Tobject);
function f1():integer;//выключить «светофор»
function f2(i:integer):integer;//установить таймер
function f3(i:integer):integer;//включить светофор

private
{ Private declarations }
num:integer;
integval:integer;
public
{Public declarations }
end;

Обработчик FormCreate:

procedure TForm1.FormCreate(Sender: TObject);
begin
form1.integval:=5000; //интервал срабатывания таймера — 5 секунд;
form1.ListBox1.Clear; //очищаем ListBox1;
form1.ListBox1.Items.Add(‘1000’); //добавляем первую строку в ListBox1
form1.ListBox1.Items.Add(‘2000’);//добавляем в конец вторую строку;
form1.ListBox1.Items.Add(‘6000’);//добавляем в конец третью строку;
form1.ListBox1.Items.Insert(2,’4000′);//вставляем строку между второй и третьей. В списке строка будет иметь номер два (то есть третий сверху). Этот оператор вставлен для примера использования метода «Insert».
form1.BitBtn1.Font.Color:=rgb(128,0,0); //используем кнопку BitBtn. Устанавливаем цвет надписи на кнопке (коричневый).
End;

После запуска программы форма будет иметь вид:

Светофор после запуска программы

Сразу после запуска программы «светофор » будет иметь вид:

Светофор после нажатия на кнопку пуск

Алгоритм работы программы.

Внешне работа «светоофра» выглядит следующим образом:

(видео)

Главные моменты алгоритма работы программы представлены на укрупнённой блок-схеме:

Блок-схема 1
Блок-схема 2

Начальное состояние светофора — все лампы выключены. Это состояние будет первым при запуске программы или при нажатии на кнопку «Стоп».

Установка начального состояния «светофора» вынесена в отдельную функцию:

function Tform1.f1():integer; //начальное состояние «светофора» — все фонари выключены.
begin
form1.Shape1.Brush.Color:=clBlue; //установить синий цвет кисти;
form1.Shape2.Brush.Color:=clBlue;
form1.Shape3.Brush.Color:=clBlue;
form1.Shape1.Brush.Style:=bsDiagCross; //установить стиль кисти (косая решётка)
form1.Shape2.Brush.Style:=bsDiagCross;
form1.Shape3.Brush.Style:=bsDiagCross;
end;

Кнопка «Пуск» включает чветофор.

procedure TForm1.BitBtn1Click(Sender: Tobject);//кнопка «пуск»
var j:integer;
begin
f2(form1.integval); //задать интервал переключения
form1.num:=1; //начинаем с красного света
f3(form1.num); //управление светофором — зажигаем красный свет.
End;

Время горения красного сигнала устанавливается в функции f2(время горения красного сигнала в милисекундах)

function Tform1.f2(i:integer):integer;//программирование интервалов таймера
begin
form1.Timer1.Enabled:=false;
form1.Timer2.Enabled:=false;
form1.Timer1.Interval:=i;//установить интервал таймера 1
form1.Timer2.Interval:=(i div 10)*7;//установить интервал таймера 2, равный 0,7 от заданного интервала;
end;

Управление светофором.

В функцию f3 передаётся номер фонаря (1- красный, 2 и 4 — жёлтый, 3 — зелёный)

function TForm1.f3(i:integer):integer;
begin
f4(); // «обнуляем» светофор
case i of //1 — красный цвет; 2 и 4 — желтый цвет; 3 — зелёный цвет;
1:
begin
form1.Shape1.Brush.Style:=bsSolid; //установить «сплошную» кисть;
form1.Shape1.Brush.Color:=clRed; //установить красный цвет;
form1.Timer1.Enabled:=false; //останавливаем таймер;
form1.Timer1.Interval:=form1.integval; //установить интервал переключения;
form1.Image1.Visible:=true; //сделать изображение со стрелкой видимым;
form1.Shape4.Brush.Style:=bsSolid;
form1.Shape4.Brush.Color:=rgb(180,180,180); //это цвет такой же, как у панели (серый)
form1.Timer1.Enabled:=true; //запускаем таймер;
form1.Timer2.Enabled:=true;//запускаем таймер для стрелки;
end;

2,4://жёлтый свет и стрелка
begin
form1.Shape2.Brush.Style:=bsSolid;
form1.Shape2.Brush.Color:=clYellow;//устанавливаем жёлтый цвет
form1.Timer1.Enabled:=false;
form1.Timer1.Enabled:=true;
end;

3:
begin
form1.Shape3.Brush.Style:=bsSolid;
form1.Shape3.Brush.Color:=clGreen;//устанавливаем зелёный цвет
form1.Timer1.Enabled:=false;
form1.Timer1.Interval:=form1.integval;
form1.Timer1.Enabled:=true;
end;//конец begin ветви 3

end;//конец case
end;//конец процедуры


Установить новый темп работы светофора.

Темп переключения фонарей «светофора» определяется значением свойства «Interval» компонента «Timer1».

Изменение значения этого свойства осуществляем в обработчике двойного клика по строке списка «ListBox1»:

procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
form1.integval:=strtoint(ListBox1.Items[ListBox1.itemIndex]); //itemIndex — номер выбранной строки
f1();//остановить светофор
form1.num:=1;
f2(form1.integval);//установить новый интервал
f3(form1.num);//включаем «светофор»
end;

Обработка события «Timer»

Timer1

procedure TForm1.Timer1Timer(Sender: TObject);
begin
f1();//сбрасываем светофор
inc(form1.num);//переходим к следующему свету
if form1.num>4 then form1.num:=1;//1 — красный; 2,4 — желтый; 3 — зелёный
f3(form1.num);//включаем светофор
end;

Timer2

procedure TForm1.Timer2Timer(Sender: TObject);
begin
form1.Image1.Visible:=false;//гасим стрелку
form1.Shape4.Brush.Style:=bsDiagCross;//фонарь стрелки в неактивное состояние
form1.Shape4.Brush.Color:=clBlue;
form1.Timer2.Enabled:=false;//выключаем таймер
end;

В следующей статье рассмотрим, как создать объект «светофор».

***

Обновлено: 18.04.2021 — 21:59

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *