{ 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.