dos_compilers/Borland Turbo Pascal v55/CARDS.PAS

136 lines
2.4 KiB
Plaintext
Raw Permalink Normal View History

2024-07-02 15:49:04 +02:00
{ Turbo Cards }
{ Copyright (c) 1989 by Borland International, Inc. }
unit Cards;
{ Turbo Pascal 5.5 object-oriented example.
This unit defines a Rolodex-like database of cards.
Refer to OOPDEMOS.DOC for an overview of this unit.
}
{$S-}
interface
uses Objects;
type
CardNodePtr = ^CardNode;
CardNode = record
Next: CardNodePtr;
Prev: CardNodePtr;
Data: record end;
end;
CardListPtr = ^CardList;
CardList = object(Base)
Current: CardNodePtr;
Count, DataSize: Integer;
constructor Init(PDataSize: Integer);
constructor Load(var S: Stream);
destructor Done; virtual;
function CardData: Pointer;
procedure Delete;
procedure Insert;
procedure Next;
procedure Prev;
procedure Store(var S: Stream);
end;
implementation
constructor CardList.Init(PDataSize: Integer);
begin
Current := nil;
Count := 0;
DataSize := PDataSize;
end;
constructor CardList.Load(var S: Stream);
var
I, N: Integer;
begin
Current := nil;
Count := 0;
S.Read(N, SizeOf(Integer));
S.Read(DataSize, SizeOf(Integer));
for I := 1 to N do
begin
Insert;
S.Read(Current^.Data, DataSize);
end;
Next;
end;
destructor CardList.Done;
var
I: Integer;
begin
for I := 1 to Count do Delete;
end;
function CardList.CardData: Pointer;
begin
CardData := @Current^.Data;
end;
procedure CardList.Delete;
var
N: CardNodePtr;
begin
Dec(Count);
N := Current;
if Count = 0 then Current := nil else
begin
Current := N^.Prev;
Current^.Next := N^.Next;
N^.Next^.Prev := Current;
end;
FreeMem(N, DataSize + SizeOf(CardNode));
end;
procedure CardList.Insert;
var
N: CardNodePtr;
begin
GetMem(N, DataSize + SizeOf(CardNode));
if Count = 0 then
begin
N^.Next := N;
N^.Prev := N;
end else
begin
N^.Next := Current^.Next;
Current^.Next^.Prev := N;
N^.Prev := Current;
Current^.Next := N;
end;
Current := N;
Inc(Count);
end;
procedure CardList.Next;
begin
if Current <> nil then Current := Current^.Next;
end;
procedure CardList.Prev;
begin
if Current <> nil then Current := Current^.Prev;
end;
procedure CardList.Store(var S: Stream);
var
I: Integer;
begin
S.Write(Count, SizeOf(Integer) * 2);
for I := 1 to Count do
begin
S.Write(Current^.Data, DataSize);
Next;
end;
end;
end.