Unit Menus; {This unit provides a standardized menu system.} Interface Uses Crt; Type MenuLineType = String[25]; MenuArryType = Array[1..25] of MenuLineType; MenuRec = Record MenuArray : MenuArryType; NbrEntries : Integer; End; {MenuRec} LocationRec = Record Col : Integer; Row : Integer; End; ScreenLocation = (NW, N, NE, W, C, E, SW, S, SE); Procedure CreateMenu (Var Menu : MenuRec); {Initializes the menu to empty before starting a new menu} Procedure AddToMenu (Var Menu : MenuRec; NewEntry : MenuLineType); {Adds a new line entry to the menu being built} Procedure ShowMenu (Var Menu : MenuRec; Position : ScreenLocation; Var ItemSelected : Integer); {Displays the current menu on the screen at the location defined by Position} Procedure ChangeMenuColors (Border, Background, Foreground, SelectBack, SelectFore : Integer); {Sets the colors used in the menu} Implementation Type MenuColorRec = Record MenuBorder : Integer; MenuBackGnd : Integer; MenuForeGnd : Integer; MenuSelectBack : Integer; MenuSelectFore : Integer; End; Var MenuColor : MenuColorRec; Function RowWidth (Var Menu : MenuRec): Integer; Var ix, wide : integer; Begin wide := 0; For ix := 1 to Menu.NbrEntries Do If Length(Menu.MenuArray[ix]) > wide Then wide := Length(Menu.MenuArray[ix]); RowWidth := wide; End; Procedure FindPosition (Var Menu : MenuRec; Position : ScreenLocation; Var LocOut : LocationRec); {This function calculates the beginning position for the first line as a column and a row.} Var ix : Integer; Begin Case Position of NW : Begin LocOut.Col := 2; LocOut.Row := 2; End; N : Begin LocOut.Col := 39 - RowWidth(Menu) Div 2; LocOut.Row := 2; End; NE : Begin LocOut.Col := 79 - RowWidth(Menu); LocOut.Row := 2; End; W : Begin LocOut.Col := 2; LocOut.Row := 12 - Menu.NbrEntries Div 2; End; C : Begin LocOut.Col := 39 - RowWidth(Menu) Div 2; LocOut.Row := 12 - Menu.NbrEntries Div 2; End; E : Begin LocOut.Col := 79 - RowWidth(Menu); LocOut.Row := 11 - Menu.NbrEntries Div 2; End; SW : Begin LocOut.Col := 2; LocOut.Row := 25 - Menu.NbrEntries; End; S : Begin LocOut.Col := 39 - RowWidth(Menu) Div 2; LocOut.Row := 25 - Menu.NbrEntries; End; SE : Begin LocOut.Col := 79 - RowWidth(Menu); LocOut.Row := 25 - Menu.NbrEntries; End; End; {Case} End; Procedure CreateMenu (Var Menu : MenuRec); {Initializes the menu to empty before starting a new menu} Begin Menu.NbrEntries := 0; MenuColor.MenuBorder := Yellow; MenuColor.MenuBackGnd := Lightgray; MenuColor.MenuForeGnd := Black; MenuColor.MenuSelectBack := Cyan; MenuColor.MenuSelectFore := Blue; End; Procedure AddToMenu (Var Menu : MenuRec; NewEntry : MenuLineType); {Adds a new line entry to the menu being built} Begin inc(Menu.NbrEntries); Menu.MenuArray[Menu.NbrEntries] := NewEntry; End; Procedure ShowMenu (Var Menu : MenuRec; Position : ScreenLocation; Var ItemSelected : Integer); Var CurrPosition, HoldPosition : LocationRec; ix, wide : Integer; Ch : Char; {Displays the current menu on the screen at the location defined by Position} Begin ClrScr; FindPosition(Menu, Position, CurrPosition); HoldPosition := CurrPosition; TextBackGround(MenuColor.MenuBackGnd); TextColor(MenuColor.MenuForeGnd); ItemSelected := 1; GoToXY(CurrPosition.Col, CurrPosition.Row - 1); TextBackGround (MenuColor.MenuBorder); wide := RowWidth(Menu); for ix := 1 to wide + 1 Do Write(' '); While ItemSelected <= Menu.NbrEntries Do Begin GoToXY(CurrPosition.Col - 1, CurrPosition.Row); TextBackGround (MenuColor.MenuBorder); Write (' '); TextBackGround (MenuColor.MenuBackGnd); Write (Menu.MenuArray[ItemSelected]); For ix := Length(Menu.MenuArray[ItemSelected]) to wide Do Write(' '); TextBackGround (MenuColor.MenuBorder); Write (' '); Inc(CurrPosition.Row); Inc(ItemSelected); End; GoToXY(CurrPosition.Col, CurrPosition.Row); TextBackGround (MenuColor.MenuBorder); for ix := 1 to wide + 1 Do Write(' '); ItemSelected := 1; CurrPosition.Row := HoldPosition.Row; Repeat GoToXY(CurrPosition.Col, CurrPosition.Row); TextBackground (MenuColor.MenuSelectBack); TextColor (MenuColor.MenuSelectFore); Write (Menu.MenuArray[ItemSelected]); For ix := Length(Menu.MenuArray[ItemSelected]) to wide Do Write (' '); Ch := Readkey; TextBackGround (MenuColor.MenuBackGnd); TextColor (MenuColor.MenuForeGnd); if Ch = #0 Then Begin Ch := ReadKey; GoToXY(CurrPosition.Col, CurrPosition.Row); Write (Menu.MenuArray[ItemSelected]); For ix := Length(Menu.MenuArray[ItemSelected]) to wide Do Write (' '); Case Ch of #80 : Begin Inc(CurrPosition.Row); Inc(ItemSelected); If ItemSelected > Menu.NbrEntries Then Begin ItemSelected := 1; CurrPosition.Row := HoldPosition.Row; End; End; #72 : Begin Dec(CurrPosition.Row); Dec(ItemSelected); If ItemSelected < 1 Then Begin CurrPosition.Row := Menu.NbrEntries + HoldPosition.Row - 1; ItemSelected := Menu.NbrEntries; End; End; End; End; Until (Ch = #27) or (Ch = #13); End; Procedure ChangeMenuColors (Border, Background, Foreground, SelectBack, SelectFore : Integer); {Sets the colors used in the menu} Begin MenuColor.MenuBorder := Border; MenuColor.MenuBackGnd := Background; MenuColor.MenuForeGnd := Foreground; MenuColor.MenuSelectBack := SelectBack; MenuColor.MenuSelectFore := SelectFore; End; End. { ----------------------DEMO PROGRAM FOLLOWS ----------------------} Program MenuDemo; Uses Menus, Dos, Crt; Var Menu : MenuRec; ItemSelected : Integer; Begin CreateMenu(Menu); AddToMenu(Menu, 'DISPLAY MEMBERS'); AddToMenu(Menu, 'ADD A MEMBER'); AddToMenu(Menu, 'DELETE A MEMBER'); AddToMenu(Menu, 'MEMBER FINANCES'); AddToMenu(Menu, 'QUIT'); ShowMenu(Menu, NW, ItemSelected); TextBackGround (Black); TextColor (White); ClrScr; Writeln ('SELECTED ', Menu.MenuArray[ItemSelected]); Readln; ShowMenu(Menu, N, ItemSelected); TextBackGround (Black); TextColor (White); ClrScr; Writeln ('SELECTED ', Menu.MenuArray[ItemSelected]); Readln; ShowMenu(Menu, NE, ItemSelected); TextBackGround (Black); TextColor (White); ClrScr; Writeln ('SELECTED ', Menu.MenuArray[ItemSelected]); Readln; ShowMenu(Menu, W, ItemSelected); TextBackGround (Black); TextColor (White); ClrScr; Writeln ('SELECTED ', Menu.MenuArray[ItemSelected]); Readln; ShowMenu(Menu, C, ItemSelected); TextBackGround (Black); TextColor (White); ClrScr; Writeln ('SELECTED ', Menu.MenuArray[ItemSelected]); Readln; ShowMenu(Menu, E, ItemSelected); TextBackGround (Black); TextColor (White); ClrScr; Writeln ('SELECTED ', Menu.MenuArray[ItemSelected]); Readln; ShowMenu(Menu, SW, ItemSelected); TextBackGround (Black); TextColor (White); ClrScr; Writeln ('SELECTED ', Menu.MenuArray[ItemSelected]); Readln; ShowMenu(Menu, S, ItemSelected); TextBackGround (Black); TextColor (White); ClrScr; Writeln ('SELECTED ', Menu.MenuArray[ItemSelected]); Readln; ShowMenu(Menu, SE, ItemSelected); TextBackGround (Black); TextColor (White); ClrScr; Writeln ('SELECTED ', Menu.MenuArray[ItemSelected]); Readln; End.