home *** CD-ROM | disk | FTP | other *** search
- {$R-,S-,I-,D-,T-,F-,V-,B-,N-,L+ }
- {$M 16384,0,655360 }
- Uses Lists, Crt;
-
- Type
- ItemRec = Record
- Size:Byte;
- Case _Type:(Number, Str) of
- Number : (Num:Real);
- Str : (St:String);
- End;
- CharSet = Set of Char;
-
-
-
-
- Procedure Menu(St:String; ReturnSet:CharSet; Var Ch:Char);
- Begin
- GotoXY(1,3); Write(St); ClrEol;
- Repeat
- Ch:=UpCase(ReadKey);
- Until Ch in ReturnSet;
- End;
-
- Function LocationMenu:Char;
- Var
- Ch : Char;
-
- Begin
- Menu('(C)urrent entry (F)irst entry (L)ast entry '+
- '(N)ext entry (P)rev entry', ['C','F','L','N','P',#27], Ch);
- LocationMenu:=Ch;
- End;
-
-
-
-
- Function GetNumOrStr(Var Item:ItemRec):Boolean;
- Procedure GetNumber(Var N:Real);
- Begin
- GotoXY(1,3); Write('Enter Number:'); ClrEol;
- Readln(N);
- End;
-
- Procedure GetString(Var S:String);
- Begin
- GotoXY(1,3); Write('Enter String:'); ClrEol;
- Readln(S);
- End;
-
- Var
- Ch : Char;
-
- Begin
- Menu('(N)umber or (S)tring',['N','S',#27],Ch);
- Case Ch of
- 'N' : Begin
- GetNumber(Item.Num);
- Item._Type:=Number;
- Item.Size:=SizeOf(Real)+1+1;
- {+1 for Item._Type, +1 for Item.Size}
- End;
- 'S' : Begin
- GetString(Item.St);
- Item._Type:=Str;
- Item.Size:=Length(Item.St)+1+1+1;
- {See above, and +1 to account for St[0] (length byte)}
- End;
- End;
- GetNumOrStr:=Not (Ch=#27);
- End;
-
-
- Procedure MoveToMenu(Var L:ListRec);
- Begin
- Case LocationMenu of
- 'F' : MoveToEntry(FirstEntry(L));
- 'L' : MoveToEntry(LastEntry(L));
- 'N' : MoveToEntry(NextEntry(CurrentEntry(L)));
- 'P' : MoveToEntry(PrevEntry(CurrentEntry(L)));
- 'C' : MoveToEntry(CurrentEntry(L));
- End;
- If L.C_Entry=nil Then Write(^G);
- End;
-
- Procedure DeleteMenu(Var L:ListRec);
- Var
- Ch : Char;
-
- Begin
- Menu('(L)ist deletion (I)tem deletion',['L','I',#27],Ch);
-
- Case Ch of
- 'L' : DeleteList(L);
- 'I' : Begin
- Case LocationMenu of
- 'C' : DeleteEntry(CurrentEntry(L));
- 'N' : DeleteEntry(NextEntry(CurrentEntry(L)));
- 'P' : DeleteEntry(PrevEntry(CurrentEntry(L)));
- 'F' : DeleteEntry(FirstEntry(L));
- 'L' : DeleteEntry(LastEntry(L));
- End;
- End;
- End;
- End;
-
- Procedure GetMenu(Var L:ListRec);
- Var
- Item : ItemRec;
- Ch : Char;
-
- Begin
- Ch:=LocationMenu;
- Case Ch of
- 'C' : GetItem(CurrentEntry(L), Item);
- 'N' : GetItem(NextEntry(CurrentEntry(L)), Item);
- 'P' : GetItem(PrevEntry(CurrentEntry(L)), Item);
- 'F' : GetItem(FirstEntry(L), Item);
- 'L' : GetItem(LastEntry(L), Item);
- End;
-
- If L.OK Then Begin
- If Not (Ch=#27) Then Begin
- GotoXY(1,3);
- Case Item._Type of
- Number : Write(Item.Num);
- Str : Write(Item.St);
- End;
- ClrEol;
- Delay(2000);
- End;
- End;
- End;
-
- Procedure DisplayList(L:ListRec; _CurrentEntry:EntryPtr);
- Var
- Item : ItemRec;
- I : Byte;
-
- Begin
- GotoXY(1,5);
-
- For I:=1 To 20 Do DelLine;
-
- MoveToEntry(FirstEntry(L));
- While L.OK Do Begin
- GetItem(CurrentEntry(L), Item);
-
- If CurrentEntry(L)=_CurrentEntry Then TextColor(White)
- Else TextColor(Black);
-
- Case Item._Type of
- Number : Write(Item.Num:1:9);
- Str : Write(Item.St);
- End;
- ClrEol;
- Writeln;
-
- MoveToEntry(NextEntry(CurrentEntry(L)));
- End;
- TextColor(Black);
- End;
-
-
-
- Var
- L : ListRec;
- Item : ItemRec;
- Ch : Char;
-
- Begin
- InitList(L);
-
- TextColor(Black); TextBackground(LightGray);
- ClrScr;
- Writeln('List Demo v3.0 - Demo for Lists.Tpu v3.0');
-
- Repeat
- GotoXY(1,4);
- If L.C_Entry=nil Then Write('List is unaccessed')
- Else
- If L.OK Then Write('List is fine')
- Else Write(^G,'Illegal operation');
- Write(' Memory available:',MemAvail);
- ClrEol;
-
- L.OK:=True;
-
- DisplayList(L, CurrentEntry(L));
-
- Menu('(A)dd entry (I)nsert entry (M)ove to '+
- '(D)elete (G)et item (Q)uit',['A','I','M','D','G','Q'],Ch);
-
- Case Ch of
- 'A' : If GetNumOrStr(Item) Then AddEntry(L, Item, Item.Size);
- 'I' : If GetNumOrStr(Item) Then Begin
- Case LocationMenu of
- 'C' : InsertEntry(CurrentEntry(L), Item, Item.Size);
- 'N' : InsertEntry(NextEntry(CurrentEntry(L)), Item, Item.Size);
- 'P' : InsertEntry(PrevEntry(CurrentEntry(L)),Item, Item.Size);
- 'F' : InsertEntry(FirstEntry(L), Item, Item.Size);
- 'L' : InsertEntry(LastEntry(L), Item, Item.Size);
- End;
- End;
- 'D' : DeleteMenu(L);
- 'G' : GetMenu(L);
- 'M' : Begin
- Menu('(T)o entry (E)ntry',['T','E',#27],Ch);
- Case Ch of
- 'T' : MoveToMenu(L);
- 'E' : Case LocationMenu of
- 'F' : MoveEntry(CurrentEntry(L), FirstEntry(L));
- 'L' : MoveEntry(CurrentEntry(L), LastEntry(L));
- 'P' : MoveEntry(CurrentEntry(L), PrevEntry(CurrentEntry(L)));
- 'N' : MoveEntry(CurrentEntry(L), NextEntry(CurrentEntry(L)));
- End;
- End;
- If L.C_Entry=nil Then Write(^G);
- End;
- End;
- Until Ch='Q';
- End.