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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2012, 00:07   #1
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию Завершение работы программы нажатием ESC

Доброго времени суток.

В общем пытаюсь заставить закрываться программу нажатием кнопки, и, так как приложение консольное, начал писать альтернативный readln:
Код:
Procedure ReadLn2(var ans:integer);
var
  sans:string;
  ch:char;
begin
//  ans:=0;
  sans:='';
  ch:=' ';//своего рода обнуление
  repeat
    if (ch=#8)and(length(sans)>0) then
      begin
        delete(sans,length(sans),1);
        gotoxy(wherex-1,wherey);
        write(' ');
        gotoxy(wherex-1,wherey);
      end;
      
    ch:=readkey;
    if ch in ['0'..'9'] then
      sans:=sans+ch; 
      
    if {(ch<>#27)and(ch<>#13)} ch in ['0'..'9'] then
      write(ch);
      
      
  until ((ch=#13) and (length(sans)>0))or(ch=#27);
  
  
  if ch=#27 then
    ans:=-9999 // При данной постановке задачи такой ответ получиться не может.
  else  
    if length(sans)>0 then  
      ans:=strtoint(sans);

 
  writeln;
  writeln(ans);

end;
Поясню, как это работает. При вводе мне нужны только цифры 0..9.
Если жмем ентер - число введено до конца, сохраняем в переменную. Ничего не введено - ничего не происходит.
Ескейп - присваиваем вводимому числу значение -9999, что в последующем приведет меня к закрытию программы.

Backspace (#8) - самое интересное. Если длина строки равна нулю (ничего не введено), то ничего не делает. В противном случае удаляет из строки последний символ и затирает символ в самой консоли, при помощи GoToXY (прошу не бросаться камнями, это не GoTo).

Так вот, все отлично работет, пока полоса прокрутки стоит на месте. Потом имеем следующее: жмем backspace, коретка уползает вправо при каждом нажатии, через несколько шагов (как оказалось - равному количеству цифр) останавливается. Причем вводимая строка редактируется нормально, но в консоли отображается совсем не так, как надо.

В чем может быть ошибка?

Да, среда - pascalABC.net

Тело программы (фрагмент, крутищийся в цикле):
Код:
          write(intX,'-',intY,'=');
          readln2(intANS);
          if intANS=-9999 then
            begin
              ch:=#27;
              break;
            end;

Update: попробовал во Free Pascal, все работает без проблем...
Все тривиальное просто

Последний раз редактировалось whatever; 30.04.2012 в 01:18.
whatever вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Завершение работы программы без формы FaTaL Общие вопросы Delphi 5 21.06.2011 09:55
Закрытие программы по Esc VovanZ Общие вопросы Delphi 2 14.02.2010 20:55
Выход из цикла нажатием ESC Banderas123 Помощь студентам 2 05.12.2009 22:44
При завершение работы программы появляется окно Microsoft Visual C++ Debug Library TheWanderer Visual C++ 2 25.11.2008 00:27
Завершение работы чужой программы Viteef Win Api 12 24.09.2007 12:31