Лабораторная работа № 5
Задание: позднее связывание.
Модифицировать программу из лабораторной работы № 4 таким образом, чтобы в ней поддерживался механизм позднего связывания. Кроме того, необходимо реализовать автоматическое движение объектов на экране влево/вправо/вверх/вниз.
Задания аналогичны заданиям в работе № 4.
Код программы:
Unit1:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, unit2, StdCtrls, ExtCtrls, Buttons;
type
TFormDraw = class(TForm)
Panel1: TPanel;
BitBlueRou: TBitBtn;
BitBlSq: TBitBtn;
BitWhSq: TBitBtn;
BitRedCir: TBitBtn;
BitWhCir: TBitBtn;
BitRedRou: TBitBtn;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure onClick(Sender: TObject);
procedure Cleanarea;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormDraw: TFormDraw;
MyCurrent:TDrawArea;
NOfButton:integer;
implementation
{$R *.dfm}
procedure TFormDraw.Cleanarea;
begin
Application.MainForm.Canvas.Pen.color:=clbtnface;
Application.MainForm.Canvas.Brush.color:=clbtnface;
Application.MainForm.Canvas.Rectangle(0,0,500,500);
end;
procedure TFormDraw.FormCreate(Sender: TObject);
begin
FormDraw.Canvas.Pen.Width:=1;
BitRedRou.Glyph.Canvas.Pen.Color:=clblue;
BitRedRou.Glyph.Canvas.Brush.Color:=clred;
BitRedRou.Glyph.Canvas.RoundRect(1,1,17,17,2,2);
BitBlueRou.Glyph.Canvas.Pen.Color:=clred;
BitBlueRou.Glyph.Canvas.Brush.Color:=clblue;
BitBlueRou.Glyph.Canvas.RoundRect(1,1,17,17,2,2);
BitBlSq.Glyph.Canvas.Pen.Color:=clwhite;
BitBlSq.Glyph.Canvas.Brush.Color:=clblack;
BitBlSq.Glyph.Canvas.Rectangle(1,1,17,17);
BitWhSq.Glyph.Canvas.Pen.Color:=clblack;
BitWhSq.Glyph.Canvas.Brush.Color:=clwhite;
BitWhSq.Glyph.Canvas.Rectangle(1,1,17,17);
BitRedCir.Glyph.Canvas.Pen.Color:=clblue;
BitRedCir.Glyph.Canvas.Brush.Color:=clred;
BitRedCir.Glyph.Canvas.Ellipse(1,1,17,17);
BitWhCir.Glyph.Canvas.Pen.Color:=clblack;
BitWhCir.Glyph.Canvas.Brush.Color:=clwhite;
BitWhCir.Glyph.Canvas.Ellipse(1,1,17,17);
end;
procedure TFormDraw.onClick(Sender: TObject);
begin
MyCurrent.Free;
Cleanarea;
NOfButton:=(Sender as TBitbtn).Tag;
case NOfButton of
1,2: MyCurrent:=TRoundRect.Create;
3,4: MyCurrent:=TSquare.Create;
5,6: MyCurrent:=TCircle.Create;
end;
case NOfButton of
1,5: MyCurrent.RedBrush;
2 : MyCurrent.BlueBrush;
3 : MyCurrent.BlackBrush;
4,6: MyCurrent.WhiteBrush;
end;
MyCurrent.direction:= random(4);
MyCurrent.DrawIT;
Timer1.Enabled:= true;
end;
procedure TFormDraw.Timer1Timer(Sender: TObject);
begin
if MyCurrent.direction = 0 then
begin
MyCurrent.Clean;
MyCurrent.x1:= MyCurrent.x1 + 5;
MyCurrent.x2:= MyCurrent.x2 + 5;
MyCurrent.DrawIT;
end
else if MyCurrent.direction = 1 then
begin
MyCurrent.Clean;
MyCurrent.x1:= MyCurrent.x1 - 5;
MyCurrent.x2:= MyCurrent.x2 - 5;
MyCurrent.DrawIT;
end
else if MyCurrent.direction = 2 then
begin
MyCurrent.Clean;
MyCurrent.y2:= MyCurrent.y2 + 5;
MyCurrent.y1:= MyCurrent.y1 + 5;
MyCurrent.DrawIT;
end
else if MyCurrent.direction = 3 then
begin
MyCurrent.Clean;
MyCurrent.y2:= MyCurrent.y2 - 5;
MyCurrent.y1:= MyCurrent.y1 - 5;
MyCurrent.DrawIT;
end;
end;
end.
Unit2:
unit Unit2;
interface
uses Forms, graphics;
type TDrawArea=class(TObject)
procedure WhiteBrush;
procedure BlueBrush;
procedure BlackBrush;
procedure RedBrush;
procedure DrawIt; virtual; abstract;
procedure Clean;
constructor Create;
public
direction, x1, y1, x2, y2: integer;
penCol, brushCol: TColor;
end;
type TSquare=class(TDrawArea)
procedure DrawIT; override;
end;
type TCircle=class(TDrawArea)
procedure DrawIT; override;
end;
type TRoundRect=class(TDrawArea)
procedure DrawIT; override;
end;
implementation
constructor TDrawArea.Create;
begin
inherited create;
x1:= 250;
x2:= 140;
y1:= 250;
y2:= 110;
end;
procedure TDrawArea.WhiteBrush;
begin
Application.MainForm.Canvas.Pen.Color:=clblack;
Application.MainForm.Canvas.Brush.Color:=clwhite;
penCol:= clblack;
brushCol:= clwhite;
end;
procedure TDrawArea.BlackBrush;
begin
Application.MainForm.Canvas.Pen.Color:=clwhite;
Application.MainForm.Canvas.Brush.Color:=clblack;
penCol:= clwhite;
brushCol:= clblack;
end;
procedure TDrawArea.BlueBrush;
begin
Application.MainForm.Canvas.Pen.Color:=clred;
Application.MainForm.Canvas.Brush.Color:=clblue;
penCol:= clred;
brushCol:= clblue;
end;
procedure TDrawArea.RedBrush;
begin
Application.MainForm.Canvas.Pen.Color:=clblue;
Application.MainForm.Canvas.Brush.Color:=clred;
penCol:= clblue;
brushCol:= clred;
end;
procedure TSquare.DrawIT;
begin
Application.MainForm.Canvas.Rectangle(x1,y1,x2,y2);
end;
procedure TCircle.DrawIT;
begin
Application.MainForm.Canvas.Ellipse(x1,y1,x2,y2);
end;
procedure TRoundRect.DrawIT;
begin
Application.MainForm.Canvas.RoundRect(x1,y1,x2,y2,10,10);
end;
procedure TDrawArea.Clean;
begin
Application.MainForm.Canvas.Brush.Color:= clBtnFace;
Application.MainForm.Canvas.Pen.Color:= clBtnFace;
Application.MainForm.Canvas.Rectangle(x1,y1,x2,y2);
Application.MainForm.Canvas.Brush.Color:= brushCol;
Application.MainForm.Canvas.Pen.Color:= penCol;
end;
end.
Скриншот незапущенной программы:
Скриншот запущенной программы: