Страница 1 из 3

Как выйти по 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 может и не быть вовсе - это не суть важно.

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

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

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

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

СообщениеДобавлено: 24.03.2017 17:12:52
MysticCoder
while do в помощь

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

СообщениеДобавлено: 24.03.2017 18:55:57
Снег Север
Что не проходит? Вы спросили - как выйти по Esc, пример это показывает. Если надо читать строку, определите переменную типа string и добавляйте ей символы, если это не #27. Как-то так.

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

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

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

СообщениеДобавлено: 24.03.2017 19:23:02
vitaly_l
Код: Выделить всё
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 секунд:
Но даже так работать не будет

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

СообщениеДобавлено: 25.03.2017 07:28:38
Снег Север
Леонид писал(а):Снег Север , я в примере, вообще-то, написал, что там переменные real. Это числа, с которыми в дальнейшем проделываем вычисления.
Процедура VAL преобразует строковое представление числа в само число. Читаете строку и если не Esc преобразуете.

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

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

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

СообщениеДобавлено: 25.03.2017 12:48:36
Снег Север
Pavia писал(а):Есть два пути.
Господь с вами, тут чел явно самого элементарного не знает... :shock:

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

СообщениеДобавлено: 26.03.2017 02:00:16
Леонид
Снег Север писал(а):тут чел явно самого элементарного не знает...


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

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

СообщениеДобавлено: 26.03.2017 02:12:50
tema
Код: Выделить всё
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

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

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

Тут вот какое дело - эти примеры из прошлого века, гораздо продуктивнее сразу начать с форм и компонентов на форме, т.е. с лазаруса. А консольный ввод осваивать только если очень приспичит, поскольку в реальной жизни он нужен примерно как умение каллиграфически писать гусиным пером...

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

СообщениеДобавлено: 26.03.2017 18:37:49
Deimos
Леонид писал(а):воплотить одну хотелку/мечталку

А Вы хотелку обрисуйте, хоть в двух словах... Я уверен, что тут многие смогут подсказать (и подскажут) начинающему варианты реализации. В программировании всегда (почти всегда...) вариантов больше одного...

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

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

и дальше по сценарию - сохраняем данные игрушки в файле и выходим из программы или продолжаем работу.