[Back to MENU SWAG index] [Back to Main SWAG index] [Original]
{ NMENU.PAS - 8/25/96 by Brandon Sneed (Nivenh) }
{ Use it and abuse it and don't give me credit if you don't want too. }
{ example of use at the end !! }
unit nmenu;
interface
uses crt;
type
menurec = record
text : string[30]; { description }
xpos, { X coord }
ypos : byte; { Y coord }
key : char; { hot key }
end;
function domenu(var menu; numitems, start, highclr, loclr : byte) : byte;
{ the MENU param must be untyped since we'll be passing an array to it }
{ menu = menu array constant }
{ numitems = number of items in the menu array }
{ start = which item should be highlighted by default? usually 1 }
{ highclr = color to highlight with }
{ loclr = color to deselect with }
implementation
function domenu(var menu; numitems, start, highclr, loclr : byte) : byte;
type
{ Increase the size of this array for more than 25 menu items }
menucast = array [1..25] of menurec;
var
cnt : byte;
choice : byte;
getkey : char;
begin
if start > numitems then start := 1;
begin
{ draw the menu }
for cnt := 1 to numitems do
with menucast(menu)[cnt] do
begin
textattr := loclr;
gotoxy(xpos, ypos);
write(text);
end;
end;
getkey := #255;
choice := start;
repeat
if (choice <= numitems) and (choice > 0) then
with menucast(menu)[choice] do
begin
textattr := highclr;
gotoxy(xpos, ypos);
write(text);
textattr := loclr;
if keypressed then
getkey := readkey;
{ if a arrowkey, or any function type key is sent, a #0 always is sent
first, and THEN the actual key value is sent. so, the first call to
readkey will get #0, and the second will get the key we're looking
for. }
if getkey = #0 then
begin
getkey := readkey;
case getkey of
{ up }
#72 : if choice > 1 then
begin
textattr := loclr;
gotoxy(xpos, ypos);
write(text);
dec(choice);
end;
{ down }
#80 : if choice < numitems then
begin
textattr := loclr;
gotoxy(xpos, ypos);
write(text);
inc(choice);
end;
end;
end;
{ if they hit ESC, set choice to 0 and exit }
if getkey = #27 then choice := 0;
{ if they press a key, see if the key the pressed is a hotkey }
getkey := upcase(getkey);
if getkey in ['A'..'Z'] then
begin
for cnt := 1 to numitems do
if getkey = menucast(menu)[cnt].key then
begin
choice := cnt;
getkey := #13;
end;
end;
end;
until (getkey = #13) or (getkey = #27);
domenu := choice;
end;
end.
{ ---------- DEMO PROGRAM ------------ }
{ 8/25/96 NMENU Example by Brandon Sneed }
program nmenuexample;
uses crt, nmenu;
const
DummyMenu : Array [1..5] of MenuRec =
((Text : ' Test 1 '; XPos : 1; YPos : 1; Key : '1'),
(Text : ' Test 2 '; XPos : 1; YPos : 2; Key : '2'),
(Text : ' Test 3 '; XPos : 1; YPos : 3; Key : '3'),
(Text : ' Test 4 '; XPos : 1; YPos : 4; Key : '4'),
(Text : ' Test 5 '; XPos : 1; YPos : 5; Key : '5'));
{ the menu array can have as many options as you need. just add them.
be sure to change the 'numitems' value being passed to domenu }
var
userpick : byte;
begin
userpick := domenu( dummymenu, { our menu const }
5, { total number of items in array }
1, { which item is first highlighted }
$1F, { highlight color (white! on blue) }
$07); { unhighlight color (white) }
gotoxy(1, 7);
writeln('User picked: '+DummyMenu[userpick].Text);
end.
[Back to MENU SWAG index] [Back to Main SWAG index] [Original]