home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug133.arc / MENU.PAS < prev    next >
Pascal/Delphi Source File  |  1979-12-31  |  9KB  |  336 lines

  1. {--------------------------------------------------------------------------
  2.                        F i l e    I n f o r m a t i o n
  3.  
  4. * DESCRIPTION
  5. This program is an expanded version of CHOICES: A generalized menu technique.
  6. Requires: Turbo Pascal 3.0. Author: Bill Tooker. Version T1.0.
  7.  
  8. * CHECKED BY
  9. DM - 9/7/86
  10.  
  11. ==========================================================================
  12. }
  13. Program menudemo;
  14. {Version: 01/07/1986 12:29:50}
  15. {Converted to Microbee CP/M 20/11/89 by A J Laughton}
  16. {
  17. This program is an expanded version of "Choices: A Generalized Menu Technique"
  18. which was published in the October/November version of TUG Lines.
  19.  
  20.                            The original model was written by
  21.                            Barry Abrahamsen of Seattle, Washington
  22. }
  23.  
  24. { These values are for the Microbee}
  25.  
  26. const
  27.   up_arrow_chr        = '^';
  28.   down_arrow_chr      = 'v';
  29.   escape              = #27;
  30.   up_arrow            = #05;       { Ctrl E or Up arrow key }
  31.   down_arrow          = #24;       { Ctrl X or Down arrow key }
  32.  
  33.   max_choices         = 7;  {one less than the actual number of choices}
  34.   cr                  = #13;
  35.   bell                = #07;
  36.  
  37. type
  38.   choice_type = record            { more information could be included here}
  39.     row           : integer;      { and that information returned by GET_CHOICE,}
  40.     column        : integer;      { instead of just the position of the choice in}
  41.     description   : string[60];{ the array }
  42.  
  43.   end;
  44.  
  45. var
  46.   choice             :array[0..max_choices] of choice_type;
  47.   desc_text          :array[0..20] of string[60];
  48.   result             :integer;
  49.   keyin, control_key :char;
  50.   row_variable       : integer;
  51.   Execute_file       : file;
  52.   Execute_name       : string[64];
  53.   Menu_title         : string[50];
  54.  
  55.  
  56. Procedure Set_Menu_Heading;
  57. var
  58.     title_position         :  integer;
  59. begin
  60.  
  61.      title_position := 40 - (length(menu_title) div 2);
  62.      gotoxy(title_position,2);
  63.      Write(menu_title);
  64.      gotoxy(10,23);
  65.      writeln('Position your choice with ',up_arrow_chr,' or ',down_arrow_chr,' and press <ENTER>');
  66.      gotoxy(10,24);
  67.      writeln('[or Key in the number for your selection]');
  68. END;
  69.  
  70. procedure set_menu_values;
  71. begin
  72.      Menu_title   := 'The Title of the Menu .......';
  73.      desc_text[0] := '1: The first menu item...........';
  74.      desc_text[1] := '2: The second menu item..........';
  75.      desc_text[2] := '3: The Third Menu Item...........';
  76.      desc_text[3] := '4: The Fourth Menu Item...........';
  77.      desc_text[4] := '5: The Fifth Menu Item............';;
  78.      desc_text[5] := '6: The Sixth Menu Item............';
  79.      desc_text[6] := '7: The Seventh Menu Item.........:';
  80.      desc_text[7] := '8: Sign Off - return to CP/M';
  81. end;
  82.  
  83.  
  84. procedure get_a_character(var keyin, control_key: char);
  85. begin
  86.        control_key := #0;
  87.        read(kbd,keyin);
  88.        if(keyPressed and (keyin = #27)) then
  89.        begin
  90.           delay(0);
  91.           read(kbd,control_key);
  92.        end
  93.          else
  94.             if (keyin in [#1..#31,#127]) then
  95.                control_key := keyin;
  96.  end; {get_a_character}
  97.  
  98.  
  99.  
  100. procedure turn_on(choice : choice_type);  {highlights a menu choice}
  101. begin
  102.   gotoxy(choice.column, choice.row);
  103.   lowvideo;
  104.   write(choice.description);
  105. end;
  106.  
  107. procedure turn_off(choice : choice_type); {cancels the highlighting}
  108. begin
  109.   gotoxy(choice.column, choice.row);
  110.   normvideo;
  111.   write(choice.description);
  112. end;
  113.  
  114. procedure initialize_choices; { puts the descriptions of the menu choices}
  115.                               { and their location on the screen in an  }
  116. var                           { array }
  117.   i :integer;
  118.  
  119.  
  120. begin
  121.   row_variable := 5;
  122.   for i := 0 to max_choices do
  123.     with choice[i] do
  124.       begin
  125.            row := row_variable;
  126.            row_variable := row_variable + 2;
  127.            column := 15;
  128.            description := desc_text[i];
  129.       end;
  130.  
  131. end;
  132.  
  133. procedure display_choices;
  134.  
  135. var
  136.   i : integer;
  137.  
  138. begin
  139.   clrscr;
  140.   set_menu_heading;
  141.   for i := 0 to max_choices do
  142.     with choice[i] do
  143.       begin
  144.           gotoxy(column, row);
  145.           write(description);
  146.       end;
  147.    turn_on(choice[0]);
  148.  
  149. end; {display_choices}
  150.  
  151.  
  152. function get_choice : integer;
  153. var
  154.   c : char;
  155.   current, last : integer;
  156.   c_integer     : integer;
  157.   result_code   : integer;
  158. begin
  159.   current := 0;
  160.   last := 0;
  161.   repeat {loop until they hit the RETURN key}
  162.     get_a_character(keyin,control_key);
  163.     if control_key > #0 then
  164.          c := control_key
  165.     else
  166.          c := keyin;
  167.  
  168. {************************************************************************}
  169. {**  If ESCape is pressed set the Exit to CP/M option                  **}
  170. {************************************************************************}
  171.  
  172.    if c = escape
  173.    then
  174.        c := '8';
  175.  
  176. {************************************************************************}
  177. {**  If a Number was pressed set the appropriate option...........     **}
  178. {************************************************************************}
  179.  
  180.     if c in ['1'..'8'] then
  181.         begin
  182.              val(c,c_integer,result);
  183.              last := current;
  184.              current := c_integer - 1;
  185.              turn_off(choice[last]);
  186.              turn_on(choice[current]);
  187.              c := cr;
  188.         end;
  189.  
  190.  
  191. {************************************************************************}
  192. {**  If either up or down arrow was pressed set corresponding option   **}
  193. {**  If RETurn was pressed execute the current option                  **}
  194. {************************************************************************}
  195.  
  196.     case c of
  197.        down_arrow   : begin
  198.                           last := current;
  199.                           current := last + 1;
  200.                       end;
  201.  
  202.        up_arrow     : begin
  203.                           last := current;
  204.                           if last <> 0 then
  205.                              current := last - 1
  206.                           else
  207.                               current := max_choices;
  208.                       end;
  209.  
  210.                       else if c <> cr then write(#7);
  211.     end; {case}
  212.  
  213.  
  214.     if c in [up_arrow, down_arrow] then
  215.       begin
  216.           current := current mod (max_choices + 1);
  217.           turn_off(choice[last]);
  218.           turn_on(choice[current]);
  219.       end;
  220.   until c = cr; {end repeat}
  221.   get_choice := current;
  222. end; {get_choice}
  223.  
  224.  
  225.  
  226. {*********************** execute actual program required ***************}
  227.  
  228.  
  229.  
  230. Procedure Do_actual_Execute;
  231. var
  232.    Response        :char;
  233.  
  234.  begin
  235. {Change this if you are chaining or executing a program}
  236.  
  237. { This is for testing only!!!!!!!!!}
  238.  
  239.         gotoxy(10,22);
  240.         write('You would be doing: ',Execute_Name);
  241.         Read(Response);
  242.         gotoxy(10,22);
  243.         clreol;
  244.  
  245.  
  246. { The following code should be opened up if the menu will be calling .COM
  247. File programs.  If this is the case the individual items should assign the name
  248. of the program to be executed into the variable Execute_name in the form
  249. Pgmname.com  }
  250.  
  251.  {
  252.     assign(Execute_File,Execute_name);
  253.     Execute(Execute_File);
  254. }
  255.  end;
  256.  
  257.  
  258. {These should be changed to correspond to the action associated with
  259.  the menu option requested
  260. }
  261.  
  262.  
  263. PROCEDURE Item0;
  264.     BEGIN
  265.         Execute_name := 'Menu#:01';
  266.         do_actual_Execute;
  267.     end;
  268.  
  269. PROCEDURE Item1;
  270.     BEGIN
  271.         Execute_name := 'Menu#:02';
  272.         do_actual_Execute;
  273.     end;
  274.  
  275. PROCEDURE Item2;
  276.     BEGIN
  277.         Execute_name := 'Menu#:03';
  278.         do_actual_Execute;
  279.     end;
  280.  
  281. PROCEDURE Item3;
  282.     BEGIN
  283.          Execute_name := 'Menu#:04';
  284.          do_actual_Execute;
  285.     end;
  286.  
  287. PROCEDURE item4;
  288.     BEGIN
  289.          Execute_name := 'Menu#:05';
  290.          do_actual_Execute;
  291.     end;
  292.  
  293. PROCEDURE item5;
  294.     BEGIN
  295.          Execute_name := 'Menu#:06';
  296.          do_actual_Execute;
  297.     end;
  298.  
  299. PROCEDURE item6;
  300.     BEGIN
  301.          Execute_name := 'Menu#:07';
  302.          do_actual_Execute;
  303.     end;
  304.  
  305. PROCEDURE item7;
  306.     BEGIN
  307.          Execute_name := 'Menu#:08';
  308.          do_actual_Execute;
  309.     end;
  310.  
  311.  
  312. {----------- Main Program -----------------}
  313.  
  314. begin
  315.   set_menu_values;
  316.   initialize_choices;
  317.   display_choices;
  318.   result := get_choice;
  319.  
  320.   gotoxy(20,20);
  321.  
  322.   case result of
  323.        0: item0;
  324.        1: item1;
  325.        2: item2;
  326.        3: item3;
  327.        4: item4;
  328.        5: item5;
  329.        6: item6;
  330.   else
  331.           write('Returning to CP/M');
  332.   end; {case}
  333.  
  334.   clrscr;
  335. end.
  336.