home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2000 April
/
Chip_2000-04_cd.bin
/
zkuste
/
TPascal
/
OOPDEMOS.ARC
/
CARDS.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1989-05-02
|
2KB
|
136 lines
{ 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.