home *** CD-ROM | disk | FTP | other *** search
- {$R-,S-,I-,D-,T-,F-,V-,B-,N-,L+ }
- {$M 16384,0,655360 }
-
- {*****************************************************************************
- Please excuse the messy code.
-
- This demo was a last minute suggestion by my father and I just whipped it
- up very quickly.
-
- I hope it clarifies some of the routines
-
- Mark Addleman
- [72777, 740]
- *****************************************************************************}
-
- Uses Lists, Crt;
-
- Type
- ItemRec = Record
- Size:Byte;
- Case _Type:(Number, Str) of
- Number : (Num:Real);
- Str : (St:String);
- End;
-
- CharSet = Set of Char;
-
- Var
- LastY : Byte;
-
- 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 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 MoveMenu(Var L:ListRec);
- Var
- Ch : Char;
-
- Begin
- Menu('(F)irst item (L)ast item (N)ext item (P)rev item',
- ['F','L','N','P',#27], Ch);
-
- Case Ch of
- 'F' : MoveToItem(L, FirstItem(L));
- 'L' : MoveToItem(L, LastItem(L));
- 'N' : MoveToItem(L, NextItem(CurrentItem(L)));
- 'P' : MoveToItem(L, PrevItem(CurrentItem(L)));
- End
- 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
- Menu('(C)urrent item (N)ext item '+
- '(P)rev item (F)irst item (L)ast item',
- ['C','N','P','F','L',#27],Ch);
- Case Ch of
- 'C' : DeleteItem(L, CurrentItem(L));
- 'N' : DeleteItem(L, NextItem(CurrentItem(L)));
- 'P' : DeleteItem(L, PrevItem(CurrentItem(L)));
- 'F' : DeleteItem(L, FirstItem(L));
- 'L' : DeleteItem(L, LastItem(L));
- End;
- End;
- End;
- End;
-
- Procedure GetMenu(Var L:ListRec);
- Var
- Ch : Char;
- Item : ItemRec;
-
- Begin
- Menu('(C)urrent item (N)ext item (P)rev item '+
- '(F)irst item (L)ast item',['C','N','P','F','L',#27],Ch);
-
- Case Ch of
- 'C' : GetItem(L, CurrentItem(L), Item);
- 'N' : GetItem(L, NextItem(CurrentItem(L)), Item);
- 'P' : GetItem(L, PrevItem(CurrentItem(L)), Item);
- 'F' : GetItem(L, FirstItem(L), Item);
- 'L' : GetItem(L, LastItem(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; _CurrentItem:Pointer);
- Var
- Item : ItemRec;
- I : Byte;
-
- Begin
- GotoXY(1,5);
-
- For I:=1 To 20 Do DelLine;
-
- MoveToItem(L, FirstItem(L));
- While L.OK Do Begin
- GetItem(L, CurrentItem(L), Item);
-
- If CurrentItem(L)=_CurrentItem Then TextColor(Green)
- Else TextColor(Black);
-
- Case Item._Type of
- Number : Write(Item.Num:1:9);
- Str : Write(Item.St);
- End;
- ClrEol;
- Writeln;
-
- MoveToItem(L, NextItem(CurrentItem(L)));
- End;
- TextColor(Black);
- End;
-
-
-
- Var
- L : ListRec;
- Item : ItemRec;
- Ch : Char;
-
- Begin
- LastY:=5;
- InitList(L);
-
- TextColor(Black); TextBackground(LightGray);
- ClrScr;
- Writeln('List Demo v2.0 - Demo for Lists.Tpu v2.0');
-
- Repeat
- GotoXY(1,4);
- If L.OK Then Write('List is fine')
- Else Write(^G,'Illegal operation');
- Write(' Memory available:',MemAvail);
- ClrEol;
-
- L.OK:=True;
-
- DisplayList(L, CurrentItem(L));
-
- Menu('(A)dd item (I)nsert item (M)ove to '+
- '(D)elete (G)et item (Q)uit',['A','I','M','D','G','Q'],Ch);
-
- Case Ch of
- 'A' : Begin
- If GetNumOrStr(Item) Then
- AddItem(L, Item, Item.Size);
- End;
- 'I' : If GetNumOrStr(Item) Then Begin
- Menu('(C)urrent item (N)ext item (P)rev item '+
- '(F)irst item (L)ast item',
- ['C','N','P','F','L',#27],Ch);
-
- Case Ch of
- 'C' : InsertItem(L, Item, Item.Size,
- CurrentItem(L));
- 'N' : InsertItem(L, Item, Item.Size,
- NextItem(CurrentItem(L)));
- 'P' : InsertItem(L, Item, Item.Size,
- PrevItem(CurrentItem(L)));
- 'F' : InsertItem(L, Item, Item.Size,
- FirstItem(L));
- 'L' : InsertItem(L, Item, Item.Size,
- LastItem(L));
- End;
- End;
- 'D' : DeleteMenu(L);
- 'G' : GetMenu(L);
- 'M' : MoveMenu(L);
- End;
- Until Ch='Q';
- End.