IPB
ЛогинПароль:

> Опять про меню, В одной процедуре
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: 1234

Репутация: -  -1  +


Изучивши предложенные варианты и впоследствии систематизировав их, я понял что это не то. А вот те критерии, которые считаю главенствующими в моём представлении о меню:
1)Небольшое(20-40 строк)-иначе говоря для чайников;
2)Расположенное только в процедуре(НЕ в модуле и основной программе)-чтобы, как говорится с места в карьер;
3)Управление меню только КЛАВИШАМИ (точнее стрелками "вверх" и "вниз"). Причём указанная в данный момент (как бы её назвать) титра должна делать вид, что именно её на даный момент выбрали;
4)Прежде чем спросить про язык, на которым я ПРОШУ написать меню, просто вспомните название сайта;
5)Всего 3 титры.
За сим удаляюсь с большой надеждою, всегда ваш 1234.

Сообщение отредактировано: 1234 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской
Реальное имя: 1234

Репутация: -  -1  +


Не мешало бы мсье 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. Где меня успела настигнуть дурная слава.

Сообщение отредактировано: 1234 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(1234 @ 4.02.2007 19:57) *

Не мешало бы мсье 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



Сообщение отредактировано: volvo -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
1234   Опять про меню   2.02.2007 22:01
TarasBer   Подразумевается, что подключены CRT и Graph. fun…   2.02.2007 23:24
volvo   Больше так не говори, хорошо? TMT Pascal / VP (Vi…   2.02.2007 23:43
1234   Да, Pascal безграничен. :yes2: Как сделать, чтобы…   3.02.2007 21:49
TarasBer   Да, Pascal безграничен. :yes2: Как сделать, чтоб…   3.02.2007 23:04
mamont001   Просто делаеш : if нажато уровень сложности then b…   3.02.2007 22:54
1234   А как сделать так, чтобы (желательно в самой подпр…   4.02.2007 22:46
Bokul   Ты сначала разберись с тем, что тебе дали. Подобны…   4.02.2007 22:57
1234   Ты знаешь, только хотел сказать. Чтобы осуществлят…   4.02.2007 23:27
volvo   Тогда и у меня к тебе вопросик - что есть по-твоем…   4.02.2007 23:35
1234   Не мешало бы мсье TarasBerу написать комментарии к…   4.02.2007 23:57
TarasBer   Не мешало бы мсье TarasBerу написать комментарии …   5.02.2007 1:08
TarasBer   Пока писал коментарии, под конец нервы стали сдава…   5.02.2007 1:57
1234   Заменой преведённой выше воспользовался. Эффект то…   5.02.2007 18:03
TarasBer   Эээ... Я не понял. Вам надо, чтом меню сразу высве…   5.02.2007 18:57
1234   Первый случай, второй... Это хоть в основной части…   5.02.2007 20:25
TarasBer   Первый случай, второй... Это хоть в основной част…   5.02.2007 21:07
volvo   Глобальные - ОБЯЗАНЫ обнуляться, локальные - нет, …   5.02.2007 21:12
1234   Объяснить-то ты всё объяснил. А мне необходимо поя…   5.02.2007 21:45
TarasBer   Да, глобальные обнуляются... Даже массивы, как ни …   6.02.2007 18:56


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.11.2022 11:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name