uses crt; type MenuType = (Vertical); const width = 12; nItems = 3; optNormal = LightGray; optSelected = Yellow; var X, Y, selected, row: integer; _style: MenuType; procedure MakeMenu (optText: array of string; MaxItems: integer); var i, _X: byte; begin Y := row; _X := X; for i := 0 to MaxItems-1 do begin GoToXY (_X, Y); if i = selected then TextColor (optSelected) else TextColor (optNormal); write (optText[ i ]); inc (Y, 2); end; end; function MenuOption (var optText: array of string; MaxItems: integer): byte; var ch: char; begin selected := 0; X := (80 - width) div 2; row := (25 - MaxItems) div 2; repeat MakeMenu (optText, MaxItems); ch := readkey; if ch = #0 then ch := readkey; case ch of #80, #77: {Down/Right} begin inc (Selected); if Selected = MaxItems then Selected := 0; MakeMenu (optText, MaxItems); end; end; until ch = #13; MenuOption := Selected + 1; TextColor (optNormal); clrscr; end; type tprocedure = procedure; Procedure ShowMenu(s:array of string; proc: array of tprocedure); var Option,i: byte; begin _style := Vertical; repeat clrscr; Option := MenuOption (s, nItems); proc[pred(option)]; until Option = nItems; end; procedure do_termini; far; forward; procedure do_subs; far; forward; procedure do_data_view; far; forward; procedure do_data_add; far; forward; procedure do_nothing; far; forward; const s: array [1..3] of string=('termini','podprogrammi','exit'); s_proc: array[1 .. 3] of tprocedure = (do_termini, do_subs, do_nothing); t: array[1..3] of string=('Prosmotr dannih','Dobavlenie dannih','Vozvrat v menu'); t_proc: array[1 .. 3] of tprocedure = (do_data_view, do_data_add, do_nothing); r: array[1 .. 3] of string = ('sub_1', 'sub_2', 'exit'); r_proc: array[1 .. 3] of tprocedure = (do_nothing, do_nothing, do_nothing); procedure do_termini; begin ShowMenu(t, t_proc); { ... } end; procedure do_subs; begin { ... } end; procedure do_data_view; begin showmenu(r, r_proc); { ... } end; procedure do_data_add; begin { ... } end; procedure do_nothing; begin end; begin showMenu(s, s_proc); end.