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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2016, 18:01   #1
AndreiCHS
 
Регистрация: 16.03.2016
Сообщений: 6
По умолчанию Графическое меню pascal

Здравствуйте!

У меня получается простое меню для выбора надо написать номер варианта действия и нажать ввод.

Подскажите, как меню сделать с подсветкой выбора и управления клавишами клавиатура. То есть по меню управляешь клавишами и выбор действия enter.


Код:
Program MatrixCalulyator;            //Наименование программы
Uses graphabc;
const
 
 
VAR i1, i2, i3, m1,m2,m3 : integer;  //Счетчик количества строк
    j1, j2, j3, n1,n2,n3 : integer;  //Счетчик количества столбцов
operation: integer;    //Варианты выбора пользователя программы
det :      real;       //Нахождение определителя
k:   integer;          //Переменная для счета и вычитания матрицы
c:  char; // Переменная выхода из программы, клавиша F
    //Массивы для матрицы используется в программе
    MAS1,   //Матрица первая, A. Для ввода матраца               
    MAS2,   //Матрица вторая, B. Для ввода матрица 
    MAS3 : array [1..10,1..10] of real;   //Матрица тертья, С. Для ввыода матриц
 
 
 
 
 Begin
procedure WindowPreparing; forward; //Подготовка окна
procedure CreateMenu; forward; //Создаём меню
procedure KeyDown(Key: integer); forward; //Реакция на нажатие клавиш
procedure Help; forward; //справка
 //Начало программы. Привествие пользователя
     Writeln (' Добро пожаловать в матричный калькулятор! '); 
     Writeln ();
     WriteLn (' Что нужно сделать с матрицами? ');
     Writeln ();
     WriteLn (' Выберите нужную Операцию и Нажмите эту клавишу  ');
     Writeln ();
     
  // repeat //Ограничение выхода,повторять прогармму пока не нажата клвиша F
   
      // Выбор пользователя 
     WriteLn (' 1 -  Найти определитель матрицы ');
     WriteLn (' 2 -  Найти обратную матрицу ');
     WriteLn (' 3 -  Транспонировать матрицу ');
     WriteLn (' 4 -  Сложить матрицы ');
     WriteLn (' 5 -  Вычесть матрицы ');
     WriteLn (' 6 -  Перемножить матрицы ');
     writeln ();
     Writeln ( ' Ваш выбор операции над матрицей:  ');
     ReadLn (operation); //Занесение в оперативную память выбора пользователя. Храниться пока работает программа.
 
      // Создание размера матрицы пользователем
     WriteLn ('Введите кол-во строк исходной матрицы, не более 10'); 
     ReadLn (m1);
     WriteLn ('Введите кол-во столбцов исходной матрицы, не более 10'); 
     ReadLn (n1);
     
      If ((1>n1) or  (n1>10) or (1>m1) or  (m1>10)) //Проверка матрицы на размер и заполнение.
        then begin
               WriteLn (' Ошибка в матрице. Пересоздайте заново ');
               Halt;
             end
        else begin
               WriteLn ('Введите исходную матрицу');  //Если проверка ошибки не обнаружила, то программа программа ждет пока пользователь запонит исходную матрицу.
               for i1:=1 to m1 do
                  for j1:=1 to n1 do Read (MAS1[i1,j1]);
              end;
                     WriteLn (' ');
                     Writeln ( 'Получилось следущая матрциа: ',m1, ' на ', '  ',n1);
                     WriteLn (' ');
               for i1:=1 to m1 do   //Ввыод заполненую матрицу на экран
                      begin
                        for j1:=1 to n1 do
                        Write (MAS1[i1,j1],' ');
                        writeln ();
                         end;
 
          Case operation of  //Выполнения выбора пользователя
              1: begin  //Нахождение определителя 
                    if (m1<>n1) then writeLn ('Ошибка опеределителя! Попробуйте занова вести матрицу!') // Проверка правильно ли введен опеределитель,по условию.
                    else
                        begin //Нахождение определителя с выводом решения
                         det:=(MAS1[1,1]*MAS1[2,2]*MAS1[3,3]
                         +MAS1[2,1]*MAS1[3,2]*MAS1[1,3] 
                         +MAS1[1,2]*MAS1[2,3]*MAS1[3,1])
                         -(MAS1[3,1]*MAS1[2,2]*MAS1[1,3]
                         +MAS1[3,2]*MAS1[2,3]*MAS1[1,1]
                         +MAS1[2,1]*MAS1[1,2]*MAS1[3,3]);
                         writeln ( ' '); // для формотирования 
                         Writeln ( 'Решение определителя ');
                         writeln (' ') ;
                         write( ' (', MAS1[1,1],'*',MAS1[2,2],'*',MAS1[3,3],'+',MAS1[2,1],'*',MAS1[3,2],'*',MAS1[1,3],'+',MAS1[1,2]);
                         write ('*',MAS1[2,3],'*',MAS1[3,1],' ) - (',MAS1[3,1],'*',MAS1[2,2],'*',MAS1[1,3],'+',  MAS1[3,2]);
                         write ('*',MAS1[2,3],'*',MAS1[1,1],'+',MAS1[2,1],'*',MAS1[1,2],'*',MAS1[3,3], ') = ', det );
                         end;
                         writeln (' '); 
                         writeln (' '); 
                         WriteLn (' Определитель = ',det); 
                         writeln (' '); 
                 end;
 
              2: begin  //Нахождения обратной матрицы
                   if (m1<>n1) then writeLn ('Ошибка Матрицы! Попробуйте занова вести матрицу!') // Проверка правильно ли введена матрица,по определению.
                   else begin
                          det:=(MAS1[1,1]*MAS1[2,2]*MAS1[3,3] //Вычисления опеределителя для проверки
                          +MAS1[2,1]*MAS1[3,2]*MAS1[1,3]
                          +MAS1[1,2]*MAS1[2,3]*MAS1[3,1])
                          -(MAS1[3,1]*MAS1[2,2]*MAS1[1,3]
                          +MAS1[3,2]*MAS1[2,3]*MAS1[1,1]
                          +MAS1[2,1]*MAS1[1,2]*MAS1[3,3]);
                         writeln ( ' '); 
                         Writeln ( 'На ходим опередлитель  ');
                         writeln (' ') ;
                         write( ' (', MAS1[1,1],'*',MAS1[2,2],'*',MAS1[3,3],'+',MAS1[2,1],'*',MAS1[3,2],'*',MAS1[1,3],'+',MAS1[1,2]);
                         write ('*',MAS1[2,3],'*',MAS1[3,1],' ) - (',MAS1[3,1],'*',MAS1[2,2],'*',MAS1[1,3],'+',  MAS1[3,2]);
                         write ('*',MAS1[2,3],'*',MAS1[1,1],'+',MAS1[2,1],'*',MAS1[1,2],'*',MAS1[3,3], ') = ', det );
                         writeln (' '); 
                         writeln (' '); 
                         WriteLn (' Определитель = ',det); 
                         writeln (' ');
                          if det = 0 then WriteLn (' Определитель не может быть равен 0 ') // проверка свойству определителя, для дальнейшего нахождения обратной матрицы.
                          else begin //Транспорнирование матрицы
                          writeln (' ');
                                     writeln (' Союзная матрица ');
                                 for i1:=1 to m1 do
                                 begin
                                     for j1:=1 to n1 do MAS2[i1,j1]:=MAS1[j1,i1];
                                     write (MAS1[j1,i1],' ');
                                     writeln;
                                     end;
                                 // Итоговое нахождение обратной матрицы с решением             
                        for i1:=1 to m1 do
                                     for j1:=1 to n1 do  MAS3[i1,j1]:=(1/det)*MAS2[i1,j1]; 
                                 WriteLn;
                                 WriteLn (' Обратная матрица: ');
                                 for i1:=1 to m1 do begin // Готовая обратная матрица
                                                      for j1:=1 to n1 do
                                                      Write (MAS3[i1,j1], ' ');
                                                      WriteLn;
                                                    end;
                               end;
                        end;
                 end;
 
             ------------------------------
AndreiCHS вне форума Ответить с цитированием
Старый 26.11.2016, 22:06   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Так понимаю, что это Pascal ABC.
И все же.
1. Использовать следующие процедуры:
- сохранить текущие параметры цвета фона и символов;
- ввести новые параметры цвета фона и символов;
- выполнять переход между строками меню, используя процедуру GOTOXY

2. Вывод меню:
- инициировать указатель позиции
Следующий алгоритм оформить процедурой (параметр - указатель позиции строки меню:
В цикле по строкам меню
- Перейти к месту (строка, позиция на строке) вывода первой строки;
- Если указатель позиции равен текущей позиции Сохранить цвет фона и символов, установить цвет фона и символов для выделения, Вывести строку, Восстановить цвет фона и символов
Иначе вывести строку;
Конец цикла.

3. Ловим нажатие, например стрелки и меняем указатель позиции строки.
Проверяем и корректируем. Значение указателя должно находиться в диапазоне 1 ..m, где m - число строк меню. Корректируем в соответствии с принятым решением. Например, если указатель меньше 1 или больше m, то он восстанавливается: ukaz := 1 или ukaz := m. В другом случае, зацикливание: ukaz := m или ukaz := 1.
Вызываем процедуру вывода меню. Внимание: Текущие параметры цвета фона и символов можно передавать в процедуру через параметр или через глобальную переменную. Можно усложнить процедуру и получать необходимые параметры цвета фона и символов в ней, зная уже подсвеченную позицию меню.

PS: Возможно, что для вывода текста придется воспользоваться другой процедурой.
Если переставлять строки меню, то следует учесть, что они разной длинны и необходимо выравнивать выводимые строки по длине, добавляя пробелы, или выводить строку пробелов заданной длинны, с тем, что бы не оставлять символы и фон другого цвета.

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 26.11.2016, 23:47   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

вот ТУТ пример графического меню на Паскале.
правда, это Turbo Pascal, для Pascal ABC придётся переделывать...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2016, 08:34   #4
AndreiCHS
 
Регистрация: 16.03.2016
Сообщений: 6
По умолчанию

Serge_Bliznykov, = Спасибо! Ваш совет мог и все получилось.
AndreiCHS вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графическое меню С++ dykee Помощь студентам 0 02.05.2014 22:49
Графическое меню с мышью Turbo Pascal GamBitFRK Паскаль, Turbo Pascal, PascalABC.NET 10 16.01.2013 15:06
Графическое меню в Pascal'е. Astrador Помощь студентам 0 01.06.2012 14:00
Графическое меню Andrey770 Паскаль, Turbo Pascal, PascalABC.NET 2 31.10.2011 20:51