Задачи на светофор наверняка больше всего не нравятся автолюбителям. Еще бы - как часто, опаздывая, приходится ждать, когда загорится этот предательский зеленый или же наоборот погаснет красный - это уж кому как нравится. В этом плане программисты и их виртуальные светофоры живут гораздо более мирно. Захотел и написал, что сейчас загорится красный, захотел - зеленый. Приятно, когда от твоей воли зависит решительно все. Ну да ладно, вступление более чем длинное, пора и честь знать. Сегодня на повестке дня анимированная задача на светофор. Нам нужно написать программу на Delphi, на лицевой панели которой размещены 3 объекта TShape: shRed, shYellow и shGreen -, символизирующие лампочки светофора. И нам требуется организовать следующую нехитрую анимацию по нажатию на кнопку btnStart: загорается красный объект - тухнет - загорается желтый - тухнет - загорается зеленый - тухнет - загорается красный и т.д. Не трудно предположить, что алгоритм решения задания будет состоять из вереницы конструкций if then. И конечно, критерием того или иного действия должен стать цвет наших объектов TShape. Критерий обозначим переменной color типа integer и условимся, что при color:=0 - все объекты имеют свойство .brush.color:=clGray, при color:=1 - у нас загорается красный, color:=2 - желтый, color:=3 - зеленый. При этом учтем, что между сменой цветов должен быть момент, когда все объекты погашены. Ну и конечно, для реализации данной задачи поместим на форму еще и невидимый, но уже знакомый нам компонент, TTimer. Как видите, в достаточно простой задаче при детальном рассмотрении появились дополнительные условия. Все описанное выше я отразила в исходниках Delphi:
procedure TForm1.btnStartClick(Sender: TObject); begin color:=0; Timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject); begin if color=0 then begin shRed.Brush.Color:=clRed; color:=1 end else if color=1 then if shRed.Brush.Color=clRed then shRed.Brush.Color:=clGray else begin shYellow.Brush.Color:=clYellow; color:=2 end else if color=2 then if shYellow.Brush.Color=clYellow then shYellow.Brush.Color:=clGray else begin shGreen.Brush.Color:=clGreen; color:=3 end else begin shGreen.Brush.Color:=clGray; color:=0 end; end;
Как вы видите, я меняю значение переменной только тогда, когда загорается следующий TShape. Попробуйте менять ее значение раньше и у вас получится ерунда:) Если у вас возникли вопросы, свяжитесь со мной - напишу решение на заказ.