212 lines
5.1 KiB
Plaintext
212 lines
5.1 KiB
Plaintext
|
|
||
|
{ Turbo List }
|
||
|
{ Copyright (c) 1989,90 by Borland International, Inc. }
|
||
|
|
||
|
program ListDemo;
|
||
|
{ From Chapter 4 the Turbo Pascal 6.0 User's Guide.
|
||
|
Dynamic objects & destructors.
|
||
|
|
||
|
If you are running this program in the IDE, be sure to enable
|
||
|
the full graphics save option when you load TURBO.EXE:
|
||
|
|
||
|
turbo -g
|
||
|
|
||
|
This ensures that the IDE fully swaps video RAM and keeps
|
||
|
"dustclouds" from appearing on the user screen when in
|
||
|
graphics mode. You can enable this option permanently
|
||
|
via the Options|Environment|Startup dialog.
|
||
|
|
||
|
This program uses the Graph unit and its .BGI driver files to
|
||
|
display graphics on your system. The "PathToDrivers"
|
||
|
constant defined below is set to \TP\BGI, which is the default
|
||
|
location of the BGI files as installed by the INSTALL program.
|
||
|
If you have installed these files in a different location, make
|
||
|
sure the .BGI file for your system (EGAVGA.BGI, etc.) is in the
|
||
|
current directory or modify the "PathToDrivers" constant
|
||
|
accordingly.
|
||
|
}
|
||
|
|
||
|
uses Graph, Figures;
|
||
|
|
||
|
const
|
||
|
PathToDrivers = '\TP\BGI'; { Default location of *.BGI files }
|
||
|
|
||
|
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 BGI determine which board you're using: }
|
||
|
DetectGraph(GraphDriver, GraphMode);
|
||
|
InitGraph(GraphDriver, GraphMode, PathToDrivers);
|
||
|
if GraphResult <> GrOK then
|
||
|
begin
|
||
|
Writeln(GraphErrorMsg(GraphDriver));
|
||
|
if GraphDriver = grFileNotFound then
|
||
|
begin
|
||
|
Writeln('in ', PathToDrivers,
|
||
|
'. Modify this program''s "PathToDrivers"');
|
||
|
Writeln('constant to specify the actual location of this file.');
|
||
|
Writeln;
|
||
|
end;
|
||
|
Writeln('Press Enter...');
|
||
|
Readln;
|
||
|
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.
|