home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / MENUDOW.ZIP / MENDOWS.INC < prev    next >
Encoding:
Text File  |  1986-09-30  |  18.7 KB  |  681 lines

  1. CONST
  2.    Top_Left_Char     = #201;
  3.    Top_Right_Char    = #187;
  4.    Bottom_Left_Char  = #200;
  5.    Bottom_Right_Char = #188;
  6.    Vertical_Char     = #186;
  7.    Horizontal_Char   = #205;
  8.    Left_Title_Char   = #91;
  9.    Right_Title_Char  = #93;
  10.    Pg_Up             = ^W;
  11.    Pg_Down           = ^Z;
  12.    Up_Arrow          = ^E;
  13.    Down_Arrow        = ^X;
  14.    Left_Arrow        = ^S;
  15.    Right_Arrow       = ^D;
  16.    INSERT            = ^U;
  17.    CR                = #13;
  18.    ESC               = #27;
  19.    Bell              = #7;
  20.  
  21.  
  22.  
  23.    TitleLen          = 74;
  24.    _PromptLen        = 76;
  25.    DrawStrLen        = 50;
  26.  
  27.    MaxDrawItems   = 50;
  28.    BaseMenuMove = 1;
  29.  
  30. Type
  31.   XTCoord=1..80;
  32.   YTCoord=1..25;
  33.   XTCoord0=0..80;
  34.   YTCoord0=0..25;
  35.  
  36.   TitleStr         = STRING[TitleLen];
  37.   _PromptStr        = STRING[_PromptLen];
  38.  
  39.   WindowRec=Record
  40.               XSize: XTCoord;
  41.               YSize: YTCoord;
  42.               XPosn: XTCoord;
  43.               YPosn: YTCoord;
  44.               Contents: Array [0..1999] Of Integer;
  45.             End;
  46.  
  47.   WindowPtr=^WindowRec;
  48.  
  49.   _PromptRec = RECORD
  50.                  _Prompt_Row : XTCoord;
  51.                  _Prompt_Col : YTCoord;
  52.                  _Prompt     : _PromptStr;
  53.                END;
  54.  
  55.   _PromptPtr = ^_PromptRec;
  56.  
  57.   _Title_Opt_Set = SET OF (Header,Footer);
  58.   CharSet = SET OF CHAR;
  59.  
  60.   TitleOptRange = Header..Footer;
  61.   DrawItemRange = 1..MaxDrawItems;
  62.  
  63.   DrawStr       = STRING[DrawStrLen];
  64.  
  65.  
  66.   RawDrawRec = RECORD
  67.                   Row      : 2..24;
  68.                   Col      : 2..79;
  69.                   DrawDat  : DrawStr;
  70.                END;
  71.  
  72.   DrawAr     = ARRAY[DrawItemRange] OF RawDrawRec;
  73.  
  74.   DrawRec    = RECORD
  75.                    Count       : DrawItemRange;
  76.                    Default     : DrawItemRange;
  77.                    Title       : TitleStr;
  78.                    DrawRecAr   : DrawAr;
  79.                 END;
  80.  
  81. Var
  82.   ScreenBase: Integer;
  83.  
  84.   WindowXLo: XTCoord;
  85.   WindowYLo: YTCoord;
  86.   WindowXHi: XTCoord;
  87.   WindowYHi: YTCoord;
  88.  
  89.   WinData  : WindowPtr;
  90.   MenuMoveFactor : INTEGER;
  91.  
  92. PROCEDURE Rvs_Video;
  93. BEGIN
  94.    TEXTCOLOR(BLACK);
  95.    TEXTBACKGROUND(WHITE);
  96. END;
  97.  
  98. PROCEDURE Reg_Video;
  99. BEGIN
  100.    TEXTCOLOR(WHITE);
  101.    TEXTBACKGROUND(BLACK);
  102. END;
  103.  
  104. procedure ReadIBMch(var ch: char);
  105. var   ech: char;
  106. begin  {  ReadIBMch  }
  107. {$U-}
  108.   ch := #00;
  109.   Read(kbd,ch);
  110.   if (ch = ^[) and KeyPressed  then
  111.     begin
  112.       Read(kbd,ech);   ch := #00;
  113.       case Ord(ech)  of
  114.         15 : ch := ^O;  { BACK TAB }
  115.  
  116.         59 : ch := #131;{ PF 1 (HELP) KEY }
  117.         60 : ch := #132;{ PF 2 }
  118.         61 : ch := #133;{ PF 3 }
  119.         62 : ch := #134;{ PF 4 }
  120.         63 : ch := #135;{ PF 5 }
  121.         64 : ch := #136;{ PF 6 }
  122.         65 : ch := #137;{ PF 7 }
  123.         66 : ch := #138;{ PF 8 }
  124.         67 : ch := #139;{ PF 9 }
  125.         68 : ch := #140;{ PF 10 }
  126.  
  127.         72 : ch := ^E;  { CURSOR UP }
  128.         73 : ch := ^W;  { PAGE UP }
  129.         75 : ch := ^S;  { CURSOR LEFT }
  130.         77 : ch := ^D;  { CURSOR RIGHT }
  131.         79 : ch := ^F;  { END }
  132.         80 : ch := ^X;  { CURSOR DOWN }
  133.         81 : ch := ^Z;  { PAGE DOWN }
  134.         82 : ch := ^U;  { INSERT }
  135.         83 : ch := ^G;  { DELETE }
  136.       else Write(^G);  (* Sound Speaker *)
  137.       end;  {case }
  138.     end;
  139. {$U+}
  140. end;   {  ReadIBMch  }
  141.  
  142. PROCEDURE Read_Cursor_Pad(    Valid_Set     : CharSet;
  143.                           VAR Cursor_Choice : CHAR);
  144.  
  145. VAR
  146.    TCh            : CHAR;
  147.    Cursor_Pressed : BOOLEAN;
  148.    Two_Char_Input : BOOLEAN;
  149.  
  150. BEGIN
  151.    Cursor_Pressed := FALSE;
  152.    REPEAT
  153.       ReadIBMCh(TCh);
  154.  
  155.       CASE TCh OF
  156.          Up_Arrow,
  157.          Down_Arrow,
  158.          CR,
  159.          ESC,
  160.          Insert : Cursor_Pressed := TRUE;
  161.          ELSE
  162.          BEGIN
  163.             TCh := UPCASE(TCh);
  164.             IF (TCh IN Valid_Set) THEN
  165.                Cursor_Pressed := TRUE
  166.             ELSE
  167.             BEGIN
  168.                WRITE(Bell);
  169.                Cursor_Pressed := FALSE;
  170.             END; { IF (TCh : ELSE }
  171.          END; { CASE TCh : ELSE }
  172.       END; { CASE TCh }
  173.  
  174.    UNTIL Cursor_Pressed;
  175.    Cursor_Choice := TCh;
  176. END; { Read_Cursor_Pad }
  177.  
  178. PROCEDURE Click;
  179. BEGIN
  180.    SOUND(2000);
  181.    DELAY(10);
  182.    NOSOUND;
  183. END;
  184.  
  185. Procedure TurboWindow(XL: XTCoord; YL: YTCoord; XH: XTCoord; YH: YTCoord);
  186.   Begin
  187.     Window(XL,YL,XH,YH);
  188.   End;
  189.  
  190.  
  191. Procedure Window(XL: XTCoord; YL: YTCoord; XH: XTCoord; YH: YTCoord);
  192.  
  193.   Begin
  194.     TurboWindow(XL,YL,XH,YH);
  195.     WindowXLo:=XL;
  196.     WindowYLo:=YL;
  197.     WindowXHi:=XH;
  198.     WindowYHi:=YH;
  199.   End;
  200.  
  201. Function SaveWindow(XLow: XTCoord; YLow: YTCoord;
  202.                     XHigh: XTCoord; YHigh:YTCoord): WindowPtr;
  203.  
  204.   Var
  205.     SW: WindowPtr;
  206.     I: Integer;
  207.     XS: XTCoord;
  208.     YS: YTCoord;
  209.  
  210.   Begin
  211.     XS:=XHigh-XLow+1;
  212.     YS:=YHigh-YLow+1;
  213.     GetMem(SW,2*XS*YS + 4);
  214.     With SW^ Do
  215.      Begin
  216.       XSize:=XS;
  217.       YSize:=YS;
  218.       XPosn:=XLow;
  219.       YPosn:=YLow;
  220.       For I:=0 To YSize-1 Do
  221.         Move(Mem[ScreenBase:((YPosn+I-1)*80+XPosn-1) Shl 1],
  222.              Contents[I*XSize],XSize Shl 1);
  223.      End;
  224.     SaveWindow:=SW;
  225.   End;
  226.  
  227. Function SaveCurrentWindow: WindowPtr;
  228.   Begin
  229.     SaveCurrentWindow:=SaveWindow(WindowXLo,WindowYLo,WindowXHi,WindowYHi);
  230.   End;
  231.  
  232. Procedure RestoreWindow(WP: WindowPtr; XPos: XTCoord0; YPos: YTCoord0);
  233.  
  234.   Var
  235.     I: Integer;
  236.  
  237.   Begin
  238.     With WP^ Do
  239.      Begin
  240.       If XPos=0 Then XPos:=XPosn;
  241.       If YPos=0 Then YPos:=YPosn;
  242.       For I:=0 To YSize-1 Do
  243.         Move(Contents[I*XSize],
  244.              Mem[ScreenBase:2*((YPos+I-1)*80+XPos-1)],XSize*2);
  245.      End;
  246.   End;
  247.  
  248. Procedure DisposeWindow(Var WP: WindowPtr);
  249.  
  250.   Begin
  251.     With WP^ Do FreeMem(WP,2*XSize*YSize+4);
  252.     WP:=Nil;
  253.   End;
  254.  
  255. Procedure DRestoreWindow(Var WP: WindowPtr; XPos: XTCoord0; YPos: YTCoord0);
  256.  
  257.   Begin
  258.     RestoreWindow(WP, XPos, YPos);
  259.     DisposeWindow(WP);
  260.   End;
  261.  
  262. Procedure DRestoreCurrentWindow(Var WP: WindowPtr;
  263.                                 XPos: XTCoord0; YPos: YTCoord0);
  264.  
  265.   Begin
  266.     With WP^ Do
  267.      Begin
  268.       If XPos=0 Then XPos:=XPosn;
  269.       If YPos=0 Then YPos:=YPosn;
  270.       Window(XPos,YPos,XPos+XSize-1,YPos+YSize-1);
  271.      End;
  272.     DRestoreWindow(WP, XPos, YPos);
  273.   End;
  274.  
  275. Procedure DetermineDisplay;
  276.  
  277.   Var
  278.     M,C: Integer;
  279.     T: Byte;
  280.  
  281.   Begin
  282.     M:=MemW[$B000:0];
  283.     C:=MemW[$B800:0];
  284.     T:=64;
  285.     If (Hi(M)=T) Or (Hi(C)=T) Then T:=65;
  286.     If (Hi(M)=T) Or (Hi(C)=T) Then T:=66;
  287.     GotoXY(1,1);
  288.     Write(Chr(T));
  289.     GotoXY(1,1);
  290.     If Mem[$B000:0]=T Then ScreenBase:=$B000
  291.     Else ScreenBase:=$B800;
  292.     MemW[$B000:0]:=M;
  293.     MemW[$B800:0]:=C;
  294.   End;
  295.  
  296.  
  297.  
  298. PROCEDURE Make_Window_Border(BorderXL : XTCoord;BorderYL : YTCoord;
  299.                            BorderXH : XTCoord;BorderYH : YTCoord);
  300. VAR
  301.    I : INTEGER;
  302.  
  303. BEGIN
  304.    GOTOXY(1,BorderYH-BorderYL);
  305.    WRITE(Bottom_Left_Char);
  306.    FOR I := 2 TO BorderXH - BorderXL DO
  307.       WRITE(Horizontal_Char);
  308.    WRITE(Bottom_Right_Char);
  309.    GOTOXY(1,BorderYH-BorderYL);
  310.    INSLINE;
  311.    GOTOXY(1,1);
  312.    WRITE(Top_Left_Char);
  313.    FOR I := 2 TO (BorderXH - BorderXL) DO
  314.       WRITE(Horizontal_Char);
  315.    WRITE(Top_Right_Char);
  316.    FOR I := 2 TO BorderYH - BorderYL DO
  317.    BEGIN
  318.       GOTOXY(1,I);
  319.       WRITE(Vertical_Char);
  320.       GOTOXY(BorderXH-BorderXL + 1,I);
  321.       WRITE(Vertical_Char);
  322.    END;
  323.  
  324. END;
  325.  
  326. PROCEDURE Make_Window_Title(Current_Title : TitleStr;
  327.                             Current_XH,
  328.                             Current_XL            : XTCoord;
  329.                             Current_YH            : YTCoord;
  330.                             Current_Title_Opt     : TitleOptRange);
  331.  
  332. VAR
  333.    XLength,
  334.    Title_XPos     : XTCoord;
  335.    Title_YPos     : YTCoord;
  336.  
  337. BEGIN
  338.    XLength := Current_XH - Current_XL + 1;
  339.    IF (LENGTH(Current_Title) + 4) > XLength THEN
  340.       Current_Title := COPY(Current_Title,1,XLength);
  341.  
  342.    IF Current_Title_Opt = Header THEN
  343.       Title_YPos := 1
  344.    ELSE
  345.       Title_YPos := Current_YH;
  346.    Title_XPos := (XLength DIV 2) - ((LENGTH(Current_Title) + 4) DIV 2);
  347.    Current_Title := Left_Title_Char + ' ' + Current_Title + ' ' +
  348.                     Right_Title_Char;
  349.  
  350.    GOTOXY(Title_Xpos,Title_Ypos);
  351.    TEXTBACKGROUND(WHITE);
  352.    TEXTCOLOR(BLACK);
  353.    WRITE(Current_Title);
  354.    TEXTCOLOR(WHITE);
  355.    TEXTBACKGROUND(BLACK);
  356.  
  357. END;
  358.  
  359.  
  360. FUNCTION Make_Window(MakeXL              : XTCoord;
  361.                      MakeYL              : YTCoord;
  362.                      MakeXH              : XTCoord;
  363.                      MakeYH              : YTCoord;
  364.                      MakeTitle           : TitleStr;
  365.                      VAR Make_Window_Dat : WindowPtr;
  366.                      Make_Clr_Scrn       : BOOLEAN
  367.                     ) : BOOLEAN;
  368.  
  369. VAR
  370.    Window_Size_Ok : BOOLEAN;
  371.    NewXL,
  372.    NewXH          : XTCoord;
  373.    NewYL,
  374.    NewYH          : YTCoord;
  375.  
  376. BEGIN
  377.    IF (MakeXH < (MakeXL + 2)) OR (MakeYH < (MakeYL + 2)) THEN
  378.       Window_Size_Ok := FALSE
  379.    ELSE
  380.       BEGIN
  381.          NewXH := MakeXH - 1;
  382.          NewYH := MakeYH - 1;
  383.          NewXL := MakeXL + 1;
  384.          NewYL := MakeYL + 1;
  385.          Window_Size_Ok := TRUE;
  386.          GOTOXY(MakeXH-MakeXL,1);
  387.       END;
  388.  
  389.    IF Window_Size_Ok THEN
  390.       BEGIN
  391.          Window(MakeXL,MakeYL,MakeXH,MakeYH);
  392.          Make_Window_Dat := SaveWindow(MakeXL,MakeYL,MakeXH,MakeYH);
  393.          IF Make_Clr_Scrn THEN
  394.             CLRSCR;
  395.          Make_Window_Border(MakeXL,MakeYL,MakeXH,MakeYH);
  396.          Make_Window_Title(MakeTitle,MakeXH,MakeXL,MakeYH,Header);
  397.          Window(NewXL,NewYL,NewXH,NewYH);
  398.       END;
  399.  
  400.    Make_Window := Window_Size_Ok;
  401. END;
  402.  
  403. PROCEDURE Draw_Window(Draw_Dat : DrawRec);
  404.  
  405. VAR
  406.    I : DrawItemRange;
  407.  
  408. BEGIN
  409.    WITH Draw_Dat DO
  410.    BEGIN
  411.       FOR I := 1 TO Count DO
  412.       BEGIN
  413.          WITH DrawRecAr[I] DO
  414.          BEGIN
  415.             GOTOXY(Col,Row);
  416.             WRITE(DrawDat);
  417.          END;
  418.       END;
  419.    END;
  420. END;
  421.  
  422. PROCEDURE Menu_Items_Display(    In_Menu            : DrawRec;
  423.                              VAR Menu_Valid_Choices : CharSet);
  424.  
  425. VAR
  426.    I : INTEGER;
  427.    MenuItems_Valid : CharSet;
  428.    InValid         : BOOLEAN;
  429.    Ch              : CHAR;
  430.  
  431. BEGIN
  432.    MenuItems_Valid := [];
  433.    InValid := FALSE;
  434.    WITH In_Menu DO
  435.       FOR I := 1 TO Count DO
  436.          BEGIN
  437.             GOTOXY(2,I);
  438.             WRITE(DrawRecAr[I].DrawDat);
  439.             Ch := DrawRecAr[I].DrawDat[1];
  440.             IF Ch IN MenuItems_Valid THEN
  441.                InValid := TRUE
  442.             ELSE
  443.                MenuItems_Valid := MenuItems_Valid + [Ch];
  444.          END;
  445.    If InValid THEN
  446.       MenuItems_Valid := [];
  447.    Menu_Valid_Choices := MenuItems_Valid;
  448. END;
  449.  
  450. PROCEDURE Menu_Display(    Menu_Rec         : DrawRec;
  451.                        VAR Menu_Window_Dat  : WindowPtr;
  452.                        VAR Menu_Valid_Chars : CharSet);
  453.  
  454. VAR
  455.   Tem : BOOLEAN;
  456.   MenuXL : XTCoord;
  457.   MenuYL : YTCoord;
  458.   MenuXH : XTCoord;
  459.   MenuYH : YTCoord;
  460.  
  461. BEGIN
  462.    WITH Menu_Rec DO
  463.    BEGIN
  464.       MenuXL := DrawRecAr[1].Col;
  465.       MenuYL := DrawRecAr[1].Row;
  466.       MenuXH := DrawRecAr[2].Col;
  467.       MenuYH := DrawRecAr[2].Row;
  468.    END; { WITH Menu_Rec }
  469.  
  470.    Tem := Make_Window(MenuXL,MenuYL,MenuXH,MenuYH,
  471.                       Menu_Rec.Title,Menu_Window_Dat,TRUE);
  472.    CLRSCR;
  473.    Menu_Items_Display(Menu_Rec,Menu_Valid_Chars);
  474. END;
  475.  
  476. FUNCTION Move_Menu(VAR Move_Rec : DrawRec;
  477.                        Move_Window : WindowPtr) : BOOLEAN;
  478.  
  479. VAR
  480.    Move_Exit : BOOLEAN;
  481.    MCh       : CHAR;
  482.    Old_Col1  : XTCoord;
  483.    Old_Col2  : XTCoord;
  484.    Old_Row1  : YTCoord;
  485.    Old_Row2  : YTCoord;
  486.    Move_More : BOOLEAN;
  487.    Move_Int  : BOOLEAN;
  488.  
  489. BEGIN
  490.    Move_Exit := FALSE;
  491.    REPEAT
  492.       ReadIBMCh(MCh);
  493.       WITH Move_Rec DO
  494.       BEGIN
  495.          Move_Exit := FALSE;
  496.          Old_Col1 := DrawRecAr[1].Col;
  497.          Old_Col2 := DrawRecAr[2].Col;
  498.          Old_Row1 := DrawRecAr[1].Row;
  499.          Old_Row2 := DrawRecAr[2].Row;
  500.          CASE MCh OF
  501.             Left_Arrow : BEGIN
  502.                             Move_More := TRUE;
  503.                             Move_Exit := TRUE;
  504.                             IF (Old_Col1 > MenuMoveFactor) THEN
  505.                             BEGIN
  506.                                DrawRecAr[1].Col := DrawRecAr[1].Col -
  507.                                                    MenuMoveFactor;
  508.                                DrawRecAr[2].Col := DrawRecAr[2].Col -
  509.                                                    MenuMoveFactor;
  510.                             END; { IF Old_Col1 }
  511.                          END; { CASE MCh : Left_Arrow }
  512.             Right_Arrow : BEGIN
  513.                              Move_More := TRUE;
  514.                              Move_Exit := TRUE;
  515.                              IF (Old_Col2 < (81 - MenuMoveFactor)) THEN
  516.                              BEGIN
  517.                                 DrawRecAr[1].Col := DrawRecAr[1].Col +
  518.                                                     MenuMoveFactor;
  519.                                 DrawRecAr[2].Col := DrawRecAr[2].Col +
  520.                                                     MenuMoveFactor;
  521.                              END; { IF Old_Col2 }
  522.                           END; { CASE MCh : Right_Arrow }
  523.             Up_Arrow : BEGIN
  524.                           Move_More := TRUE;
  525.                           Move_Exit := TRUE;
  526.                           IF (Old_Row1 > MenuMoveFactor) THEN
  527.                           BEGIN
  528.                              DrawRecAr[1].Row := DrawRecAr[1].Row -
  529.                                                  MenuMoveFactor;
  530.                              DrawRecAr[2].Row := DrawRecAr[2].Row -
  531.                                                  MenuMoveFactor;
  532.                           END; { IF Old_Row1 }
  533.                        END; { CASE MCh : Up_Arrow }
  534.             Down_Arrow : BEGIN
  535.                             Move_More := TRUE;
  536.                             Move_Exit := TRUE;
  537.                             IF (Old_Row2 < (25 - MenuMoveFactor)) THEN
  538.                             BEGIN
  539.                                DrawRecAr[1].Row := DrawRecAr[1].Row +
  540.                                                    MenuMoveFactor;
  541.                                DrawRecAr[2].Row := DrawRecAr[2].Row +
  542.                                                    MenuMoveFactor;
  543.                             END; { IF Old_Row2 }
  544.                          END; { CASE MCh : Down_Arrow }
  545.             Pg_Up : BEGIN
  546.                        Move_More := TRUE;
  547.                        Move_Exit := TRUE;
  548.                        DrawRecAr[1].Row := 1;
  549.                        DrawRecAr[2].Row := Old_Row2 - Old_Row1 + 1;
  550.                     END; { CASE MCh : Pg_Up }
  551.             Pg_Down : BEGIN
  552.                          Move_More := TRUE;
  553.                          Move_Exit := TRUE;
  554.                          DrawRecAr[2].Row := 24;
  555.                          DrawRecAr[1].Row := 24 - (Old_Row2 - Old_Row1);
  556.                       END; { CASE MCh : Pg_Down }
  557.             '1'..'9' : BEGIN
  558.                           Move_More := TRUE;
  559.                           Move_Exit := FALSE;
  560.                           MenuMoveFactor := ORD(MCh) - 48;
  561.                        END; { CASE MCh : '1'..'9' }
  562.             Insert : BEGIN
  563.                         Move_Exit := TRUE;
  564.                         Move_More := FALSE;
  565.                      END; { CASE MCh : Insert }
  566.             ELSE
  567.             BEGIN
  568.                Move_Exit := FALSE;
  569.                WRITE(Bell);
  570.             END;
  571.          END; { CASE MCh }
  572.       END; { WITH Move_Rec }
  573.    UNTIL Move_Exit;
  574.  
  575.    DRestoreCurrentWindow(Move_Window,0,0);
  576.    Move_Menu := Move_More;
  577. END; { Move_Window }
  578.  
  579.  
  580.  
  581. FUNCTION Menu_Choice(Choice_Rec     : DrawRec;
  582.                      Choice_Valid   : CharSet) : INTEGER;
  583. VAR
  584.    Row              : YTCoord;
  585.    Cursor_Ch        : CHAR;
  586.    Cur_Choice,I     : INTEGER;
  587.    Exit_Menu_Choice : BOOLEAN;
  588.  
  589. BEGIN
  590.    Exit_Menu_Choice := FALSE;
  591.  
  592.    WITH Choice_Rec DO
  593.    BEGIN
  594.       Row := Default;
  595.       WHILE NOT Exit_Menu_Choice
  596.       BEGIN
  597.          GOTOXY(2,Row);
  598.          Rvs_Video;
  599.          WRITE(DrawRecAr[Row].DrawDat);
  600.          Reg_Video;
  601.  
  602.          Read_Cursor_Pad(Choice_Valid,Cursor_Ch);
  603.          GOTOXY(1,Row);
  604.          WRITE(' ',DrawRecAr[Row].DrawDat,' ');
  605.  
  606.          CASE Cursor_Ch OF
  607.             ESC        : BEGIN
  608.                             Cur_Choice := 0;
  609.                             Exit_Menu_Choice := TRUE;
  610.                          END; { CASE Cursor_Ch : ESC }
  611.             CR         : BEGIN
  612.                             Cur_Choice := Row;
  613.                             Exit_Menu_Choice := TRUE;
  614.                          END; { CASE Cursor_Ch : CR }
  615.             Up_Arrow   : BEGIN
  616.                             Row := PRED(Row);
  617.                             Exit_Menu_Choice := FALSE;
  618.                             IF Row = 0 THEN
  619.                                Row := Count;
  620.                             Click;
  621.                          END; { CASE Cursor_Ch : Up_Arrow }
  622.             Down_Arrow : BEGIN
  623.                             Row := SUCC(Row);
  624.                             Exit_Menu_Choice := FALSE;
  625.                             IF Row > Count THEN
  626.                                Row := 1;
  627.                             Click;
  628.                          END; { CASE Cursor_Ch : Down_Arrow }
  629.             Insert : BEGIN
  630.                         Cur_Choice := -1;
  631.                         Exit_Menu_Choice := TRUE;
  632.                      END; { CASE Cursor_Ch : Insert }
  633.             ELSE         BEGIN
  634.                             Cur_Choice := 0;
  635.                             Exit_Menu_Choice := TRUE;
  636.                             FOR I := 1 TO Count DO
  637.                                IF DrawRecAr[I].DrawDat[1] = Cursor_Ch THEN
  638.                                   Cur_Choice := I;
  639.                          END;
  640.          END { Case Cursor_Ch };
  641.       END { While Not Exit_Menu_Choice };
  642.    END { With Choice_Rec };
  643.    Menu_Choice := Cur_Choice;
  644. END;
  645.  
  646. FUNCTION Make_Menu(VAR MakeMenu_Rec     : DrawRec;
  647.                    VAR MakeMenu_Window  : WindowPtr;
  648.                        MakeMenu_Erase   : BOOLEAN)  : INTEGER;
  649.  
  650. VAR
  651.    Menu_Window      : WindowPtr;
  652.    MakeMenu_Choice  : INTEGER;
  653.    MakeMenu_Valid   : CharSet;
  654.    MakeMenu_Exit    : BOOLEAN;
  655.    Make_Move        : BOOLEAN;
  656.  
  657. BEGIN
  658.    MenuMoveFactor := BaseMenuMove;
  659.    Make_Move := FALSE;
  660.    REPEAT
  661.       MakeMenu_Exit := TRUE;
  662.       Menu_Display(MakeMenu_Rec,Menu_Window,MakeMenu_Valid);
  663.       IF (NOT Make_Move) THEN
  664.          MakeMenu_Choice := Menu_Choice(MakeMenu_Rec,MakeMenu_Valid);
  665.       IF (MakeMenu_Choice = -1) OR (Make_Move) THEN
  666.       BEGIN
  667.          Make_Move := Move_Menu(MakeMenu_Rec,Menu_Window);
  668.          MakeMenu_Exit := FALSE;
  669.       END; { IF (MakeMenu_Choice }
  670.    UNTIL MakeMenu_Exit;
  671.  
  672.    IF MakeMenu_Erase THEN
  673.    BEGIN
  674.       DRestoreCurrentWindow(Menu_Window,0,0);
  675.       Menu_Window := NIL;
  676.    END;
  677.    MakeMenu_Window := Menu_Window;
  678.  
  679.    Make_Menu := MakeMenu_Choice;
  680. END; { Make_Menu }
  681.