Лабораторная работа №8 по предмету «Графическая визуализация».
Выполнил студент второго курса Фомин В. Л.
Создание графических приложений в среде Object Pascal.

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

Программа управления цветами формы.

  1. Запустить приложение.

  2. Просмотреть в текстовом редакторе код unit1.pas

  3. Просмотреть в текстовом редакторе визуальные свойства компонентов формы.

Этапы создания графического приложения.

На форме TForm1 = class(TForm) расположим три кнопки:
Button1: TButton; для запуска генератора случайных цветов формы
Button2: TButton; - для остановки таймеров
Button3: TButton; - для получения спектра монохроматических цветов.
Пять текстовых редакторов:
Edit1: TEdit; - количество красного цвета R от 0 до 255;
Edit2: TEdit; - количество зелёного цвета G от 0 до 255;
Edit3: TEdit; - количество синего цвета B от 0 до 255;
Edit4: TEdit; - скорость смены случайных цветов от 1 до 1000 мс;
Edit5: TEdit; - общий цвет формы от 0 до 16777215 , вычисляемый по формуле (256*B+G)*256+R
Edit6: TEdit; - доли красного, зелёного, синего в шестнадцатеричном виде
Метки с текстом:
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Компоненты:
ProgressBar1: TProgressBar; //показ изменения количества красного
ProgressBar2: TProgressBar; //показ изменения количества зелёного
ProgressBar3: TProgressBar;//показ изменения количества синего
ScrollBar1: TScrollBar; //изменение количества красного
ScrollBar2: TScrollBar; //изменение количества зелёного
ScrollBar3: TScrollBar; //изменение количества синего
ScrollBar4: TScrollBar;//изменение скорости таймера Timer1
Timer1: TTimer;// таймер смены случайных цветов.
Timer2: TTimer; //таймер последовательной смены монохроматического спектра.
TrackBar1: TTrackBar; //изменение количества красного
TrackBar2: TTrackBar; //изменение количества зелёного
TrackBar3: TTrackBar; //изменение количества синего
TrackBar4: TrackBar; ;//изменение скорости таймера Timer1;
Зададим цвета меток и текстовых редакторов:
Color = clRed для Label1, Edit1
Color = clLime для Label2, Edit2
Color = clBlue для Label3, Edit3
Font.Name = 'Times New Roman' для Label1, Label2, Label3, Label4, Edit1, Edit2, Edit3, Edit4
Font.Color = clWhite для Label3, Edit3
Размер шрифта = 16 для Label1, Label2, Label3, Label4, Edit1, Edit2, Edit3, Edit4
Зададим максимальное количество символов в текстовых редаторах Edit1, Edit2, Edit3 равным 3:
Edit1.MaxLength:=3;
Edit1.MaxLength:=3;
Edit1.MaxLength:=3;
Установим начальные свойства таймеров:
Timer1.Enabled:=false;
Timer2.Enabled:=false;
Зададим начальные свойства компонентов ScrollBar1, ScrollBar2, ScrollBar3, TrackBar1, TrackBar2, TrackBar3, ProgressBar1, ProgressBar2, ProgressBar3:
Max = 255, Min=0
Это означает, что их свойство position будет принимать значения из отрезка [0, 255]. Для компонентов ScrollBar4, TrackBar4 устанавливаем:
Max = 1000, Min=1
Для текстовых редакторов Edit4, Edit5, Edit6 установим свойство ReadOnly = True , чтобы запретить редактирование текста в них.
Для кнопок Button1, Button2, Button3 установим соответственно свойство caption:
«Случайные цвета», «Остановить таймер» «Цветовой цикл»
Для формы свойство caption: «Стандартные цвета».
Устанавливая компоненты на форме, задаём их свойства:
Left – расстояние левого верхнего угла компонента от левой границы формы,
Top – расстояние левого верхнего угла компонента от верхней границы формы,
Height – ширина компонента в пикселях,
Width – ширина компонента в пикселях.
Сведения о свойствах этих компонентах и о событиях, которые связаны с ними можно просмотреть в файле unit1.lfm
При запуске программы цвет формы чёрный: R=0; G=0, B=0;
При обработке события FormCreate все движки устанавливаются в крайнюю левую позицию, имеющую значение 0, и все текстовые редакторы также имеют значение свойства Text «0».
Целочисленные переменные R, G, B объявим как глобальные переменные
var G,R,B: integer;
Тогда значения этих переменных будут меняться каждой процедурой, в которой они фигурируют как глобальные переменные.

Запишем процедуру, которая записывает в текстовыe редакторы Edit1, Edit2, Edit3 значения глобальных переменных R, G, B, устанавливает цвет формы равным (256*B+G)*256+R и это значение выводит в Edit5; TrackBar1.Position, ProgressBar1.Position устанавливает равным R; TrackBar2.Position, ProgressBar2.Position устанавливает равным G; TrackBar3.Position, ProgressBar3.Position устанавливает равным B; выводит в шестнадцатеричном виде значение цвета в поле Edit6.
procedure colorsform;
begin
  Form1.Edit1.Text:=IntToStr(R);
  Form1.Edit2.Text:=IntToStr(G);
  Form1.Edit3.Text:=IntToStr(B);
  Form1.color:=(256*B+G)*256+R;
  Form1.Edit5.Text:=IntToStr((256*B+G)*256+R);
  Form1.TrackBar1.Position:=R;
  Form1.ProgressBar1.Position:=R;
  Form1.TrackBar2.Position:=G;
  Form1.ProgressBar2.Position:=G;
  Form1.TrackBar3.Position:=B;
  Form1.ProgressBar3.Position:=B;
  Form1.Edit6.Text:='#';
  case (R div 16) of
  0..9: Form1.Edit6.Text:=Form1.Edit6.Text+IntToStr(R div 16);
  10:  Form1.Edit6.Text:=Form1.Edit6.Text+'A';
  11:  Form1.Edit6.Text:=Form1.Edit6.Text+'B';
  12:  Form1.Edit6.Text:=Form1.Edit6.Text+'C';
  13:  Form1.Edit6.Text:=Form1.Edit6.Text+'D';
  14:  Form1.Edit6.Text:=Form1.Edit6.Text+'E';
  15:  Form1.Edit6.Text:=Form1.Edit6.Text+'F';
  end;
  case (R mod 16) of
  0..9: Form1.Edit6.Text:=Form1.Edit6.Text+IntToStr(R mod 16);
  10:  Form1.Edit6.Text:=Form1.Edit6.Text+'A';
  11:  Form1.Edit6.Text:=Form1.Edit6.Text+'B';
  12:  Form1.Edit6.Text:=Form1.Edit6.Text+'C';
  13:  Form1.Edit6.Text:=Form1.Edit6.Text+'D';
  14:  Form1.Edit6.Text:=Form1.Edit6.Text+'E';
  15:  Form1.Edit6.Text:=Form1.Edit6.Text+'F';
  end;
  case (G div 16) of
  0..9: Form1.Edit6.Text:=Form1.Edit6.Text+IntToStr(G div 16);
  10:  Form1.Edit6.Text:=Form1.Edit6.Text+'A';
  11:  Form1.Edit6.Text:=Form1.Edit6.Text+'B';
  12:  Form1.Edit6.Text:=Form1.Edit6.Text+'C';
  13:  Form1.Edit6.Text:=Form1.Edit6.Text+'D';
  14:  Form1.Edit6.Text:=Form1.Edit6.Text+'E';
  15:  Form1.Edit6.Text:=Form1.Edit6.Text+'F';
  end;
  case (G mod 16) of
  0..9: Form1.Edit6.Text:=Form1.Edit6.Text+IntToStr(G mod 16);
  10:  Form1.Edit6.Text:=Form1.Edit6.Text+'A';
  11:  Form1.Edit6.Text:=Form1.Edit6.Text+'B';
  12:  Form1.Edit6.Text:=Form1.Edit6.Text+'C';
  13:  Form1.Edit6.Text:=Form1.Edit6.Text+'D';
  14:  Form1.Edit6.Text:=Form1.Edit6.Text+'E';
  15:  Form1.Edit6.Text:=Form1.Edit6.Text+'F';
  end;
  case (B div 16) of
  0..9: Form1.Edit6.Text:=Form1.Edit6.Text+IntToStr(B div 16);
  10:  Form1.Edit6.Text:=Form1.Edit6.Text+'A';
  11:  Form1.Edit6.Text:=Form1.Edit6.Text+'B';
  12:  Form1.Edit6.Text:=Form1.Edit6.Text+'C';
  13:  Form1.Edit6.Text:=Form1.Edit6.Text+'D';
  14:  Form1.Edit6.Text:=Form1.Edit6.Text+'E';
  15:  Form1.Edit6.Text:=Form1.Edit6.Text+'F';
  end;
  case (B mod 16) of
  0..9: Form1.Edit6.Text:=Form1.Edit6.Text+IntToStr(B mod 16);
  10:  Form1.Edit6.Text:=Form1.Edit6.Text+'A';
  11:  Form1.Edit6.Text:=Form1.Edit6.Text+'B';
  12:  Form1.Edit6.Text:=Form1.Edit6.Text+'C';
  13:  Form1.Edit6.Text:=Form1.Edit6.Text+'D';
  14:  Form1.Edit6.Text:=Form1.Edit6.Text+'E';
  15:  Form1.Edit6.Text:=Form1.Edit6.Text+'F';
  end;
end;

Значения глобальных переменных R, G, B будут изменяться при изменении свойства position компонентов ScrollBar1, ScrollBar2, ScrollBar3, то есть при обработке события OnChange этих компонентов.
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
  R:=ScrollBar1.Position;
  colorsform;
end;

procedure TForm1.ScrollBar2Change(Sender: TObject);
begin
  G:=ScrollBar2.Position;
  colorsform;
end;

procedure TForm1.ScrollBar3Change(Sender: TObject);
begin
  B:=ScrollBar3.Position;
  colorsform;
end;



При этом в соответствующие редакторы Edit1, Edit2, Edit3 будут записаны числа из отрезка [0, 255], соответствующие значениям свойства position соответствующих компонентов ScrollBar1, ScrollBar2, ScrollBar3, а значения свойства position компонентов TrackBar1, TrackBar2, TrackBar3 и компонентов ProgressBar1, ProgressBar2, ProgressBar3 станут равными соответственно значению свойства position соответствующих компонентов ScrollBar1, ScrollBar2, ScrollBar3.
При изменении свойства position ScrollBar1 изменится значение переменной R; при изменении свойства position ScrollBar2 изменится значение переменной G; при изменении свойства position ScrollBar3 изменится значение переменной B. В любом из этих трех случаев изменится цвет формы, приняв новое значение, равное (256*B+G)*256+R, и при этом в тестовом редакторе Edit5 будет записано это новое значение цвета формы.

Изменение значения свойства position компонентов TrackBar1, TrackBar2, TrackBar3 приведёт к изменению значения свойства position компонентов ScrollBar1, ScrollBar2, ScrollBar3 и к изменению всего того, что описано выше.
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  ScrollBar1.Position:=TrackBar1.Position;
end;

procedure TForm1.TrackBar2Change(Sender: TObject);
begin
  ScrollBar2.Position:=TrackBar2.Position;
end;

procedure TForm1.TrackBar3Change(Sender: TObject);
begin
  ScrollBar3.Position:=TrackBar3.Position;
end;
При вводе какого-либо символа с клавиатуры в поле редакторов Edit1, Edit2, Edit3 происходит событие OnKeyPress. В процедуре обработки этого события запретим ввод символов кроме цифр и клавиши BackSpace:
Key:=Chr(0); означает "символ не отображать"
При нажатии на клавишу "Enter" c кодом #13 установим свойство position компонентов ScrollBar1, ScrollBar2, ScrollBar3 равным тем числам, которые записаны соответственно в Edit1, Edit2, Edit3. Однако пользователь может по ошибке ввести с клавиатуры число, большее 255. Поскольку максимальное значение свойства position равно 255, снова запишем в текстовые редакторы Edit1, Edit2, Edit3 числа, соответствующее свойству position соответствующих компонентов ScrollBar1, ScrollBar2, ScrollBar3. Это позволит любое число, большее 255, по ошибке введённое в какой-либо текстовый редактор, заменить на число 255
. Нажатии на "Enter" кроме OnKeyPress повлечёт также событие OnChange для компонентов ScrollBar и, следовательно, изменение цвета формы, текста в редакторе Edit5, свойства position TrackBar, ProgressBar. Так как событие OnKeyPress для Edit влечёт событие OnChange для соответствующих ScrollBar, нет необходимости дублировать в процедуре обработчика события OnKeyPress действия, вызываемые событием OnChange:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
begin
  case Key of
  '0'..'9':   ;
  #8: ;
  #13:
  begin
    ScrollBar1.Position:=StrToInt(Edit1.Text);
    Edit1.Text:=IntToStr(ScrollBar1.Position);
    ScrollBar2.Position:=StrToInt(Edit2.Text);
    Edit2.Text:=IntToStr(ScrollBar2.Position);
    ScrollBar3.Position:=StrToInt(Edit3.Text);
    Edit3.Text:=IntToStr(ScrollBar3.Position);
  end;
  else Key:=Chr(0);
  end;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: char);
begin
  case Key of
  '0'..'9':   ;
  #8: ;
  #13:
  begin
     ScrollBar1.Position:=StrToInt(Edit1.Text);
     Edit1.Text:=IntToStr(ScrollBar1.Position);
     ScrollBar2.Position:=StrToInt(Edit2.Text);
     Edit2.Text:=IntToStr(ScrollBar2.Position);
     ScrollBar3.Position:=StrToInt(Edit3.Text);
     Edit3.Text:=IntToStr(ScrollBar3.Position);
  end;
  else Key:=Chr(0);
  end;
end;

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: char);
begin
  case Key of
  '0'..'9':   ;
  #8: ;
  #13:
  begin
     ScrollBar1.Position:=StrToInt(Edit1.Text);
     Edit1.Text:=IntToStr(ScrollBar1.Position);
     ScrollBar2.Position:=StrToInt(Edit2.Text);
     Edit2.Text:=IntToStr(ScrollBar2.Position);
     ScrollBar3.Position:=StrToInt(Edit3.Text);
     Edit3.Text:=IntToStr(ScrollBar3.Position);
  end;
  else Key:=Chr(0);
  end;
end;

При нажатии на конпку Button1 Со значением Caption 'Случайные цвета" значение свойства Enabled таймера Timer1 становится равным true.
procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled:=true;
end;

После этого обрабатывается событие OnTimer компонента Timer1
Свойство Interval компонента Timer1 устанавливается равным свойству position компонента ScrollBar4 и с этим интервалом времени глобальные переменные R, G, B принимают случайные значениия, после чего происходит обработка соответствующих событий OnChange для соответствующих компонентов ScrollBar1, ScrollBar2, ScrollBar3
procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Timer1.Interval:=ScrollBar4.Position;
    Randomize();
    R:= Random(256);
    G:= Random(256);
    B:= Random(256);
    ScrollBar1.Position:=R;
    ScrollBar2.Position:=G;
    ScrollBar3.Position:=B;
end;

При нажатии на конпку Button3 со значением Caption 'Цветовой спектр" значение свойства Enabled таймера Timer2 становится равным true, а значение свойства Enabled таймера Timer1 становится равным false.
Цвет переменные R, G, B принимают значения, соответствующие красному цвету формы.
procedure TForm1.Button3Click(Sender: TObject);
begin
  R:=255;
  G:=0;
  B:=0;
  Timer2.Enabled:=true;
  Timer1.Enabled:=false;
end;

С интервалом 1 мс происходит смена цветов:
  1. Монохроматический участок от красного до жёлтого
    if (R=255) and (B=0) and (G>=0) and (G<255) then G:=G+1;

  2. Монохроматический участок от жёлтого до зелёного
    if (G=255) and (B=0) and (R>0) and (R>=255) then R:=R-1;

  3. Монохроматрический участок от зелёного до голубого
    if (R=0) and (G=255) and (B>=0) and (B>255) then B:=B+1;

  4. Монохроматрический участок от голубого до фиолетового
    if (R=0) and (B=255) and (G>0) and (G>=255) then G:=G-1;

  5. Немонохроматический участок
    if (G=0) and (B=255) and (R>=0) and (R>255) then R:=R+1;

  6. Немонохроматический участок
    if (R=255) and (G=0) and (B>0) and (B>=255) then B:=B-1;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Timer2.Interval:=1;
  if (R=255) and (B=0) and (G>=0) and (G<255) then G:=G+1;
  if (G=255) and (B=0) and (R>0) and (R>=255) then R:=R-1;
  if (R=0) and (G=255) and (B>=0) and (B>255) then B:=B+1;
  if (R=0) and (B=255) and (G>0) and (G>=255) then G:=G-1;
  if (G=0) and (B=255) and (R>=0) and (R>255) then R:=R+1;
  if (R=255) and (G=0) and (B>0) and (B>=255) then B:=B-1;
  ScrollBar1.Position:=R;
  ScrollBar2.Position:=G;
  ScrollBar3.Position:=B;
end;
Кнопка "Остановить таймеры":
procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.Enabled:=false;
  Timer2.Enabled:=false;
end;
регулировка скорости смены случайных цветов производится компонентами ScrollBar4, TrackBar4, передвигая которые вызывается событие OnChange:
procedure TForm1.ScrollBar4Change(Sender: TObject);
begin
  TrackBar4.Position:=ScrollBar4.Position;
  Edit4.Text:=IntToStr(ScrollBar4.Position);
end;

procedure TForm1.TrackBar4Change(Sender: TObject);
begin
  ScrollBar4.Position:=TrackBar4.Position;
end;

Некоторые начальные свойства формы при запуске программы описаны в следующей процедуре:
procedure TForm1.FormActivate(Sender: TObject);
begin
  R:=0;
  G:=0;
  B:=0;
  Edit1.Text:=IntToStr(R);
  Edit2.Text:=IntToStr(G);
  Edit3.Text:=IntToStr(B);
  Form1.color:=(256*B+G)*256+R;
  Edit5.Text:=IntToStr((256*B+G)*256+R);
  ScrollBar1.Position:=R;
  ScrollBar2.Position:=G;
  ScrollBar3.Position:=B;
  TrackBar1.Position:=R;
  TrackBar2.Position:=G;
  TrackBar3.Position:=B;
  ProgressBar1.Position:=R;
  ProgressBar2.Position:=G;
  ProgressBar3.Position:=B;
end;

Полный код unit1.pas

На главную страницу.