Страница 1 из 3
Как выйти по Esc
Добавлено: 23.03.2017 12: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.
Меня интересует возможно ли на запрос:
вместо ввода числа нажать
Esc выйти из программы. Или, как вариант, проделать какие-то манипуляции (например, сохранить результаты предыдущих вычислений в файле или еще что-нибудь), а потом выйти.
PS. Тут, в принципе, этих самых
repeat - until может и не быть вовсе - это не суть важно.
Re: Как выйти по Esc
Добавлено: 23.03.2017 22: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 11:50:12
Леонид
Этот номер не проходит. Тем более ненужны тут Left/Right.
Функция ReadKey считывает, на сколько я знаю (а в паскале знаю я очень мало), только первое нажатие клавиши (как-то так). А как тогда ввести 2-х, 3-ч и проч. значные числа?
Если б было все так просто, я бы не спрашивал.
Re: Как выйти по Esc
Добавлено: 24.03.2017 16:12:52
MysticCoder
while do в помощь
Re: Как выйти по Esc
Добавлено: 24.03.2017 17:55:57
Снег Север
Что не проходит? Вы спросили - как выйти по Esc, пример это показывает. Если надо читать строку, определите переменную типа string и добавляйте ей символы, если это не #27. Как-то так.
Re: Как выйти по Esc
Добавлено: 24.03.2017 18:20:36
Леонид
Снег Север , я в примере, вообще-то, написал, что там переменные real. Это числа, с которыми в дальнейшем проделываем вычисления.
Re: Как выйти по Esc
Добавлено: 24.03.2017 18:31:42
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 06:28:38
Снег Север
Леонид писал(а):Снег Север , я в примере, вообще-то, написал, что там переменные real. Это числа, с которыми в дальнейшем проделываем вычисления.
Процедура VAL преобразует строковое представление числа в само число. Читаете строку и если не Esc преобразуете.
Re: Как выйти по Esc
Добавлено: 25.03.2017 10: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 11:48:36
Снег Север
Pavia писал(а):Есть два пути.
Господь с вами, тут чел явно самого элементарного не знает...

Re: Как выйти по Esc
Добавлено: 26.03.2017 01:00:16
Леонид
Снег Север писал(а):тут чел явно самого элементарного не знает...
Вашими устами глаголет истина, друг мой.
Я только изучаю паскаль. По книжкам, форумам, сайтикам разным.
Вот приспичило гуматитарию не только по образованию, но и по мозгам, в свои 55 воплотить одну хотелку/мечталку. Вот теперь пытаюсь разобраться, а не получается (что бывает не редко) пристаю к людям.
Re: Как выйти по Esc
Добавлено: 26.03.2017 01: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 07:06:58
Снег Север
Леонид писал(а):Я только изучаю паскаль. По книжкам, форумам, сайтикам разным.
Вот приспичило гуматитарию не только по образованию, но и по мозгам, в свои 55 воплотить одну хотелку/мечталку. Вот теперь пытаюсь разобраться, а не получается (что бывает не редко) пристаю к людям.
Тут вот какое дело - эти примеры из прошлого века, гораздо продуктивнее сразу начать с форм и компонентов на форме, т.е. с лазаруса. А консольный ввод осваивать только если очень приспичит, поскольку в реальной жизни он нужен примерно как умение каллиграфически писать гусиным пером...
Re: Как выйти по Esc
Добавлено: 26.03.2017 17:37:49
Deimos
Леонид писал(а):воплотить одну хотелку/мечталку
А Вы хотелку обрисуйте, хоть в двух словах... Я уверен, что тут многие смогут подсказать (и подскажут) начинающему варианты реализации. В программировании всегда (почти всегда...) вариантов больше одного...
Re: Как выйти по Esc
Добавлено: 26.03.2017 19:33:04
Леонид
Те, кому 40+, возможно, помнят о программируемых калькуляторах. Я тоже на них кой чего ваял. И была там серия игр Лунолет.
Вот я и хочу это воплотить на ПК. В том же духе - все консольно. Тем более, что линуксоида с 2001-го года консолькой как-то и испугать трудно.
Что касается моей проблемки, то пока решаю таким образом:
Код: Выделить всё
{$I-}; // временно отключаю проверку корректности ввода
writeln('Введите данные маневра');
writeln('Для выхода из игры вместо данных введите любую букву');
write('Время маневра, сек : '); readln(dt);
{$I+}; // включаю проверку корректности ввода
if IOResult<>0 then
и дальше по сценарию - сохраняем данные игрушки в файле и выходим из программы или продолжаем работу.