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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2013, 15:50   #1
Evgenuych96
Пользователь
 
Регистрация: 07.10.2012
Сообщений: 37
Радость Чтение данных с клавиатуры без прерывания

Здравствуйте, мне хочется узнать, каким образом можно проверить какая клавиша нажата, без ожидания нажатия оной(как делает функция readkey). Тобеж будет цикл который проверяет буфер в котором должна хранится клавиша, и если там ничего нет то цикл запускается по новой до тех пор пока нужная клавиша не будет нажата. Можно ли реализовать это используя BIOS ? И если да то как? Скажу сразу, модуль Dos не предлагать, т.к. у меня Linux.
Компилятор: Free Pascal
Заранее спасибо!

Последний раз редактировалось Evgenuych96; 04.01.2013 в 16:01.
Evgenuych96 вне форума Ответить с цитированием
Старый 05.01.2013, 00:43   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Возможно поможет KeyPressed.
Функция возвращает true, если клавиша была нажата.

Функция ReadKey - позволяет прочитать код из буфера.
Ежели была нажата функциональная клавиша, то
первое применение ReadKey возвращяет 0, а повторное - символ.

Т.е., наприер,
Код:
repeat {ожидаем нажатия клавиши}
until KeyPressed();
funkey := false;
ch := ReadKey(); {читаем первый раз}
if ch = '0' then {только если нажата функ. клавиша}
begin
   ch := ReadKey();
   funkey := true;
end;
if funkey then
   writeln("Presset FunKey. Char is: ", ch)
else
   writeln("                Char is: ", ch);

Возможно, что вопрос понят не так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 05.01.2013, 10:51   #3
Evgenuych96
Пользователь
 
Регистрация: 07.10.2012
Сообщений: 37
По умолчанию

Благодарю, хоть это и не совсем то, но возможно сработает=)
Evgenuych96 вне форума Ответить с цитированием
Старый 05.01.2013, 11:05   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Evgenuych96 Посмотреть сообщение
Благодарю, хоть это и не совсем то, но возможно сработает=)
Это именно то, что Вы ищите!
Согласитесь, трудно прочитать клавишу, которую ЕЩЁ НЕ нажали.
А функция keypressed проверяет, если ли нажатые клавиши в буфере клавиатуры, НЕ ОСТАНАВЛИВАЯ выполнение программы (функция ничего не ждёт - проверила - пустой буфер/очередь клавиатуры или нет).


только VictorR наделал в коде множество мелких ошибок (вероятно, писал код прямо в браузере).
ну и использовать repeat until keypressed, разумеется НЕ НУЖНО, ведь вам не нужно ждать нажатия клавиши.
в целом схема использовать может выглядеть примерно так:
Код:
uses crt;

var ch : char;
  funkey : boolean;
  FinishGame : boolean;
begin

FinishGame := false;
repeat  {главный цикл игры}

  ... тут действия, которые должны выполняться в
      игровом цикле, без остановки на ожидание нажатия клавиши
  например, непрерывная выдача точки на экран, чтобы было видно, что программа ничего не ждёт
  Write('.'); Delay(50);

  if KeyPressed then begin {если клавиша нажата, то обработать её}
       funkey := false;
       ch := ReadKey; {читаем первый раз}
       if ch = #0 then {только если нажата функ. клавиша}
         begin
           ch := ReadKey;
           funkey := true;
        end;


    ... тут реакция программы на нажатую клавишу.
        код клавиши в ch (признак функциональная или нет в funkey ) 
     например, выход из цикла 

    if ch=#27 then {если клавиша ESC}
       FinishGame := true;
        
  end;
    

until FinishGame; {конец игры}
WriteLn('Game is over. Press any key to exit...');
ReadKey
end.

Последний раз редактировалось Serge_Bliznykov; 05.01.2013 в 11:21.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.01.2013, 12:28   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Serge_Bliznykov
Цитата:
только VictorR наделал в коде множество мелких ошибок (вероятно, писал код прямо в браузере).
Прошу простить. В час ночи уже не так внимателен.
Писал по памяти, а когда то, для вывода кодов функциональных клавиш
Код:
ch := ReadKey();
if ch = #0 then
begin
   ch := ReadKey();
   writeln('Presset FunKey. Char is: ', ch, ' -- ', Ord(ch));
end;
и последующего управления меню, правда с использованием Case.

Так тоже бывает ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подмена прерывания клавиатуры Teor Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 28.02.2011 00:09
<b>Осуществление ввода с клавиатуры без последующего подтверждения(без ENTER)</b> khorolpavel Общие вопросы C/C++ 2 30.12.2010 12:04
TASM. Перепрограммирование DOS прерывания клавиатуры Dimon12345 Помощь студентам 1 03.12.2010 18:04
Чтение данных типа double введенных с клавиатуры Vinnipux Общие вопросы по Java, Java SE, Kotlin 1 16.11.2010 08:22
Обработчик прерывания Клавиатуры paska Паскаль, Turbo Pascal, PascalABC.NET 2 04.07.2010 19:35