Изучивши предложенные варианты и впоследствии систематизировав их, я понял что это не то. А вот те критерии, которые считаю главенствующими в моём представлении о меню: 1)Небольшое(20-40 строк)-иначе говоря для чайников; 2)Расположенное только в процедуре(НЕ в модуле и основной программе)-чтобы, как говорится с места в карьер; 3)Управление меню только КЛАВИШАМИ (точнее стрелками "вверх" и "вниз"). Причём указанная в данный момент (как бы её назвать) титра должна делать вид, что именно её на даный момент выбрали; 4)Прежде чем спросить про язык, на которым я ПРОШУ написать меню, просто вспомните название сайта; 5)Всего 3 титры. За сим удаляюсь с большой надеждою, всегда ваш 1234.
Не мешало бы мсье TarasBerу написать комментарии к данной функции. А тем временем у меня уже немного другое обращение к функции. И где должна стоять GAME ничего не стоит, т.к. запускается она в основной программе позже. Кстати, налицо небольшой глюк-меню появляется, когда Press any key.
While c<>#98 do Begin C:=Readkey; Case Menu('New'#13'option'#13'Exit') of 0: C:=#98; 1: OutTextXY(140,90,'Hello'); 2: Exit; End; Case Menu('Easy'#13'Medium'#13'Hard'#13'Back') of 0: Begin Sl:=50; C:=#98; End; 1: Begin Sl:=100; C:=#98; End; 2: Begin Sl:=1; C:=#98; End; 3: C:=#4; end;
А, кстати, что это у меня репутация -1. Где меня успела настигнуть дурная слава.
Не мешало бы мсье TarasBerу написать комментарии к данной функции.
А что именно неясно? Всё элементарно... Сразу предупрежу: после добавления коментариев текст уже не влезает в 80 символов по ширине...
function Menu(Params: string): integer; {так объявляются функции} var {это открывается раздел локальных переменных} Count: integer; {это объявляется переменная целого типа - она будет обозначать число пунктов меню} Strings: array [0 .. 15] of string [127]; {а это сами пункты меню - для них я завёл массив} i: integer; {вспомогательная переменная - счётчик. впоследствии является номером выбранного пункта меню} Ch: char; {переменная - символ - обозначает нажатую клавишу} X, Y, H: integer; {X и Y - размеры пункта меню. H - высота символа} begin Count := 1; {сначала дробим строку на подстроки. Считаем, что одна подстрока уже есть} Strings[0] := ''; {и что она изначально пустая} for i := 1 to Length(Params) do begin {перебираем все символы строки - параметра. ленгтх - это длина строки} if Params[i] = #13 then begin {если очередной символ - #13} Inc(Count); {то добавляем новый пункт меню} Strings[Count - 1] := ''; {который считаем изначально пустым} end else begin {иначе} Strings[Count - 1] := Strings[Count - 1] + Params[i]; {к последнему пункту меню приписываем текущий символ строки} end; {а в бегин-енд я это загнал просто так, потому что писАл экспромтом} end; SetTextJustify(CenterText, CenterText); {чтобы всё посерединке выводилось} H := TextHeight('A') + 10; {высота символа, к которой для запаса прибавили 10} ClearDevice; {очищаем экран, то есть всё стираем} SetColor(WHITE); {устанавливаем белый цвет текста} for i := 0 to Count - 1 do {ну и выводим все строки} OutTextXY( { чтоб середина строки совпала с серединой экрана } GetMaxX div 2,
{ и здесь аналогично с учётом номера пункта меню, только - H div 4 я приписал для того, чтобы хвостики букв p, q, y итд не вылазили (извините, люди, я специально пошёл против себя и написал div 4 вместо shr 2, чтобы 1234 точно понял) } GetMaxY div 2 - (Count - 1) * H div 2 - H div 4 + i * H,
Strings[i] ); i := 0; {с этого момента i - номер выбраного пункта меню} repeat {начало цикла с постусловием (вроде в термине не ошибся?)} SetColor(GREEN); {устанавливаем зелёный цвет прямоугольников} X := TextWidth(Strings[i]) + 10; {запоминаем ширину строки з запасом} Y := TextHeight(Strings[i]) + 10; {ну и высоту} Rectangle(GetMaxX div 2 - X div 2, {и обводим её в прямоугольничек} GetMaxY div 2 - (Count - 1) * H div 2 + i * H - Y div 2, GetMaxX div 2 + X div 2, {надеюся, назначеник процедуры ректангл пояснять не надо...} GetMaxY div 2 - (Count - 1) * H div 2 + i * H + Y div 2); ch := readkey; {ждём нажатия клавиши...} SetColor(BLACK); {устанавливаем чёрный цвет} X := TextWidth(Strings[i]) + 10; {это убрать} Y := TextHeight(Strings[i]) + 10; {это стереть} Rectangle(GetMaxX div 2 - X div 2, {удаляем зелёный прямокгольник, нарисовав поверх него чёрный} GetMaxY div 2 - (Count - 1) * H div 2 + i * H - Y div 2, GetMaxX div 2 + X div 2, GetMaxY div 2 - (Count - 1) * H div 2 + i * H + Y div 2); case ch of {смотрим, какая же клавиша нажата...} { если встретился нулевой символ - значит надо опять вызвать ридкей, потому что так надо } #0: case ReadKey of #72: begin {сканкод стрелочки вверх} Dec(i); {ну уменьшаем на 1 номер выбранного пункта меню} if i < 0 then {а если залезли вверх за край} i := Count - 1; {то вылазим снизу} end; #80: begin {сканкод стрелочки вниз} Inc(i); {увеличиваем на 1 номер выбранного пункта меню} if i >= Count then {но если ниже некуда} i := 0; {то переносимся наверх} end; end; end; until ch = #13; {и весь цикл крутим, пока 1234 не нажмёт enter} Menu := i; {и говорим, чтобы функция выдала номер выбранного пункта меню} end;
Мсье 1234, самый главный коментарий - почитайте хорошее руководство по Паскалю. Особенно я рекомендую 1ю часть Фаронова. Прочитав её и разобравшись в ней, вы уже не будете задавать такие вопросы, а то, извиняюсь, возникает ассоциация со Светланой Семененко (<http://forum.kaspersky.com/index.php?showtopic=19230>)...
М
Подкорректировал пост, чтобы все-таки не было такого "расползания" в ширину... volvo