Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
 Аватар для lartia
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210

Как выйти по Esc

23.03.2017, 10:46. Показов 4926. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим есть некая программка (в данный момент нет никакой программки - это просто для примера):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.
И все бы замечательно, но возник вопрос - а можно ли сделать преждевременный выход из программки? Вдруг я или кто-то передумал что-то делать и решил уйти отдохнуть.
Тут, в принципе, этих самых repeat - until может и не быть вовсе - это не суть важно.

Еще раз сформулирую вопрос - можно ли вместо ввода данных нажать Esc и выйти из программы?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2017, 10:46
Ответы с готовыми решениями:

Как выйти из цикла при нажатии клавиши ESC
Доброго времени дня. Поясните, как выйти из цикла при нажатии клавиши ESC void GetStr() { char *array_str; char str; int...

Как выйти в биос? F2,F10,DEL,ESC,F1 не подходят.
Ноутбук roverbook pro. Без понятия как выйти биос. Может кто знает ещё какую-нибудь комбинуацию?

Как сделать выход по ESC
org 100h old dw 0 jmp start number dw 0 c dw 0 start: xor ax,ax mov es,ax cli

18
CAPITAL OF ROCK!
 Аватар для JokeR.BY
1281 / 708 / 982
Регистрация: 03.03.2010
Сообщений: 2,286
23.03.2017, 11:14
ctrl+c чем не устраивает?
0
 Аватар для lartia
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
23.03.2017, 11:22  [ТС]
Тем, что это не красиво. Так и по крестику можно ляпнуть.
Меня интересует - можно ли это сделать программно?
0
CAPITAL OF ROCK!
 Аватар для JokeR.BY
1281 / 708 / 982
Регистрация: 03.03.2010
Сообщений: 2,286
23.03.2017, 11:37
можно набросать что-то в подобном стиле. пробовалось в FPC, за остальные не уверен.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uses
    Crt;
procedure Wait;
begin
    Delay(100);
    if (KeyPressed And (ReadKey = #27))
    then
        Halt;
end;
var
    i: Byte;
begin
    i := 0;
    while (i = 0) do
    begin
        Write(i);
        Wait;
    end;
end.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,926
Записей в блоге: 13
23.03.2017, 12:04
Тут пример Работа с модулем Crt
Так выглядит командный цикл
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  {программный цикл}
  repeat
    {какая-то обработка текущей ситуации, не зависящая от кнопок}
    .................
    {получить команду от нажатий на клавиатуре и обработать её}
    case GetCmd of
      cmdUp:
        if WhereY > 1 then
          GoToXY(WhereX, pred(WhereY));
      cmdDown:
        if WhereY < hi(WindMax) + 1 then
          GoToXY(WhereX, succ(WhereY));
      cmdLeft:
        if WhereX > 1 then
          GoToXY(pred(WhereX), WhereY);
      cmdRight:
        if WhereX < lo(WindMax) + 1 then
          GoToXY(succ(WhereX), WhereY);
      cmdExit: break;
    end;
  until False;
0
 Аватар для lartia
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
23.03.2017, 12:12  [ТС]
Программулина тупо рисует нули и выходит по Esc.
А как то, что Вы тут представили, относится к моему вопросу?
Меня интересует возможно ли на запрос:
Pascal
1
write('Ввести число а: '); readln(a);
вместо ввода числа нажать Esc выйти из программы. Или, как вариант, проделать какие-то манипуляции (например, сохранить результаты предыдущих вычислений в файле или еще что-нибудь), а потом выйти.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,926
Записей в блоге: 13
23.03.2017, 12:27
Вам придётся создать собственный редактор строки ввода, обрабатывая курсорные стрелки, забой, Esc, символы.
Что-то вроде
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
procedure InputStr(var s: string; MaxLen, Attr: byte);
var
  x0, y0, k: byte;
  x, y: byte;
  ch: char;
  OldCursor: TCursorInfo;
begin
  SaveCursorInfo(OldCursor);
  SetNormalCursor;
  x0 := WhereX;
  x  := x0;
  y0 := WhereY;
  y  := y0;
  s  := '';
  for k := Length(s) + 1 to MaxLen do
    s := s + ' ';
  WriteChar(x0, y0, MaxLen, ' ', Attr);
  k := 1;
  ClearKey;
  repeat
    WriteStr(x0, y0, s, Attr);
    GotoXY(x0 + k - 1, y0);
    repeat
    until KeyPressed;
    ch := ReadKey;
    if ch = #0 then
    begin
      ch := ReadKey;
      case ch of
        kbArrowLeft: if k <> 1 then
            Dec(k);
        kbArrowRight: if k <> MaxLen then
            Inc(k);
        kbDel:
        begin
          Delete(s, k, 1);
          s := s + ' ';
        end;
        kbIns:
        begin
          if s[MaxLen] = ' ' then
          begin
            Delete(s, MaxLen, 1);
            Insert(' ', s, k);
          end;
        end;
      end;
    end
    else
    begin
      if ch > #31 then
      begin
        s[k] := ch;
        if k <> MaxLen then
          Inc(k);
      end
      else
      begin
        if ch = kbBackSpace then
        begin
          if k <> 1 then
          begin
            Dec(k);
            Delete(s, k, 1);
            s := s + ' ';
          end;
        end;
      end;
    end;
  until (ch = kbEnter) or (ch = kbEsc);
  if ch = kbEnter then
    TruncEnd(s)
  else
    s := '';
  RestoreCursorInfo(OldCursor);
end;
Добавлено через 4 минуты
Или так - пример ввода чисел
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
program lab;
 
uses
  CRT;
 
const
  ESC = #27;
  ENTER = #13;
  BACKSPACE = #8;
type
  TSetOfChar = set of char;
 
  procedure EnterStr(var s: string; MaxLen: integer; const availableChars: TSetOfChar);
  var
    ch: char;
  begin
    s := '';
    repeat
      repeat
      until KeyPressed;
      ch := ReadKey;
      if ch in availableChars then
      begin
        if Length(s) < MaxLen then
        begin
          Write(ch);
          s := s + ch;
        end;
      end;
      if ch = BACKSPACE then
      begin
        Write(ch);
        ClrEOL;
        Delete(s, length(s), 1);
      end;
      if ch = #0 then
        ReadKey;
    until (ch = ENTER) or (ch = ESC);
    if ch = ESC then
      s := '';
    if ch = ENTER then
      writeln;
  end;
 
  function EnterNumber(const availableDigits: TSetOfChar): byte;
  var
    a: byte;
    s: string;
  begin
    EnterStr(s, 2, availableDigits * ['0'..'9']);
    Val(s, a);
    EnterNumber := a;
  end;
 
var
  a:  byte;
  s:  string;
  i:  integer;
  Chars: set of '0'..'9';
  ch: char;
begin
  writeln(EnterNumber(['0'..'5', 'a']));
end.
0
 Аватар для lartia
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
23.03.2017, 12:30  [ТС]
ФедосеевПавел о стрелках и прочему, по-моему, речь не шла...
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8665 / 4502 / 1670
Регистрация: 01.02.2015
Сообщений: 13,926
Записей в блоге: 13
23.03.2017, 12:48
Чтобы организовать ввод числа, в ходе которого возможно нажатие ESC, потребуется отказаться от readln и написать собственный "readln" с обработкой ESC, стрелок, BackSpace и прочего.

Добавлено через 7 минут
Проблема вашего кода по отношению к выходу по нажатию ESC в том, что вы оператором readln очищаете буфер клавиатуры и в другом месте уже не узнать, нажимался ли ESC при вводе чисел. А в дальнейшем в цикле выполняется какой-то расчёт.

Если же вы хотите отдельно обрабатывать нажатие ESC в каком-то цикле с длительными вычислениями, то можно так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
program proba;
uses Crt;
var
  a,b,c:real;
 
begin
repeat
    write('Ввести число а: '); readln(a);
    write('Ввести число b: '); readln(b);
    write('Ввести число c: '); readln(c);
    .......         { тут что-нибудь делаем с этими переменными;
    .......           сейчас это неважно. }
    while () do
    begin
      длительные вычисления в цикле
      if KeyPressed then
        if readkey=ESC then
          break;
    end; {while}
until ...;
end.
1
 Аватар для lartia
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
23.03.2017, 13:02  [ТС]
Т. е. без извращений никак? Жаль.
Спасибо за уделенное время и внимание.
0
 Аватар для lartia
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
27.03.2017, 14:54  [ТС]
В догонку.

Если, вдруг, кому станет интересно.

Совместными усилиями с интернетами и людьми вроде бы решили эту проблемку так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
program proba;
uses Crt;
var
   ch :char;
   str :string;
   n, Code  :integer;
   a :real;
function input :string;
 
begin
  input := '';
  repeat
    ch := readkey;
    if (ch<>#13) and (ch<>#27) then
    begin
       input := input + ch;
       write(ch);
    end
    else
    if (ch=#27) then
       input := ch;
  until (ch=#13) or (ch=#27);
end;
begin
  repeat
     writeln('Нажмите Esc или Enter для выхода из программы.');
     writeln('---------------------------------------------');
     write('Введите целое число : ');
     str := input;
     if (str='') or (str[1]=#27) then
        continue;
     val(str, n, code);
     writeln;
     if code<>0 then
        writeln('Error at position ',code)
     else
        writeln('Вы ввели ',n);
     writeln('---------------------------------------------');
     writeln('Введите дробное число : ');
     str := input;
     if (str='') or (str[1]=#27) then
        continue;
     val(str, a, code);
     writeln;
     if code<>0 then
        writeln('Error at position ',code)
     else
        writeln('Вы ввели ',a:1:5);
    writeln;
{...}
  until (str='') or (str[1]=#27);
end.
Профи в этом деле прошу раскритиковать/обругать/подсказать/подправить.
Остальным - пользуйтесь на здоровье.

PS. Ваялось в FreePascal'е, но, я думаю, может пригодиться всем заинтересованным.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
27.03.2017, 17:43
lartia,
не оставили шанса не то что на стрелочки, но даже на Backspase... Жестоко.
Сделаны первые пошага ровно в ту сторону, о чем сказали выше
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
потребуется отказаться от readln и написать собственный "readln" с обработкой ESC, стрелок, BackSpace и прочего
0
 Аватар для lartia
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
27.03.2017, 23:19  [ТС]
не оставили шанса не то что на стрелочки, но даже на Backspase...
Сделаны первые пошага ровно в ту сторону, о чем сказали выше
Ровно то, что мне необходимо. И для меня это не полшага, а шажище.

Я уже придумал куда это сунуть. Но... Есть только один нюанс - сделано это для программы, а нужно теперь придумать, как это провернуть из процедуры.
Т. е. программа содержит вычислительную процедуру из которой вызывается процедура ввода данных:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
program proba;
uses Crt;
var
  a,b,c,aaa,bbb:real;
 
procedure VvodDannyh;
begin
    write('Ввести число а: '); readln(a);
    write('Ввести число b: '); readln(b);
    write('Ввести число c: '); readln(c);
end;
 
procedure Summa; {это может быть и функция - не суть важно}
begin
    VvodDannyh;
    aaa:=a+b+c;
end;
 
procedure Proizvedenie; {это может быть и функция - не суть важно}
begin
    VvodDannyh;
    bbb:=a*b*c;
end;
 
begin
repeat
    Summa;
    Proizvedenie;
    writeln('Сумма Ваших чисел равна: ', aaa:1:5);
    .......         { тут что-нибудь делаем с этими переменными;
    .......           сейчас это неважно. }
until ...;
end.
И вот тут у меня засада. Если сделать выход в процедуре VvodDannyh, то куда я выйду? Только из процедуры.
Или вставлять выход в процедуры Summa и Proizvedenie? Но так я тоже из программы не выйду. А только из процедуры.
И если, скажем, выйти из Summa, то запустится следующая - Proizvedenie. А оно мне надо? Мне надо выйти совсем. И вот тут я пока в непонятках, как лучше придумать.

Завтра попробую перечитать, что написал. Может даже сам пойму, чего хочу.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
28.03.2017, 07:04
Вариантов-то много, от кодов возврата
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function VvodDannyh: Boolean;
begin
  VvodDannyh:=False;
  ...
  if { не получили данных } then Exit;
  VvodDannyh:=True;
end;
function Summa: Boolean;
begin
  Summa:=False;
  ...
  if {почему-то не получилось} then Exit;
  Summa:=True;
end;
 
begin
  if VvodDannyh and Summa then { выводим результаты }
  else WriteLn('Cancelled: No data');
до бросания исключений
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type
  ENoData = clacc (Exception);
...
procedure VvodDannyh;
begin
  ...
  raise ENoData.Create('No data entered.');
end;
...
begin
  repeat
    ...
    try
      VvodDannyh;
      ...
    except
      on e: ENoData do
        WriteLn('Cancelled: ',e.Msg);
    end;
  until ...;
end.
0
 Аватар для lartia
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
28.03.2017, 10:15  [ТС]
Это я знаю. Но есть НО... Я выйду в программу, где запустится следующая процедура/функция. А нужно как-то совсем свалить из программы.
Пока в размышлении. Не пожар, но хотелось бы решить задачку/проблемку.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
28.03.2017, 10:31
Перечитайте.
Как же она запустится-то в приведенных и подобных примерах?
0
 Аватар для lartia
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
28.03.2017, 10:48  [ТС]
Цитата Сообщение от bormant Посмотреть сообщение
clacc
это я понимаю class?
Цитата Сообщение от bormant Посмотреть сообщение
on e: ENoData do
и вот это не понятно.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
28.03.2017, 10:51
1. Да.
2.
http://www.freepascal.org/docs... fch17.html
http://docwiki.embarcadero.com... Exceptions
...
0
 Аватар для lartia
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
28.03.2017, 11:22  [ТС]
bormant. Нашел про это на человеческом языке (с английским у меня совсем никак - в школе меня пытались учить немецкому и испанскому). Буду пробовать разобраться. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.03.2017, 11:22
Помогаю со студенческими работами здесь

у меня два вопроса. 1) как сделать выход по нажатию клавии ESC 2) как вывести ответ.
вот код ideal model small stack 256 dataseg op1 db 1 op2 db 1 op3 db 1 op4 db 1

Esc как символ конца ввода
Доброго времени суток. Есть такой вопрос. Как мне закончить ввод при нажатии esc. Например, если пользователь вводит некий текст (через cin...

Как в switch обработать клавишу Esc?
#include &lt;iostream&gt; using namespace std; class tollBooth { private: unsigned int cars; double amount; public: ...

Терминал. Esc-последовательность. Как сделать?
Как сделать програмку, которая при запуске из терминала будет выводить слово &quot;Пример&quot;. На 5 строчек вниз, на 10 символов вправо,...

Как сделать выход из формы по нажатию Esc?
То есть как запустить функцию выхода по нажатию Esc в программе, срабатывающею при нажатии кнопки выход (то есть мою функцию)?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru