Лабораторная работа № 2
Задание: создание собственного класса на базе TObject. Создать новый класс TAngle, наследник класса TObject. Класс TAngle предназначен для визуального задания пользователем плоских углов в градусах.
Реализовать класс TAngle и программу, реализующую этот класс.
Создать новый метод для изменения значений xpos ypos и соответствующие элементы управления, позволяющие управлять местоположением области рисования
Обеспечить одновременную работу с 2 экземплярами класса.
Ввести в класс новое свойство, определяющее цвет закрашенной области.
Код программы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;
type
TMyForm = class(TForm)
ColorDialog1: TColorDialog;
Edit1: TEdit;
Button_1: TButton;
Edit2: TEdit;
Button_2: TButton;
Button_3: TButton;
Button_5: TButton;
Label1: TLabel;
Label2: TLabel;
Image1: TImage;
Button1: TButton;
UpDown1: TUpDown;
RadioGroup1: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure Button_1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button_5Click(Sender: TObject);
procedure UpDown1ChangingEx(Sender: TObject; var AllowChange: Boolean;
NewValue: Smallint; Direction: TUpDownDirection);
procedure Button_2Click(Sender: TObject);
procedure Button_3Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
end;
Type TAngle=class
private
ColorDialog1: TColorDialog;
Value:integer;
XPos,YPos:integer;
Can:TCanvas;
Image1:TImage;
{ Private declarations }
public
constructor Create(X,Y:integer; NewCanvas:TCanvas);
procedure SetValue(NewValue:integer);
function Plus (Increment:integer):integer;
function Minus(Decrement:integer):integer;
procedure Draw;
destructor Destroy; override;
end;
{ Public declarations }
var
MyForm: TMyForm;
Angle:TAngle;
Angle2:TAngle;
c,c2:Tcolor;
nazh, nazh2:boolean;
colorCheck:boolean;
implementation
{$R *.dfm}
constructor TAngle.Create(X,Y:integer; NewCanvas:TCanvas);
begin
inherited Create;
XPos:=X;
YPos:=Y;
Value:=45;
Can:=NewCanvas;
end;
function TAngle.Plus (Increment:integer):integer;
begin
Value:= (Value + Increment) mod 360;
result:=Value;
end;
function TAngle.Minus (Decrement:integer):integer;
begin
Value:= (Value - Decrement) mod 360;
result:=Value;
end;
procedure TAngle.SetValue(NewValue:integer);
begin
Value:=NewValue;
Value:=NewValue mod 360;
End;
destructor TAngle.Destroy;
begin
inherited Destroy;
end;
procedure TAngle.Draw;
begin
Can.pie(XPos, YPos, XPos+100, YPos+100, XPos+50+round(50*cos(Value*pi/180)),YPos+50+round(50*sin(Value*pi/180)),XPos+100, YPos+51);
end;
procedure TMyForm.FormCreate(Sender: TObject);
begin
c:=clWhite;
nazh:=false;
nazh2:=False;
Image1.Canvas.MoveTo(0, 65);
Image1.Canvas.LineTo(130, 65);
Image1.Canvas.MoveTo(65, 0);
Image1.Canvas.LineTo(65, 130);
Image1.Canvas.MoveTo(120,62);
Image1.Canvas.LineTo(127, 65);
Image1.Canvas.MoveTo(120, 68);
Image1.Canvas.LineTo(127, 65);
end;
procedure TMyForm.Button_1Click(Sender: TObject);
begin
try
Button_5Click(Sender);
if RadioGroup1.ItemIndex = 0 then
begin
Image1.Canvas.Brush.Color:=c;
Angle:=TAngle.Create(15,15,Image1.Canvas);
Angle.SetValue(Strtoint(Edit1.text));
Angle.Draw;
nazh := true;
end
else
begin
Image1.Canvas.Brush.Color:=c2;
Angle2:=TAngle.Create(15,15,Image1.Canvas);
Angle2.SetValue(Strtoint(Edit1.text));
Angle2.Draw;
nazh2:=true;
end;
Image1.Canvas.MoveTo(120,62);
Image1.Canvas.LineTo(127, 65);
Image1.Canvas.MoveTo(120, 68);
Image1.Canvas.LineTo(127, 65);
Image1.Canvas.MoveTo(0, 65);
Image1.Canvas.LineTo(130, 65);
Image1.Canvas.MoveTo(65, 0);
Image1.Canvas.LineTo(65, 130);
except
on EconvertError do showmessage ('Error!!!');
end;
end;
procedure TMyForm.Button1Click(Sender: TObject);
begin
if (ColorDialog1.Execute=true) then
if (RadioGroup1.ItemIndex = 0) then
c:=ColorDialog1.Color
else
c2:=ColorDialog1.Color;
end;
procedure TMyForm.Button_5Click(Sender: TObject);
begin
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,130,130);
Image1.Canvas.MoveTo(120,62);
Image1.Canvas.LineTo(127, 65);
Image1.Canvas.MoveTo(120, 68);
Image1.Canvas.LineTo(127, 65);
Image1.Canvas.MoveTo(0, 65);
Image1.Canvas.LineTo(130, 65);
Image1.Canvas.MoveTo(65, 0);
Image1.Canvas.LineTo(65, 130);
end;
procedure TMyForm.UpDown1ChangingEx(Sender: TObject;
var AllowChange: Boolean; NewValue: Smallint;
Direction: TUpDownDirection);
begin
if (Direction = updUP) and (strtoint(Edit2.Text) >= 0) then
Edit2.Text:=inttostr(strtoint(Edit2.Text)+1);
if (Direction = updDown) and (strtoint(Edit2.Text) > 0) then
Edit2.Text:=inttostr(strtoint(Edit2.Text)-1);
end;
procedure TMyForm.Button_2Click(Sender: TObject);
begin
Edit1.Text:=inttostr(strtoint(Edit2.Text)+strtoint(Edit1.Text));
Button_1Click(Sender);
end;
procedure TMyForm.Button_3Click(Sender: TObject);
begin
Edit1.Text:=inttostr(strtoint(Edit1.Text)-strtoint(Edit2.Text));
Button_1Click(Sender);
end;
procedure TMyForm.RadioGroup1Click(Sender: TObject);
begin
if (RadioGroup1.ItemIndex = 0) and (nazh = true) then
begin
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,130,130);
Image1.Canvas.Brush.Color:=c;
Angle.Draw;
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.MoveTo(120,62);
Image1.Canvas.LineTo(127, 65);
Image1.Canvas.MoveTo(120, 68);
Image1.Canvas.LineTo(127, 65);
Image1.Canvas.MoveTo(0, 65);
Image1.Canvas.LineTo(130, 65);
Image1.Canvas.MoveTo(65, 0);
Image1.Canvas.LineTo(65, 130);
end;
if (RadioGroup1.ItemIndex = 1) and (nazh2 = true) then
begin
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,130,130);
Image1.Canvas.Brush.Color:=c2;
Angle2.Draw;
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.MoveTo(120,62);
Image1.Canvas.LineTo(127, 65);
Image1.Canvas.MoveTo(120, 68);
Image1.Canvas.LineTo(127, 65);
Image1.Canvas.MoveTo(0, 65);
Image1.Canvas.LineTo(130, 65);
Image1.Canvas.MoveTo(65, 0);
Image1.Canvas.LineTo(65, 130);
end;
end;
end.
Скриншот незапущенной программы:
Скриншот запущенной программы: