Оскільки меню — не візуальні компоненти, то вони можуть розміщуватись у будь-якому зручному для програміста місці форми. Для створення та зміни пунктів меню у процесі розробки додатку призначений Конструктор Меню (MenuDesigner).
Усі пункти меню мають однакові властивості, які відображаються у Інспекторі Об’єктів. Наприклад, властивості Name та Caption. Властивість ShortCutможе задавати «гарячі клавіші» для команди, що відповідає пункту. Якщо властивість Caption задати як « – »(тире), то в меню з’явиться розділова горизонтальна риса.
Для кожного пункту меню повинен бути заданий метод, що визначає дії, які виконуються у відповідь на подію вибору відповідного пункту. Щоб задати такий метод, треба запустити Конструктор меню та виконати подвійне натискання по необхідному пункту.
Абревіатура 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).
Блок-схема алгоритму процедури графічної побудови:
Головна форма:
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)