201 lines
4.7 KiB
Plaintext
201 lines
4.7 KiB
Plaintext
|
|
|||
|
{ Turbo Figures }
|
|||
|
{ Copyright (c) 1989 by Borland Interational, Inc. }
|
|||
|
|
|||
|
unit Figures;
|
|||
|
{ From P-42 of the Object-Oriented Programming Guide.
|
|||
|
Virtual methods & polymorphic objects.
|
|||
|
}
|
|||
|
|
|||
|
interface
|
|||
|
|
|||
|
uses Graph, Crt;
|
|||
|
|
|||
|
type
|
|||
|
Location = object
|
|||
|
X,Y : Integer;
|
|||
|
procedure Init(InitX, InitY : Integer);
|
|||
|
function GetX : Integer;
|
|||
|
function GetY : Integer;
|
|||
|
end;
|
|||
|
|
|||
|
PointPtr = ^Point;
|
|||
|
|
|||
|
Point = object (Location)
|
|||
|
Visible : Boolean;
|
|||
|
constructor Init(InitX, InitY : Integer);
|
|||
|
destructor Done; virtual;
|
|||
|
procedure Show; virtual;
|
|||
|
procedure Hide; virtual;
|
|||
|
function IsVisible : Boolean;
|
|||
|
procedure MoveTo(NewX, NewY : Integer);
|
|||
|
procedure Drag(DragBy : Integer); virtual;
|
|||
|
end;
|
|||
|
|
|||
|
CirclePtr = ^Circle;
|
|||
|
|
|||
|
Circle = object (Point)
|
|||
|
Radius : Integer;
|
|||
|
constructor Init(InitX, InitY : Integer;
|
|||
|
InitRadius : Integer);
|
|||
|
procedure Show; virtual;
|
|||
|
procedure Hide; virtual;
|
|||
|
procedure Expand(ExpandBy : Integer); virtual;
|
|||
|
procedure Contract(ContractBy : Integer); virtual;
|
|||
|
end;
|
|||
|
|
|||
|
implementation
|
|||
|
|
|||
|
{--------------------------------------------------------}
|
|||
|
{ Location's method implementations: }
|
|||
|
{--------------------------------------------------------}
|
|||
|
|
|||
|
procedure Location.Init(InitX, InitY : Integer);
|
|||
|
|
|||
|
begin
|
|||
|
X := InitX;
|
|||
|
Y := InitY;
|
|||
|
end;
|
|||
|
|
|||
|
function Location.GetX : Integer;
|
|||
|
begin
|
|||
|
GetX := X;
|
|||
|
end;
|
|||
|
|
|||
|
function Location.GetY : Integer;
|
|||
|
begin
|
|||
|
GetY := Y;
|
|||
|
end;
|
|||
|
|
|||
|
|
|||
|
{--------------------------------------------------------}
|
|||
|
{ Points's method implementations: }
|
|||
|
{--------------------------------------------------------}
|
|||
|
|
|||
|
constructor Point.Init(InitX, InitY : Integer);
|
|||
|
begin
|
|||
|
Location.Init(InitX, InitY);
|
|||
|
Visible := False;
|
|||
|
end;
|
|||
|
|
|||
|
destructor Point.Done;
|
|||
|
begin
|
|||
|
Hide;
|
|||
|
end;
|
|||
|
|
|||
|
procedure Point.Show;
|
|||
|
begin
|
|||
|
Visible := True;
|
|||
|
PutPixel(X, Y, GetColor);
|
|||
|
end;
|
|||
|
|
|||
|
procedure Point.Hide;
|
|||
|
begin
|
|||
|
Visible := False;
|
|||
|
PutPixel(X, Y, GetBkColor);
|
|||
|
end;
|
|||
|
|
|||
|
function Point.IsVisible : Boolean;
|
|||
|
begin
|
|||
|
IsVisible := Visible;
|
|||
|
end;
|
|||
|
|
|||
|
procedure Point.MoveTo(NewX, NewY : Integer);
|
|||
|
begin
|
|||
|
Hide;
|
|||
|
X := NewX;
|
|||
|
Y := NewY;
|
|||
|
Show;
|
|||
|
end;
|
|||
|
|
|||
|
function GetDelta(var DeltaX : Integer;
|
|||
|
var DeltaY : Integer) : Boolean;
|
|||
|
var
|
|||
|
KeyChar : Char;
|
|||
|
Quit : Boolean;
|
|||
|
begin
|
|||
|
DeltaX := 0; DeltaY := 0; { 0 means no change in position; }
|
|||
|
GetDelta := True; { True means we return a delta }
|
|||
|
repeat
|
|||
|
KeyChar := ReadKey; { First, read the keystroke }
|
|||
|
Quit := True; { Assume it's a useable key }
|
|||
|
case Ord(KeyChar) of
|
|||
|
0: begin { 0 means an extended, 2-byte code }
|
|||
|
KeyChar := ReadKey; { Read second byte of code }
|
|||
|
case Ord(KeyChar) of
|
|||
|
72: DeltaY := -1; { Up arrow; decrement Y }
|
|||
|
80: DeltaY := 1; { Down arrow; increment Y }
|
|||
|
75: DeltaX := -1; { Left arrow; decrement X }
|
|||
|
77: DeltaX := 1; { Right arrow; increment X }
|
|||
|
else Quit := False; { Ignore any other code }
|
|||
|
end; { case }
|
|||
|
end;
|
|||
|
13: GetDelta := False; { CR pressed means no delta }
|
|||
|
else Quit := False; { Ignore any other keystroke }
|
|||
|
end; { case }
|
|||
|
until Quit;
|
|||
|
end;
|
|||
|
|
|||
|
procedure Point.Drag(DragBy : Integer);
|
|||
|
var
|
|||
|
DeltaX, DeltaY : Integer;
|
|||
|
FigureX, FigureY : Integer;
|
|||
|
begin
|
|||
|
Show; { Display figure to be dragged }
|
|||
|
FigureX := GetX; { Get the initial position of figure }
|
|||
|
FigureY := GetY;
|
|||
|
|
|||
|
{ This is the drag loop : }
|
|||
|
while GetDelta(DeltaX, DeltaY) do
|
|||
|
begin { Apply delta to figure X,Y: }
|
|||
|
FigureX := FigureX + (DeltaX * DragBy);
|
|||
|
FigureY := FigureY + (DeltaY * DragBy);
|
|||
|
MoveTo(FigureX, FigureY); { And tell the figure to move }
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
{--------------------------------------------------------}
|
|||
|
{ Circle's method implementations: }
|
|||
|
{--------------------------------------------------------}
|
|||
|
|
|||
|
constructor Circle.Init(InitX, InitY : Integer;
|
|||
|
InitRadius : Integer);
|
|||
|
begin
|
|||
|
Point.Init(InitX, InitY);
|
|||
|
Radius := InitRadius;
|
|||
|
end;
|
|||
|
|
|||
|
procedure Circle.Show;
|
|||
|
begin
|
|||
|
Visible := True;
|
|||
|
Graph.Circle(X, Y, Radius);
|
|||
|
end;
|
|||
|
|
|||
|
procedure Circle.Hide;
|
|||
|
var
|
|||
|
TempColor : Word;
|
|||
|
begin
|
|||
|
TempColor := Graph.GetColor;
|
|||
|
Graph.SetColor(GetBkColor);
|
|||
|
Visible := False;
|
|||
|
Graph.Circle(X, Y, Radius);
|
|||
|
Graph.SetColor(TempColor);
|
|||
|
end;
|
|||
|
|
|||
|
procedure Circle.Expand(ExpandBy : Integer);
|
|||
|
begin
|
|||
|
Hide;
|
|||
|
Radius := Radius + ExpandBy;
|
|||
|
if Radius <0 then Radius := 0;
|
|||
|
Show;
|
|||
|
end;
|
|||
|
|
|||
|
procedure Circle.Contract(ContractBy : Integer);
|
|||
|
begin
|
|||
|
Expand(-ContractBy);
|
|||
|
end;
|
|||
|
|
|||
|
{ No initialization section }
|
|||
|
|
|||
|
end.
|
|||
|
|