home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
MODEMS
/
MODEM
/
PC-PSUIT.LBR
/
MENU.PQS
/
MENU.PAS
Wrap
Pascal/Delphi Source File
|
2000-06-30
|
4KB
|
97 lines
{ Used by Menu procedure to highlight menu choice. }
Procedure Select(x,y : Integer; choice : Str80);
Begin
GotoXY(x,y); NormVideo; InVideo(1);
Write(choice);
End;
{ Used by Menu procedure to un-highlight menu choice. }
Procedure DeSelect(x,y : Integer; choice : Str80);
Begin
GotoXY(x,y); InVideo(0); LowVideo;
Write(choice);
End;
{ Pass this function a number equal to the number of menu choices you
want and an array of strings of 40 or less characters each. It will
clear the screen and build the menu for you. Each choice is highlighted
as you move down the menu with the space bar, up with the back-space.
Pressing the first letter of a menu choice moves you to the first choice
that starts with the same letter. Uses the above four procedures to
put instructions in status line.
example: const maxlines = 5;
lines: Array[0..maxlines] Of String[40] =
(' General Business Menu', <-- menu title
/ ' Accounts Payable', <-- first choice
| ' Accounts Recievable ', <-- second choice
(Note leading space)-| ' Payroll', ^ <-- third choice
| ' General Ledger', | <-- fourth choice
\ ' Exit Program'); | <-- fifth choice
var Choice : Integer; |
begin +------- trailing space
Choice := menu(maxlines,lines); <-- Choice will equal 1 -> 5
end. }
Function menu (number : Integer; Var data) : Integer;
Type listtype = Array[0..16] Of String[40];
Var list : listtype Absolute data;
total_len, ave_len, max_len, col, cur_choice, i : Byte;
chr : Char;
Top : integer;
Begin
total_len := 0; max_len := 0;
For i := 1 To number Do
Begin
If Length(list[i]) > max_len then max_len := Length(list[i])
End;
col := (80 - max_len + 2) Div 2;
For i := 1 To number Do
Begin
list[i] := list[i] + copy(Spaces,1,max_len - Length(list[i]));
End;
Top := (21 - number) div 2;
ClrScr; Draw_Status_Border;
Write_Status('(Space) = Down, (Back-Space) = Up, (First Letter) to Find, (Return) to Select');
GotoXY(((80 - Length(list[0])) Div 2),Top); Write(list[0]); LowVideo;
For i := 1 To number Do
Begin
GotoXY(col,i + Top + 1); Write(list[i]);
End;
GotoXY(col,Top + 2); NormVideo; InVideo(1);
cur_choice := 1; Write(list[1]);
repeat
Read(Kbd,Chr);
Case Chr Of
#08 : Begin
DeSelect(col, Top + 1 + cur_choice, list[cur_choice]);
cur_choice := cur_Choice - 1;
If cur_choice = 0 Then cur_choice := number;
Select(col, Top + 1 + cur_choice, list[cur_choice]);
End;
#32 : Begin
DeSelect(col, Top + 1 + cur_choice, list[cur_choice]);
cur_choice := cur_choice + 1;
If cur_choice > number Then cur_choice := 1;
Select(col, Top + 1 + cur_choice, list[cur_choice]);
End;
#13 : menu := cur_choice;
Else Begin
DeSelect(col, Top + 1 + cur_choice, list[cur_choice]);
i := cur_choice;
chr := UpCase(chr);
Repeat
i := succ(i);
If i > number Then i := 1
Until (i = cur_choice) Or (chr = UpCase(Copy(list[i],2,1)));
cur_choice:=i;
Select(col, Top + 1 + cur_choice, list[cur_choice]);
End;
End;
until Chr = #13;
InVideo(0); Cursor_on;
End;