Как выйти по Esc

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Как выйти по Esc

Сообщение Леонид » 23.03.2017 13:28:14

Допустим есть некая программка (в данный момент нет никакой программки - это просто для примера):
Код: Выделить всё
program proba;
uses Crt;
var
  a,b,c:real;

begin
repeat
    write('Ввести число а: '); readln(a);
    write('Ввести число b: '); readln(b);
    write('Ввести число c: '); readln(c);
    .......         { тут что-нибудь делаем с этими переменными;
    .......           сейчас это неважно. }
    readkey;
until ...;
end.

Меня интересует возможно ли на запрос:
Код: Выделить всё
write('Ввести число а: '); readln(a);

вместо ввода числа нажать Esc выйти из программы. Или, как вариант, проделать какие-то манипуляции (например, сохранить результаты предыдущих вычислений в файле или еще что-нибудь), а потом выйти.

PS. Тут, в принципе, этих самых repeat - until может и не быть вовсе - это не суть важно.
Леонид
новенький
 
Сообщения: 16
Зарегистрирован: 23.03.2017 13:19:20

Re: Как выйти по Esc

Сообщение Снег Север » 23.03.2017 23:18:58

Код: Выделить всё
var
  ch : char;
begin
  writeln('Press Left/Right, Esc=Quit');
  repeat
    ch:=ReadKey;
    case ch of
     #0 : begin
            ch:=ReadKey; {Read ScanCode}
            case ch of
             #75 : WriteLn('Left');
             #77 : WriteLn('Right');
            end;
          end;
    #27 : WriteLn('ESC');
    end;
  until ch=#27 {Esc}
end.

пример из хелпа по ReadKey
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 940
Зарегистрирован: 27.11.2007 16:14:47

Re: Как выйти по Esc

Сообщение Леонид » 24.03.2017 12:50:12

Этот номер не проходит. Тем более ненужны тут Left/Right.
Функция ReadKey считывает, на сколько я знаю (а в паскале знаю я очень мало), только первое нажатие клавиши (как-то так). А как тогда ввести 2-х, 3-ч и проч. значные числа?
Если б было все так просто, я бы не спрашивал.
Леонид
новенький
 
Сообщения: 16
Зарегистрирован: 23.03.2017 13:19:20

Re: Как выйти по Esc

Сообщение MysticCoder » 24.03.2017 17:12:52

while do в помощь
MysticCoder
новенький
 
Сообщения: 97
Зарегистрирован: 14.09.2013 00:20:28

Re: Как выйти по Esc

Сообщение Снег Север » 24.03.2017 18:55:57

Что не проходит? Вы спросили - как выйти по Esc, пример это показывает. Если надо читать строку, определите переменную типа string и добавляйте ей символы, если это не #27. Как-то так.
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 940
Зарегистрирован: 27.11.2007 16:14:47

Re: Как выйти по Esc

Сообщение Леонид » 24.03.2017 19:20:36

Снег Север , я в примере, вообще-то, написал, что там переменные real. Это числа, с которыми в дальнейшем проделываем вычисления.
Леонид
новенький
 
Сообщения: 16
Зарегистрирован: 23.03.2017 13:19:20

Re: Как выйти по Esc

Сообщение vitaly_l » 24.03.2017 19:23:02

Код: Выделить всё
program proba;
uses Crt;
var
  a,b,c:real;
s:string;
begin
repeat
    write('Ввести число а: '); readln(s); if s = #27 then halt;//и close; не работает
    write('Ввести число b: '); readln(s); if s = #27 then halt;//и close; не работает
    write('Ввести число c: '); readln(s); if s = #27 then halt;//и close; не работает
    .......         { тут что-нибудь делаем с этими переменными;
    .......           сейчас это неважно. }
until ...;
end.


Добавлено спустя 8 минут 88 секунд:
Но даже так работать не будет
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 2983
Зарегистрирован: 31.01.2012 16:41:41

Re: Как выйти по Esc

Сообщение Снег Север » 25.03.2017 07:28:38

Леонид писал(а):Снег Север , я в примере, вообще-то, написал, что там переменные real. Это числа, с которыми в дальнейшем проделываем вычисления.
Процедура VAL преобразует строковое представление числа в само число. Читаете строку и если не Esc преобразуете.
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 940
Зарегистрирован: 27.11.2007 16:14:47

Re: Как выйти по Esc

Сообщение Pavia » 25.03.2017 11:53:19

