187 lines
4.1 KiB
Plaintext
187 lines
4.1 KiB
Plaintext
|
||
{ Turbo List }
|
||
{ Copyright (c) 1989 by Borland Interational, Inc. }
|
||
|
||
program ListDemo;
|
||
{ From P-57 of the Object-Oriented Programming Guide.
|
||
Dynamic objects & destructors.
|
||
}
|
||
|
||
uses Graph, Figures;
|
||
|
||
type
|
||
ArcPtr = ^Arc;
|
||
Arc = object(Circle)
|
||
StartAngle, EndAngle : Integer;
|
||
constructor Init(InitX, InitY : Integer;
|
||
InitRadius : Integer;
|
||
InitStartAngle, InitEndAngle : Integer);
|
||
procedure Show; virtual;
|
||
procedure Hide; virtual;
|
||
end;
|
||
|
||
NodePtr = ^Node;
|
||
Node = record
|
||
Item : PointPtr;
|
||
Next : NodePtr;
|
||
end;
|
||
|
||
ListPtr = ^List;
|
||
List = object
|
||
Nodes: NodePtr;
|
||
constructor Init;
|
||
destructor Done; virtual;
|
||
procedure Add(Item : PointPtr);
|
||
procedure Report;
|
||
end;
|
||
|
||
var
|
||
GraphDriver : Integer;
|
||
GraphMode : Integer;
|
||
Temp : String;
|
||
AList : List;
|
||
PArc : ArcPtr;
|
||
PCircle : CirclePtr;
|
||
RootNode : NodePtr;
|
||
|
||
|
||
{--------------------------------------------------------}
|
||
{ Procedures that are not methods: }
|
||
{--------------------------------------------------------}
|
||
|
||
procedure OutTextLn(TheText : String);
|
||
begin
|
||
OutText(TheText);
|
||
MoveTo(0, GetY+12);
|
||
end;
|
||
|
||
|
||
procedure HeapStatus(StatusMessage : String);
|
||
begin
|
||
Str(MemAvail : 6, Temp);
|
||
OutTextLn(StatusMessage+Temp);
|
||
end;
|
||
|
||
|
||
{--------------------------------------------------------}
|
||
{ Arc's method implementations: }
|
||
{--------------------------------------------------------}
|
||
|
||
constructor Arc.Init(InitX, InitY : Integer;
|
||
InitRadius : Integer;
|
||
InitStartAngle, InitEndAngle : Integer);
|
||
|
||
begin
|
||
Circle.Init(InitX, InitY, InitRadius);
|
||
StartAngle := InitStartAngle;
|
||
EndAngle := InitEndAngle;
|
||
end;
|
||
|
||
procedure Arc.Show;
|
||
begin
|
||
Visible := True;
|
||
Graph.Arc(X, Y, StartAngle, EndAngle, Radius);
|
||
end;
|
||
|
||
procedure Arc.Hide;
|
||
var
|
||
TempColor : Word;
|
||
begin
|
||
TempColor := Graph.GetColor;
|
||
Graph.SetColor(GetBkColor);
|
||
Visible := False;
|
||
Graph.Arc(X, Y, StartAngle, EndAngle, Radius);
|
||
SetColor(TempColor);
|
||
end;
|
||
|
||
|
||
{--------------------------------------------------------}
|
||
{ List's method implementations: }
|
||
{--------------------------------------------------------}
|
||
|
||
constructor List.Init;
|
||
begin
|
||
Nodes := nil;
|
||
end;
|
||
|
||
destructor List.Done;
|
||
var
|
||
N : NodePtr;
|
||
begin
|
||
while Nodes <> nil do
|
||
begin
|
||
N := Nodes;
|
||
Nodes := N^.Next;
|
||
Dispose(N^.Item, Done);
|
||
Dispose(N);
|
||
end;
|
||
end;
|
||
|
||
|
||
procedure List.Add(Item : PointPtr);
|
||
var
|
||
N : NodePtr;
|
||
begin
|
||
New(N);
|
||
N^.Item := Item;
|
||
N^.Next := Nodes;
|
||
Nodes := N;
|
||
end;
|
||
|
||
procedure List.Report;
|
||
var
|
||
Current : NodePtr;
|
||
begin
|
||
Current := Nodes;
|
||
while Current <> nil do
|
||
begin
|
||
Str(Current^.Item^.GetX : 3, Temp);
|
||
OutTextLn('X = '+Temp);
|
||
Str(Current^.Item^.GetY : 3, Temp);
|
||
OutTextLn('Y = '+Temp);
|
||
Current := Current^.Next;
|
||
end;
|
||
end;
|
||
|
||
|
||
{--------------------------------------------------------}
|
||
{ Main program: }
|
||
{--------------------------------------------------------}
|
||
|
||
begin
|
||
{ Let the BGI determine what board you're using: }
|
||
DetectGraph(GraphDriver, GraphMode);
|
||
InitGraph(GraphDriver, GraphMode,'');
|
||
if GraphResult <> GrOK then
|
||
begin
|
||
WriteLn('>>Halted on graphics error: ',
|
||
GraphErrorMsg(GraphDriver));
|
||
Halt(1);
|
||
end;
|
||
|
||
HeapStatus('Heap space before list is allocated: ');
|
||
|
||
{ Create a list }
|
||
AList.Init;
|
||
|
||
{ Now create and add several figures to it in one operation }
|
||
AList.Add(New(ArcPtr, Init(151, 82, 25, 200, 330)));
|
||
AList.Add(New(CirclePtr, Init(400, 100, 40)));
|
||
AList.Add(New(CirclePtr, Init(305, 136, 5)));
|
||
|
||
{ Traverse the list and display X,Y of the list's figures }
|
||
AList.Report;
|
||
|
||
HeapStatus('Heap space after list is allocated ');
|
||
|
||
{ Deallocate the whole list with one destructor call }
|
||
AList.Done;
|
||
|
||
HeapStatus('Heap space after list is cleaned up: ');
|
||
|
||
OutText('Press Enter to end program: ');
|
||
Readln;
|
||
|
||
CloseGraph;
|
||
end.
|
||
|