Компонент PaintBox використовується для створення форми для малювання. PaintBox призначений для малювання за допомогою графічних інструментів (пір'я, пензлі та ін.).
PaintBox можна використовувати для побудови додатків типу графічного редактора, або, наприклад, в якості місця побудови графіків. Ніяких ключових властивостей, крім Canvas, TPaintBox не має. Власне, цей об'єкт є просто канва для малювання.Важливо, що координати покажчика миші, що передаються в обробник відповідних подій (OnMouseMove та ін.), є відносними, тобто це зміщення миші відносно лівого верхнього кута об'єкта TPaintBox, а не відносно лівого верхнього кута форми.Властивості Canvas [1]:– Brush — пензлик; є об'єктом зі своїм набором властивостей: Bitmap — картинка розміром суворо 8x8 (використовується для заповнення області на екрані); Color — колір заливки; Style — наперед вказаний стиль заливки; ця властивість конкурує з властивістю Bitmap (яка властивість визначена останньою, та і буде визначати вид заливки).– ClipRect — (тільки читання) прямокутник, на якому відбувається графічний висновок.– Pen — олівець, визначає вид ліній; як і пензлик (Brush) є об'єктом з набором властивостей;– Width — ширина лінії в точках;– Pixels — двомірний масив елементів зображення (pixel). З його допомогою отримується доступ до кожної окремої точки зображення.Методи для малювання найпростішої графіки — Arc, LineTo, Polygon, PolyLine, Rectangle. При промальовуванні ліній в цих методах використовуються олівець (Pen) канви, а для заповнення внутрішніх областей — пензель (Brush).Методи для виведення тексту — TextOut.Компонент ColorBox забезпечує вибір сисемних кольорів із списку. Він є спеціальним варіантом компоненту ColorBox для вибору одного з сисемних кольорів.Таймер — це не візуальний компонент, який може розміщуватись у будь-якому місці форми. Це системний генератор подій, що періодично повідомляє програмі про завершення заданого проміжку часу. Інтервал часу між подіями таймера задається в мілісекундах як значення властивості Interval, і може встановлюватися в діапазоні від 1 до 65535 мілісекунд. Використовуючи таймер треба враховувати, що інтервали між цими подіями виявляються неточними з-за накладних витрат механізму обробки подій Windows [4].
Через задані у властивості Interval проміжки часу в компоненті Timer відбувається подія OnTimer (єдина подія цього компоненту). В обробнику цієї події записуються необхідні операції.
Меню — це невізуальний компонент, який в додатку являє собою список об'єднаних за функціональною ознакою пунктів, кожен з яких позначає команду або підменю. При роботі програми воно розташовується у верхній частині форми під її заголовком і містить найбільш загальні команди роботи. Вибір пункту меню відповідає виконанню заданої команди або розкриттю підменю [8].
Для створення і зміни пунктів меню в процесі розробки програми призначений Конструктор меню (Menu Designer). Запуск Конструктора меню виконується подвійним клацанням миші по відповідному компоненту-меню.
Всі пункти меню мають однакові властивості, які відображаються в Інспекторі Об'єктів. Наприклад, властивості Name та Caption.
Властивість ShortCut може задавати "гарячі клавіші" для команди, що відповідає пункту. Якщо властивість Caption задати як «-» (тире), то в меню з'явиться розділова горизонтальна риса.
Властивість Checked для пункту меню описує факт його «вибору» або «не вибору» — при значенні, що дорівнює True, ліворуч від тексту пункту ставиться «пташка».
Для кожного пункту меню має бути вказаний метод, який визначає дії, що здійснюються у відповідь на події вибору відповідного пункту. Щоб встановити такий метод, потрібно запустити Конструктор меню та виконати подвійне клацання по потрібного пункту.
OLEContainer (Objects Linked and Embedded — приєднанні та вбудовані об'єкти) використовується для створення додатків OLE-контейнерів. Компонент приховує всі складнощі, пов'язані з внутрішньою організацією OLE і надає програмісту досить простий інтерфейс. OLE дозволяє легко вмонтувати в додаток обробку будь-яких типів даних.
Найбільш частіше використовуваними властивостями цього компоненту є AutoActivate, що визначає, яким чином активізується OLE-докумеіт, State, визначає стан OLE-контейнера, та OleClassName, що визначає ім'я класу OLE-об'єкта, що міститься в контейнері. Найбільш часто використаються такі методи цього компоненту [7]:
– InsertObjectDialog — виводить стандартне діалогове вікно Object для вибору типу документа або завантаження його з файлу;
– CreateObject — створює OLE-об'єкт;
– CreateObjectFromFile — створює OLE-об’єкт на основі існуючого файлу, містить OLE-документ, і поміщає його до OLE-контейнера;
– DestroyObject — знищує об'єкт, що міститься в OLE-контейнері.
Блок-схема алгоритму процедури графічної побудови:
2.4 Програмний код додатку
Головна форма:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
GroupBox2: TGroupBox;
PaintBox1: TPaintBox;
MainMenu1: TMainMenu;
N1: TMenuItem;
Button1: TButton;
GroupBox3: TGroupBox;
ColorBox1: TColorBox;
Label6: TLabel;
Label5: TLabel;
CheckBox1: TCheckBox;
Label7: TLabel;
Button2: TButton;
Label8: TLabel;
ColorBox2: TColorBox;
Label10: TLabel;
CheckBox3: TCheckBox;
Label11: TLabel;
ColorBox3: TColorBox;
Label13: TLabel;
ColorBox4: TColorBox;
N2: TMenuItem;
N3: TMenuItem;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label3: TLabel;
N4: TMenuItem;
N5: TMenuItem;
Label4: TLabel;
Label9: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ColorBox1Change(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ColorBox2Change(Sender: TObject);
procedure CheckBox3Click(Sender: TObject);
procedure ColorBox3Change(Sender: TObject);
procedure ColorBox4Change(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure Activate(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
x0,y0:integer;
xe,ye:integer;
x,y:real;
dx,dy:real;
Mx,My:real;
xmin,xmax,ymin,ymax:integer;
a1,a2,b1,b2:integer;
xa,ya,xb,yb,xC,xD:real;
v,c:integer;
xn,yn:Real;
X1,Y1,Z1,yO:real;
w:integer;
vis:integer;
implementation
uses Unit3, Unit2, Unit4, Unit5, Unit6;
{$R *.dfm}
function ekrX(x:real):integer; //Преобразование X
begin
ekrX:=round(mx*(x-xmin)+a1);
end;
function ekrY(y:real):integer; //Преобразование Y
begin
ekrY:=round(my*(-y+ymax)+b1);
end;
procedure TForm1.Activate(Sender: TObject);
begin
if vis<>1
then
begin
Form2.ShowModal;
end;
End;
procedure TForm1.FormCreate(Sender: TObject);
begin
xmin:=-5; xmax:=5; ymin:=-5; ymax:=5;
a1:=0; a2:=410;
b1:=0; b2:=410;
dx:=1; dy:=1;
with PaintBox1.Canvas do
begin
Brush.Color:=clWhite;
Rectangle(-1,-1,PaintBox1.Width+1,PaintBox1.Height+1);
Pen.width:=1;
Pen.Color:=clBlack;
Mx:=round((a2-a1)/(xmax-xmin));
My:=round((b2-b1)/(ymax-ymin));
x0:=a1-round(mx)*xmin;
y0:=b1+round(my)*ymax;
Pen.width:=1;
Pen.Style:=psDot;
Pen.Color:=Colorbox2.Selected;;
Font.Color:=Colorbox3.Selected;
if checkbox3.checked=true then
begin
TextOut(a2-10,y0-15,'X');
TextOut(x0+5,b1+5,'Y');
TextOut(x0+5,y0-18,'0');
end;
x:=xmin;
repeat
Xe:=round(mx*(x-xmin)+a1);
if Checkbox1.Checked=true then
begin
MoveTo(xe,b1);LineTo(xe,b2);
end;
if checkbox3.checked=true then
begin
if x=(-5) then textOut(xe,y0+6,FloatToStr(x));
if (x<>0) and (x<>-5) then textOut(xe-8,y0+5,FloatToStr(x));
end;
x:=x+dx;
until(x>xmax);
y:=ymin;
repeat
Ye:=round(my*(-y+ymax)+b1);
if Checkbox1.Checked=true then
begin
MoveTo(a1,ye);LineTo(a2,ye);
end;
if checkbox3.checked=true then
begin
if y=5 then textOut(x0-20,ye,FloatToStr(y));
if (y<>0) and(y<>5) then textOut(x0-20,ye-12,FloatToStr(y));
end;
y:=y+dy;
until(y>ymax);
Font.Color:=clBlack;
Pen.Width:=2;
Pen.Color:=Colorbox1.Selected;;
Pen.Style:=psSolid;
MoveTo(a1,y0); LineTo(a2,y0);
MoveTo(x0,b1); LineTo(x0,b2);
//Расчет
If v=1 then
begin
X1:=yB-yA;
Y1:=xA-xB;
Z1:=xA*yB-xB*yA;
If Y1=0 then
begin
label5.Caption:='Заданная прямая пара-'+#13+'лельна оси ординат и'+#13
+'не имеет точки пересе-'+#13+'чения с ней';
ShowMessage('Заданная прямая паралельна оси ординат'+#13+
'и не имеет точки пересечения с ней');
Pen.Style:=psSolid;
Pen.Color:=ColorBox4.Selected;
MoveTo(ekrX(xa),ekrY(ya));LineTo(ekrX(xA),ekrY(10));
MoveTo(ekrX(xb),ekrY(yb));LineTo(ekrX(Xb),ekrY(-10));
end
else
begin
yO:=Z1/Y1;
label5.Caption:='Заданная прямая пересе-'+#13
+'кается с осью ординат в'+#13+'точке C ( 0 ; '
+FloatToStrF(yO,fffixed,4,2)+' )';
If X1=0 then
begin
Pen.Style:=psSolid;
Pen.Color:=ColorBox4.Selected;
MoveTo(ekrX(xa),ekrY(ya));LineTo(ekrX(10),ekrY(yA));
MoveTo(ekrX(xb),ekrY(yb));LineTo(ekrX(-10),ekrY(yB));
end
else
begin
xC:=(z1-y1*10)/x1;
xD:=(z1-y1*(-10))/x1;
Pen.Style:=psSolid;
Pen.Color:=ColorBox4.Selected;
MoveTo(ekrX(xa),ekrY(ya));LineTo(ekrX(xC),ekrY(10));
MoveTo(ekrX(xb),ekrY(yb));LineTo(ekrX(xD),ekrY(-10));
end;
//Вывод точки С
Pen.Color:=clRed;
Pen.Width:=1;
Pen.Style:=psSolid;
If (yO<ymin) or (yO>ymax) then
begin
label5.Caption:='Точка С лежит за пре-'+#13+'делами координатной'+#13
+'проскости';
end;
Ellipse(ekrX(0)-3,ekrY(yO)-3,ekrX(0)+3,ekrY(yO)+3);
textOut(ekrX(0)+6,ekrY(yO)+1,'C');
end;
Pen.Width:=2;
Pen.Style:=psSolid;
Pen.Color:=Colorbox4.Selected;
MoveTo(ekrX(xa),ekrY(ya));
LineTo(ekrX(xb),ekrY(yb));
Font.Color:=clRed;
textOut(ekrX(xA)+6,ekrY(yA)+1,'A');
textOut(ekrX(xB)+6,ekrY(yB)+1,'B');
Font.Color:=clBlack;
Pen.Color:=clBlack;
Pen.Width:=1;
Pen.Style:=psSolid;
Ellipse(ekrX(xA)-3,ekrY(yA)-3,ekrX(xA)+3,ekrY(yA)+3);
Ellipse(ekrX(xB)-3,ekrY(yB)-3,ekrX(xB)+3,ekrY(yB)+3);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
v:=1;
xA:=StrToFloat(Edit1.Text);
yA:=StrToFloat(Edit2.Text);
xB:=StrToFloat(Edit3.Text);
yB:=StrToFloat(Edit4.Text);
//проверка не одинаковы ли точки
if xA=xB then
begin
If yA=yB then
begin
ShowMessage('Найдены были одинаковые координаты двух точек.'+#13+
'Пожалуйста откорректируйте введенные координаты.',);
v:=0;
label5.Caption:='';
end;
end;
//проверка не выходят ли точки за пределы координатной плоскости
If v<>0 then
begin
c:=0;
repeat
case c of
0:begin Xn:=xA; Yn:=yA; end;
1:begin Xn:=xb; Yn:=yB; end;
end;
If (Xn<xmin) or (Xn>xmax) or (Yn<Ymin) or (Yn>Ymax) then
begin
v:=0;
ShowMessage('Одна из введенных точек выходит'+#13