uses crt, graph; const dist = 3; procedure show_menu(current: integer; const menu_str: array of string; const size: integer); var i, px, color: integer; begin px := dist; setcolor(white); settextjustify(centertext, centertext); for i := 0 to pred(size) do begin if (current - 1) = i then color := lightgreen else color := green; setfillstyle(solidfill, color); bar(px, dist, px + textwidth(menu_str[i]) + 2 * dist, dist + textheight(menu_str[i]) + 2 * dist); rectangle(px, dist, px + textwidth(menu_str[i]) + 2 * dist, dist + textheight(menu_str[i]) + 2 * dist); outtextxy(px + (textwidth(menu_str[i]) + 2 * dist) div 2, dist + (textheight(menu_str[i]) + 2 * dist) div 2, menu_str[i]); inc(px, textwidth(menu_str[i]) + 3 * dist) end; end; function get_menu(start: integer; const menu_str: array of string; const size: integer): integer; var _stop: boolean; begin _stop := false; repeat show_menu(start, menu_str, size); case readkey of #0: case readkey of #75: { left } if start > 1 then dec(start); #77: { right } if start < size then inc(start); end; #13: { enter } _stop := true; end; until _stop; get_menu := start; end; const n = 5; arr: array[1 .. n] of string = ( 'print "hello"', 'print "world"', 'print "menu"', 'clear screen', 'exit' ); var select: integer; g_driver, g_mode, err_code: integer; begin g_driver := Detect; initgraph(g_driver, g_mode, ''); err_code := graphresult; if err_code <> grOk then begin writeln('Graphics error: ', grapherrormsg(err_code)); readln; halt(100); end; select := 1; repeat select := get_menu(select, arr, n); case select of 1: outtextxy(100, 100, 'hello'); 2: outtextxy(120, 120, 'world'); 3: outtextxy(140, 140, 'menu'); 4: cleardevice; end; until select = 5; closegraph; end.