136 lines
2.4 KiB
Plaintext
136 lines
2.4 KiB
Plaintext
|
|
|||
|
{ 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.
|
|||
|
|