Есть два пути.
1) Разобраться с POSIX сигналами, такими CTRL+C и CTRL+Brack. Т.е. с ESC они не работают.
В виндоусе они работают параллельно в линуксе асинхронно.
2) Реализовать свой InputBuffer. А то считай целый компонент, который в 100 строчек не уложится.
Но сделать это не сложно. Обработка клавиш фильтруешь, то есть разделяешь клавиши на управляющие и знаковые. Знаковые преобразуешь через KeyToChar и записываешь в буфер(строку) и делаешь эхо-вывод буфера. Для эхо-вывода понадобиться gotoXY, cursorOff, cursorOn. Управляющие клавиши, отслеживаешь перемещение каретки влево и вправо, затирание слева, удаление. Тут нужно предусмотреть выход за границы буфера(строки).
Сделать аналоги для Read() - чтения строки, чтение целого числа и чтение вещественного числа. Тут вам помогут StrToInt, FloatToInt, TryFloatToInt,
И обработка управляющей клавиши ввод. Так что-бы весь экран прокручивался в верх. Достаточно Writeln.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 170
Зарегистрирован: 07.01.2011 12:46:51

Re: Как выйти по Esc

Сообщение Снег Север » 25.03.2017 12:48:36

Pavia писал(а):Есть два пути.
Господь с вами, тут чел явно самого элементарного не знает... :shock:
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 940
Зарегистрирован: 27.11.2007 16:14:47

Re: Как выйти по Esc

Сообщение Леонид » 26.03.2017 02:00:16

Снег Север писал(а):тут чел явно самого элементарного не знает...


Вашими устами глаголет истина, друг мой.
Я только изучаю паскаль. По книжкам, форумам, сайтикам разным.
Вот приспичило гуматитарию не только по образованию, но и по мозгам, в свои 55 воплотить одну хотелку/мечталку. Вот теперь пытаюсь разобраться, а не получается (что бывает не редко) пристаю к людям.
Леонид
новенький
 
Сообщения: 16
Зарегистрирован: 23.03.2017 13:19:20

Re: Как выйти по Esc

Сообщение tema » 26.03.2017 02:12:50

Код: Выделить всё
c:char;
s:string;
r:real;
code:integer;
...........
while (c<>#13) and (c<>#27) do
begin
c:=readkey;
if c in ['0'..'9','.'] then s:=s+c;
end;
if c=#27 then выход из программы, например halt;
val(s,r,code);
if code <> 0 then
             Writeln('Ошибка на позиции :', code);
в r будет ваше дробное число

Можно оформить в виде процедуры или функции и использовать вместо readln
tema
постоялец
 
Сообщения: 318
Зарегистрирован: 24.03.2011 20:19:27

Re: Как выйти по Esc

Сообщение Снег Север » 26.03.2017 08:06:58

Леонид писал(а):Я только изучаю паскаль. По книжкам, форумам, сайтикам разным.
Вот приспичило гуматитарию не только по образованию, но и по мозгам, в свои 55 воплотить одну хотелку/мечталку. Вот теперь пытаюсь разобраться, а не получается (что бывает не редко) пристаю к людям.

Тут вот какое дело - эти примеры из прошлого века, гораздо продуктивнее сразу начать с форм и компонентов на форме, т.е. с лазаруса. А консольный ввод осваивать только если очень приспичит, поскольку в реальной жизни он нужен примерно как умение каллиграфически писать гусиным пером...
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 940
Зарегистрирован: 27.11.2007 16:14:47

Re: Как выйти по Esc

Сообщение Deimos » 26.03.2017 18:37:49

Леонид писал(а):воплотить одну хотелку/мечталку

А Вы хотелку обрисуйте, хоть в двух словах... Я уверен, что тут многие смогут подсказать (и подскажут) начинающему варианты реализации. В программировании всегда (почти всегда...) вариантов больше одного...
Deimos
постоялец
 
Сообщения: 132
Зарегистрирован: 17.01.2010 00:31:30

Re: Как выйти по Esc

Сообщение Леонид » 26.03.2017 20:33:04

Те, кому 40+, возможно, помнят о программируемых калькуляторах. Я тоже на них кой чего ваял. И была там серия игр Лунолет.
Вот я и хочу это воплотить на ПК. В том же духе - все консольно. Тем более, что линуксоида с 2001-го года консолькой как-то и испугать трудно.
Что касается моей проблемки, то пока решаю таким образом:
Код: Выделить всё
{$I-};            // временно отключаю проверку корректности ввода
writeln('Введите данные маневра');
writeln('Для выхода из игры вместо данных введите любую букву');
write('Время маневра, сек       : ');  readln(dt);
{$I+};            // включаю проверку корректности ввода
   if IOResult<>0 then

и дальше по сценарию - сохраняем данные игрушки в файле и выходим из программы или продолжаем работу.
Леонид
новенький
 
Сообщения: 16
Зарегистрирован: 23.03.2017 13:19:20

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru