Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2012, 17:49   #1
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию Модули. Паскаль.

Создать модуль создания и обработки произвольного вертикального меню с произвольными координатами в текстовом режиме.

Вообще, вроде бы основную часть я сделал,но есть одно но, после нажатия на exit внутри него мы нажимаем на enter для закрытия работы программы, но у меня получается так что приходится дважды нажимать на enter что-бы закрыть её, мозги уже не варят, не могу понять почему так происходит.
Буду очень благодарен за пояснения и за доп. оригинальные идеи.

P.S. Я не совсем уверен, что понимаю в условии пункт "... и обработки....", создать, то я создал, а вот если еще отдельно писать возможность изменения цветов добавления строк и т.д. это ж работы "уйма", а в лабораторных обычно дают небольшие задания.


Код:
unit MENU1;
interface
Uses CRT;
const MaxmenuItem=100;

Procedure GetInfo;
Function MainMenu(R_Select:Byte):Byte;

implementation

Type TMenu = record
         X,Y : Byte;     {определим тип пунктов меню, их координаты и названия}
          S : String[20];
     End;
     
Var Ret : Byte;
X1,Y1,Last:byte;
Menu : Array [0..MaxMenuItem] Of TMenu;

Procedure GetInfo;
   var i:integer;
   begin
      TextBackground(Blue);
     TextColor(LightGreen);
     clrscr;
   write('Введите Х-координату вашего меню ');
   readln(X1);
   write('Введите Y-координату первого пункта');
   readln(Y1);
   write('Введите кол-во пунктов вашего меню ');
   readln(Last);
   writeln('Введите названия пунктов вашего меню');
   for i:=1 to Last do begin
   Read(Menu[i].S);
   Menu[i].X:=X1;
   Menu[i].Y:=Y1;
   inc(y1);
   end;
   Menu[last+1].X:=X1;
   Menu[last+1].Y:=Menu[last].Y+1;
   Menu[last+1].S:='exit';
   end;
   {******************************************************************************}
Function MainMenu(R_Select:Byte):Byte;
Var
    Run : Boolean; {выбран пункт меню}
    Sel : Byte;
    TC, TB : Byte; {color}

    Procedure DrawMenu;{отрисовка меню}
    Var I : Byte;
    Begin
         For I := 1 To Last+1 Do
         Begin
              GotoXY(Menu[I].X, Menu[I].Y);
              Write(Menu[I].S);

         End;
    End;

    Procedure Select (I:Byte);
    Begin
         TextBackground(TC); TextColor(TB);
         GotoXY(Menu[I].X, Menu[I].Y);
         Write(Menu[I].S);
         TextBackground(TB); TextColor(TC);
    End;

    Procedure DeSelect (I:Byte);
    Begin
        // TextBackground(TB); TextColor(TC);
         GotoXY(Menu[I].X, Menu[I].Y);
         Write(Menu[I].S);
        // TextBackground(TB); TextColor(TC);
    End;


Begin
    ClrScr;

     TC := TextAttr mod 16;
     TB := TextAttr div 16;

     DrawMenu;
     Sel := R_Select;
     Select(Sel);

     Run := False;
     While Not Run Do Begin
     while keypressed do readkey;  {#13 - enter, #27 -esc}
           Case ReadKey Of
                #13 : Run := True;
                #27 : Begin
                           Run := True;
                           Sel := Last+1;
                      End;

                #0 : Case ReadKey Of {если расширенный код использ. вложенный кейс}
                           #72 : Begin           {#72-up,#80-down}
                                      DeSelect(Sel);
                                      If Sel = 1
                                      Then Sel := Last+1
                                      Else Sel := Sel - 1;
                                      Select(Sel);
                                 End;
                           #80 : Begin
                                      DeSelect(Sel);
                                      If Sel = Last+1
                                      Then Sel := 1
                                      Else Sel := Sel + 1;
                                      Select(Sel);
                                 End;
                      End;
           End;
     End;
     MainMenu := Sel;

     TextBackground(TB);
     TextColor(TC);

     ClrScr;
End;
{******************************************************************************}
Begin
getinfo;
     ClrScr;
     TextBackground(Blue);
     TextColor(LightGreen);
     ret:=1;
     repeat
     ret:=MainMenu(ret);
     if (ret>=1) and (ret<last+1)
     then begin
     WriteLn('Выбран пункт: ', Ret);
     WriteLn('... нажмите клавишу ...');
                       ReadLn;
                  End
     else begin
      WriteLn('Выход из программы');
                       WriteLn('... нажмите клавишу ...');
                       ReadLn;
      end;
      until ret=last+1;
      ClrScr;
     TextBackground(Black);
     TextColor(LightGray);


End.

Ну, логично запуск из другого модуля,
Код:
uses MENU1;
begin
mainmenu(1);
end.
Carpe Diem

Последний раз редактировалось Heming; 16.04.2012 в 17:54.
Heming вне форума Ответить с цитированием
Старый 17.04.2012, 01:37   #2
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

Желающих помочь я так понял нет?
Carpe Diem
Heming вне форума Ответить с цитированием
Старый 17.04.2012, 10:01   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
while keypressed do readkey; {#13 - enter, #27 -esc}
Case ReadKey Of
Дважды запрашиваешь ввод клавиши. Первый ридкей убери, он не нужен.
Цитата:
Желающих помочь я так понял нет?
Терпения, я так понял, нет?

P.S. На часы то лучше посмотрел бы - все у Морфея в гостях давно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.04.2012, 11:22   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Цитата:
while keypressed do readkey;
Дважды запрашиваешь ввод клавиши. Первый ридкей убери, он не нужен.
Виталий, это я (в другой теме) TC посоветовал подобный код - он чистит буфер клавиатуры.
Если к моменту выполнения данной строчки клавиши не нажимались, то функция keypressed вернёт false и цикл do ReadKey не будет выполнятся.
Так что эта строчка не должна влиять!

впрочем, сейчас схожу в отладку, посмотрю, что за проблемы возникают...


Heming, может от Вас требовалось написать что-то вроде того, что во вложении:
barmenu.rar
(код не мой, выужен в сети...)

Последний раз редактировалось Serge_Bliznykov; 17.04.2012 в 11:27.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.04.2012, 13:09   #5
Heming
Форумчанин
 
Аватар для Heming
 
Регистрация: 06.07.2010
Сообщений: 105
По умолчанию

Лабораторная удачна сдана преподавателю, я сделал с утра на скорости просто бекраунд и текст черного цвета,
Код:
  TextBackground(Black);
     TextColor(Black);
так чтобы казалось что програ действ. завершилась и два раза быстро калацнув ентер её завершил. Но учусь, я логично, не ради сдачи лаб, а ради того, чтобы че-то там осталось в итоге, так что желание понять в чем проблема осталось, прийду после пар гляну трезвым взглядом на код и мб найду в чем траблы,
всем большое спасибо за ответы.
Carpe Diem
Heming вне форума Ответить с цитированием
Старый 17.04.2012, 13:23   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Если к моменту выполнения данной строчки клавиши не нажимались, то функция keypressed вернёт false и цикл do ReadKey не будет выполнятся.
Верно, поэтому я лично в таких случаях не применяю While
http://www.programmersforum.ru/showt...t=%CC%E5%ED%FE
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
модули паскаль kaziaka_teddy Помощь студентам 2 01.04.2012 21:42
Паскаль. Модули. allod26 Паскаль, Turbo Pascal, PascalABC.NET 1 12.12.2011 22:02
Модули Паскаль Наталья Т Помощь студентам 5 11.05.2011 14:00
Паскаль и модули A.S.W Помощь студентам 2 08.01.2010 00:41
Паскаль и модули Snake_ua Паскаль, Turbo Pascal, PascalABC.NET 2 19.10.2007 15:15