Смекни!
smekni.com

Розробка засобами Delphi дидактичного ілюстративного матеріалу для розвязання задачі з аналітичної Технологія візуального (стр. 3 из 4)

2.2.5 PaintBox та ColorBox

Компонент 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 для вибору одного з сисемних кольорів.

2.2.6 Timer

Таймер — це не візуальний компонент, який може розміщуватись у будь-якому місці форми. Це системний генератор подій, що періодично повідомляє програмі про завершення заданого проміжку часу. Інтервал часу між подіями таймера задається в мілісекундах як значення властивості Interval, і може встановлюватися в діапазоні від 1 до 65535 мілісекунд. Використовуючи таймер треба враховувати, що інтервали між цими подіями виявляються неточними з-за накладних витрат механізму обробки подій Windows [4].

Через задані у властивості Interval проміжки часу в компоненті Timer відбувається подія OnTimer (єдина подія цього компоненту). В обробнику цієї події записуються необхідні операції.

2.2.7 MainMenu

Меню — це невізуальний компонент, який в додатку являє собою список об'єднаних за функціональною ознакою пунктів, кожен з яких позначає команду або підменю. При роботі програми воно розташовується у верхній частині форми під її заголовком і містить найбільш загальні команди роботи. Вибір пункту меню відповідає виконанню заданої команди або розкриттю підменю [8].

Для створення і зміни пунктів меню в процесі розробки програми призначений Конструктор меню (Menu Designer). Запуск Конструктора меню виконується подвійним клацанням миші по відповідному компоненту-меню.

Всі пункти меню мають однакові властивості, які відображаються в Інспекторі Об'єктів. Наприклад, властивості Name та Caption.

Властивість ShortCut може задавати "гарячі клавіші" для команди, що відповідає пункту. Якщо властивість Caption задати як «-» (тире), то в меню з'явиться розділова горизонтальна риса.

Властивість Checked для пункту меню описує факт його «вибору» або «не вибору» — при значенні, що дорівнює True, ліворуч від тексту пункту ставиться «пташка».

Для кожного пункту меню має бути вказаний метод, який визначає дії, що здійснюються у відповідь на події вибору відповідного пункту. Щоб встановити такий метод, потрібно запустити Конструктор меню та виконати подвійне клацання по потрібного пункту.

2.2.8 OLEContainer

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.3 Алгоритми процедур

Блок-схема алгоритму процедури графічної побудови:



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