Программа не реагирует на нажатие клавиш - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Ситуация в том что программа не реагирует на нажатие клавиш, за исключением определенных случаев. 1) если не вызывать ф-цию stPop (либо дважды вызывать перед ней stPush) 2) если превратить ф-ции stPop и stPush в процедуры (вырезав только

result:=

) 3) если подключить модуль crt, и использовать родной readkey из стандартной библиотеки crt Собственно вопрос в том, в чём может быть дело (и есть ли грубые ошибки)? Понимаю, что моя ф-ция readkey "кривая", но если дело в ней то почему программа корректно работает в первых двух случаях ? fpc 2.6.4
Листинг программы
  1. {$MODE OBJFPC}
  2. program main;
  3. //uses crt;
  4. uses keyboard;
  5. type
  6. PList = ^TList;
  7. TList = record
  8. Data: byte;
  9. prev: PList;
  10. Next: PList;
  11. end;
  12. var
  13. c:char;
  14. dat:byte;
  15. st:Plist;
  16. function readkey(iswait: boolean = False): char;
  17. var
  18. key: tkeyevent;
  19. begin
  20. if iswait = True then
  21. Key := PollKeyEvent;
  22. if key <> 0 then
  23. begin
  24. Key := GetKeyEvent;
  25. Key := TranslateKeyEvent(Key);
  26. end;
  27. Result := GetKeyEventChar(Key);
  28. end;
  29. function stEmpty(aList: Plist): boolean;
  30. begin
  31. Result := (aList = nil);
  32. end;
  33. function stPush(var aList: PList; aData: byte): PList;
  34. var
  35. p: PList;
  36. begin
  37. new(p);
  38. p^.Data := aData;
  39. p^.prev := aList;
  40. alist := p;
  41. Result := p;
  42. end;
  43. function stPop(var aList: PList; var aData: byte): PList;
  44. var
  45. p: PList;
  46. begin
  47. Result := nil;
  48. if stEmpty(aList) then
  49. exit;
  50. p := alist;
  51. alist := alist^.prev;
  52. Result := p^.prev;
  53. dispose(p);
  54. end;
  55.  
  56. begin
  57. initkeyboard;
  58. stPop(st,dat);
  59. repeat
  60. c:=readkey;
  61. //------
  62. until c=#27;
  63.  
  64. end.
Конечно можно обойти эту проблему, воспользовавшись любым из трех вышеперечисленных вариантов. Но меня больше волнует не решение, меня вгоняет в ступор такое странное и "не логичное" поведение программы.(особенно второй пункт, с банальной заменой ф-ций на процедуры).

Решение задачи: «Программа не реагирует на нажатие клавиш»

textual
Листинг программы
  1. {$MODE OBJFPC}
  2. program main;
  3.  
  4. uses
  5.   KeyBoard;
  6.  
  7.   function ReadKey(IsWait: boolean = False): char;
  8.   var
  9.     Key: TKeyevent;
  10.   begin
  11.     Key := GetKeyEvent;
  12.     Key := TranslateKeyEvent(Key);
  13.     Result := GetKeyEventChar(Key);
  14.   end;
  15.  
  16. var
  17.   c: char;
  18. begin
  19.   InitKeyBoard;
  20.   repeat
  21.   until ReadKey = #27;
  22. end.

Объяснение кода листинга программы

  1. Объявлена функция ReadKey(IsWait: boolean = False) которая принимает параметр IsWait типа boolean со значением по умолчанию равным False.
  2. Внутри функции объявлена переменная Key типа TKeyEvent.
  3. Вызывается функция GetKeyEvent для инициализации переменной Key.
  4. Вызывается функция TranslateKeyEvent для преобразования значения переменной Key.
  5. Вызывается функция GetKeyEventChar для получения символа из события клавиатуры.
  6. Результат записывается в переменную Result.
  7. Функция возвращает результат.
  8. В основной программе объявлена переменная c типа char.
  9. Вызывается функция InitKeyBoard для инициализации клавиатуры.
  10. В цикле repeat вызывается функция ReadKey до тех пор, пока она не вернет значение #27.
  11. Цикл повторяется до тех пор, пока не будет нажата клавиша Esc.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы