Лабораторная работа №8 по предмету «Графическая визуализация».
Выполнил студент второго курса Фомин В. Л.
Создание графических приложений в среде Object Pascal.
Управление цветом формы.
Программа управления цветами формы.
- Запустить приложение.
- Просмотреть в текстовом редакторе код unit1.pas
- Просмотреть в текстовом редакторе визуальные свойства компонентов формы.
Этапы создания графического приложения.
На форме
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 и компонентов P
rogressBar1, 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 мс происходит смена цветов:
- Монохроматический участок от красного до жёлтого
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;
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
На главную страницу.