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

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


Новичок
*

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

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


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

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


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

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

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


Эээ... Я не понял. Вам надо, чтом меню сразу высветилось? Или чтоб именно после нажатия клавиши?
В первом случае ридкей убрать надо, конечно.
А во втором случае надо перед ридкеем на всякий случай очистить клавиатурный буфер. То есть перед ридкеем надо написать

while KeyPressed do
ReadKey;


Я так и не увидел, как вы боритесь со случаем, когда c изначально, при запуске программы, равно #98. В Паскале непроинициализированные переменные не обнуляются. Что было в оперативной памяти до запуска программы, то в переменной и окажется.
Далее, замените же наконец Exit на

begin
CloseGraph;
Exit;
end;


Вы работаете в проводнике что-ли? Или всё таки в тотал командере? Так вот, некоторые люди, вроде меня, в качестве файлового менеджера используют ФАР, который использует ТЕКСТОВЫЙ режим. И если какая-то программа забыла за собой закрыть графику, то ФАР вместо связной картинки выведет на экран бред. А тем, кто работает под ДОСом после вашей программы остаётся либо запустить что-нибудь, восстнавливающее текстовыцй режим, либо всё - РЕСЕТ.
Для вывода сведений о программе вместо options пишут about...
Определитесь с отступами - 2 или 3 пробела. А то увидел, как вы мою процедуру переписали - чуть не упал. Лучше бы вы её просто ctrl-insert - shift-insert в любую виндоуз-программу, в которой открыт ваш ***.pas.
Меня сейчас все обматерят, но рекомендую для повышения читабельности писать бегин на одной строчке с предыдущим словом (енд - елсе тоже пишите в одну строчку, а не так, что елсе на следующей строке после десяти пробелов) и писать все зарезервированные слова маленькими буквами. Конечно, выбор стиля программирования - дело творческое, но вы, похоже, этот выбор ещё не сделали.
Далее, не рекомендую defaultfont. Например потому, что у некоторых (у меня, например) этот шрифт вместо цифр и пробелов рисует иероглифы. Или потому, что его нельзя переделать под русские буквы.
После writeln('Hello'); неплохо б написать

WriteLn('press enter...');
while KeyPressed do
ReadKey;
repeat
ch := ReadKey;
if ch = #0 then
ReadKey;
until ch = #13;


И при выводе сведений о программе рекомендую во всех outtextxy первым параметром писать GetMaxX div 2 (или shr 1, чтобы мне глаз меньше резало), чтобы весь текст выводился повередине.
Либо вы вообще не указывайте явные координаты, либо явно задайте графический режим (Gd := 9; Gm := 2), а то вдруг у кого-то на древнем 8086 - CGA... Надо, чтоб программа либо в любом случае рисовала правильную картинку, либо просто не запускалась на компах с не тем видеоадаптером.
И у вас всё равно после вывода сведений о программе вызывается второе меню. Чтобы этого не было, поместите тогда уж первое меню в цикл репит-антил с условием выхода i=0 (где в переменную i сразу записывается значение функции, то есть вместь case menu of сделайте i := menu; case i of).
И не забывайте, что #72 - это всё таки 'H', а #0#72 - это уже стрелочка. Либо заводите две переменные для считывания (я так делаю) - Key и ScanKey и пишите везде

Key := ReadKey;
if Key = #0 then
ScanKey := ReadKey
else
ScanKey := #0;


либо, случай Key = #0 разбирайте внутри:

ch := ReadKey;
case ch of
#0: begin
ch := ReadKey;
case ch of
Up: ...
Left: ...
Right: ...
end;
{здесь писать if ch = up then ... нельзя, птому что сработает и при нажатии 'H'}


И всё, что я вам объясняю сейчас, есть в первой части Фаронова.
В который раз я из-за вас нарушаю правило №8, рекламируя одну и ту же книгу...

Чёто я после case of стал двоеточия ставить... А ведь вечер ещё не наступил...

Сообщение отредактировано: TarasBer - 5.02.2007 15:11


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

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


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

 



- Текстовая версия 18.07.2025 8:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"