Смекни!
smekni.com

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

Оскільки меню — не візуальні компоненти, то вони можуть розміщуватись у будь-якому зручному для програміста місці форми. Для створення та зміни пунктів меню у процесі розробки додатку призначений Конструктор Меню (MenuDesigner).

Усі пункти меню мають однакові властивості, які відображаються у Інспекторі Об’єктів. Наприклад, властивості Name та Caption. Властивість ShortCutможе задавати «гарячі клавіші» для команди, що відповідає пункту. Якщо властивість Caption задати як « – »(тире), то в меню з’явиться розділова горизонтальна риса.

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

2.2.9 OLEContainer

Абревіатура OLE означає Objects Linked and Embedded (приєднання та вбудовані об'єкти). OLE є подальшим розвитком ідеї поділюваних між додатками даних. OLE дозволяє легко вмонтувати в додаток обробку будь-яких типів даних. Кожен раз, коли в програмі-клієнті користувач звертається до OLE-об'єкту з метою перегляду або редагування даних (зазвичай подвійного клацання мишкою на об'єкті), запускається додаток-сервер, в якому і відбувається робота з даними [2].

Як випливає з назви, OLE-об'єкти можна або приєднати до OLE-контейнера, або включити до нього. У першому випадку дані будуть зберігатися в файлі на диску; будь-який додаток буде мати доступ до цих даних і зможе вносити зміни. У другому випадку дані включаються в OLE-контейнер, і тільки він зможе переглядати і модифікувати ці дані.

Вибрати OLE-сервер можна, двічі натиснувши на компоненті (див. Рисунок 6).

Рисунок 4 – Вибір OLE-сервера

У цьому діалозі є список всіх зареєстрованих в системі OLE-серверів. Тип OLE-об'єкту визначається як раз тим сервером, який Ви вкажете. Якщо Ви створите новий об'єкт (Create New), то при натисканні на кнопку OK запуститься програма OLE-сервера, в якій і формується новий об'єкт.

Також OLE-об'єкт можна створити, використовуючи вже існуючий файл у форматі одного з OLE-серверів. Для цього потрібно вибрати пункт Create from File (див. Рисунок 7).


Рисунок 5 — Створення із файлу

Обраний об'єкт можна як включити до програми, так і приєднати, відзначивши пункт Link.

Якщо під час дизайну Ви обираєте об'єкт для включення в OLE-контейнер, то він повністю записується у файл форми (formName.dfm) і в подальшому прикомпілюється до .exe файлу. У випадку дуже великих об'єктів це може призвести до тривалих пауз і навіть до виникнення помилки "Out of resource". Тому рекомендується великі об'єкти робити приєднаними (linked).

2.3 Алгоритми процедур

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



2.4 Програмний код додатку

Головна форма:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Menus, ExtCtrls, StdCtrls;

type

TForm1 = class(TForm)

GroupBox1: TGroupBox;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Edit5: TEdit;

Edit6: TEdit;

Edit7: TEdit;

Edit8: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

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;

Label9: TLabel;

CheckBox2: TCheckBox;

Label10: TLabel;

CheckBox3: TCheckBox;

Label11: TLabel;

ColorBox3: TColorBox;

Label12: TLabel;

Label13: TLabel;

ColorBox4: TColorBox;

ComboBox1: TComboBox;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

Bycnherwbz1: TMenuItem;

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 CheckBox2Click(Sender: TObject);

procedure CheckBox3Click(Sender: TObject);

procedure ColorBox3Change(Sender: TObject);

procedure ColorBox4Change(Sender: TObject);

procedure ComboBox1Change(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure Activate(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure Bycnherwbz1Click(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,yc,xd,yd:real;

v,c,c1:integer;

OB,OD,D,BD:real;

xn,yn,xn1,yn1:Real;

X1,Y1,X2,Y2,Z1,Z2,xO,yO:real;

w:integer;

vis:integer;

OBP,ODP: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:=-4; xmax:=4; ymin:=-4; ymax:=4;

a1:=10; a2:=410;

b1:=10; 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<>0 then textOut(xe-5,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<>0 then textOut(x0-20,ye-5,FloatToStr(y));

end;

y:=y+dy;

until(y>ymax);

Font.Color:=clBlack;

If Checkbox2.Checked=true then

begin

Pen.Width:=2;

Pen.Color:=Colorbox1.Selected;;

Pen.Style:=psSolid;

MoveTo(a1,y0); LineTo(a2,y0);

MoveTo(x0,b1); LineTo(x0,b2);

end;

If v=1 then

begin

X1:=yC-yA;Y1:=xA-xC;

Z1:=xA*yC-xC*yA;

X2:=yD-yB;Y2:=xB-xD;

Z2:=xB*yD-xD*yB;

D:=X1*Y2-Y1*X2;

If D<>0 then

begin

xO:=(Z1*Y2-Y1*Z2)/D;

yO:=(X1*Z2-Z1*X2)/D;

OB:=sqrt(sqr(xO-xB)+sqr(yO-yB));

OD:=sqrt(sqr(xO-xD)+sqr(yO-yD));

BD:=sqrt(sqr(xB-xD)+sqr(yB-yD));

OBP:=round(OB*(100/BD));

ODP:=100-OBP;

label5.Caption:='OB='+FloatToStrF(OB,fffixed,4,2)+' '+IntToStr(OBP)+'%'+#13

+'OD='+FloatToStrF(OD,fffixed,4,2)+' '+intToStr(ODP)+'%';

Font.Color:=clRed;

textOut(ekrX(xO)+6,ekrY(yO)-6,'O');

end

else

begin

label5.Caption:='';

ShowMessage('Исправте координаты точек');

end;

Case Combobox1.ItemIndex of

0:w:=1;

1:w:=2;

end;

Pen.Width:=w;

Pen.Style:=psSolid;

Pen.Color:=Colorbox4.Selected;

MoveTo(ekrX(xa),ekrY(ya));

LineTo(ekrX(xb),ekrY(yb));

LineTo(ekrX(xc),ekrY(yc));

LineTo(ekrX(xd),ekrY(yd));

LineTo(ekrX(xa),ekrY(ya));

Pen.Width:=1;Pen.Style:=psDot;

LineTo(ekrX(xc),ekrY(yc));

MoveTo(ekrX(xb),ekrY(yb));

LineTo(ekrX(xd),ekrY(yd));

Font.Color:=clRed;

textOut(ekrX(xA)+6,ekrY(yA)+1,'A');

textOut(ekrX(xB)+6,ekrY(yB)+1,'B');

textOut(ekrX(xC)+6,ekrY(yC)+1,'C');

textOut(ekrX(xD)+6,ekrY(yD)+1,'D');

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);

Ellipse(ekrX(xC)-3,ekrY(yC)-3,ekrX(xC)+3,ekrY(yC)+3);

Ellipse(ekrX(xD)-3,ekrY(yD)-3,ekrX(xD)+3,ekrY(yD)+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);

xC:=StrToFloat(Edit5.Text);

yC:=StrToFloat(Edit6.Text);

xD:=StrToFloat(Edit7.Text);

yD:=StrToFloat(Edit8.Text);

c:=0;

repeat

begin

case c of

0:begin Xn:=xA;Yn:=yA;end;

1:begin Xn:=xB;Yn:=yB;end;

2:begin Xn:=xC;Yn:=yC;end;

3:begin Xn:=xD;Yn:=yD;end;

end;

c1:=0;

repeat

begin

case c1 of

0:begin Xn1:=xA;Yn1:=yA;end;

1:begin Xn1:=xB;Yn1:=yB;end;

2:begin Xn1:=xC;Yn1:=yC;end;

3:begin Xn1:=xD;Yn1:=yD;end;

end;

if c<>c1 then

begin

If Xn=Xn1 then

begin

if Yn=Yn1 then

begin

ShowMessage('Найдены были одинаковые координаты двух точек.'+#13+

'Пожалуйста откорректируйте введенные координаты.',);

c:=4;c1:=4;v:=0;

end;

end;

end;

end;

If (Xn<xmin) or (Xn>xmax) or (Yn<Ymin) or (Yn>Ymax) then

begin

c:=4;c1:=4;v:=0;

ShowMessage('Одна из введенных точек выходит'+#13+'за пределы координатной плоскости');

end;

c1:=c1+1;

until(c1>3);

end;

c:=c+1;

until(c>3);

paintbox1.Repaint;

end;

procedure TForm1.ColorBox1Change(Sender: TObject);

begin

Paintbox1.Repaint;

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

Paintbox1.Repaint;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

v:=0;

label5.Caption:='';

Paintbox1.Repaint;

end;

procedure TForm1.ColorBox2Change(Sender: TObject);

begin

Paintbox1.Repaint;

end;

procedure TForm1.CheckBox2Click(Sender: TObject);

begin

Paintbox1.Repaint;

end;

procedure TForm1.CheckBox3Click(Sender: TObject);

begin

Paintbox1.Repaint;

end;

procedure TForm1.ColorBox3Change(Sender: TObject);

begin

Paintbox1.Repaint;

end;

procedure TForm1.ColorBox4Change(Sender: TObject);

begin

Paintbox1.Repaint;

end;

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

PaintBox1.Repaint;

end;

procedure TForm1.N2Click(Sender: TObject);

begin

Form3.ShowModal;

end;

procedure TForm1.N3Click(Sender: TObject);

begin

Form4.ShowModal;

end;

procedure TForm1.N4Click(Sender: TObject);

begin

Form5.ShowModal;

end;

procedure TForm1.Bycnherwbz1Click(Sender: TObject);

begin

Form6.ShowModal;

end;

end.

Форма заставки:

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, OleCtnrs;

type

TForm2 = class(TForm)

Timer1: TTimer;

OleContainer1: TOleContainer;

procedure Activate(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Activate(Sender: TObject);

begin

Timer1.Interval:=5000;

Timer1.Enabled:=True;

end;

procedure TForm2.Timer1Timer(Sender: TObject);

begin

Form1.Visible:=True;

vis:=1;

Form2.Close;

end;

end.

Форма «Опрограмме»:

unit Unit3;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, OleCtnrs;

type

TForm3 = class(TForm)

OleContainer1: TOleContainer;

private

{ Private declarations }

public

{ Public declarations }

end;


var

Form3: TForm3;

implementation

{$R *.dfm}

end.

Форма «Пример»:

unit Unit4;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, OleCtnrs;

type

TForm4 = class(TForm)