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

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

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

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

result:=

) 3) если подключить модуль crt, и использовать родной readkey из стандартной библиотеки crt Собственно вопрос в том, в чём может быть дело (и есть ли грубые ошибки)? Понимаю, что моя ф-ция readkey "кривая", но если дело в ней то почему программа корректно работает в первых двух случаях ? fpc 2.6.4
{$MODE OBJFPC}
program main;
//uses crt;
uses keyboard;
 
type
  PList = ^TList;
 
  TList = record
    Data: byte;
    prev: PList;
    Next: PList;
  end; 
 
var
  c:char;
    dat:byte;
  st:Plist;
 
function readkey(iswait: boolean = False): char;
var
  key: tkeyevent;
begin
  if iswait = True then
    Key := PollKeyEvent;
  if key <> 0 then
  begin
    Key := GetKeyEvent;
    Key := TranslateKeyEvent(Key);
  end;
  Result := GetKeyEventChar(Key);
end; 
 
function stEmpty(aList: Plist): boolean;
begin
  Result := (aList = nil);
end;   
 
function stPush(var aList: PList; aData: byte): PList;
var
  p: PList;
begin
  new(p);
  p^.Data := aData;
  p^.prev := aList;
  alist := p;
  Result := p;
end;
 
function stPop(var aList: PList; var aData: byte): PList;
var
  p: PList;
begin
  Result := nil;
  if stEmpty(aList) then
    exit;
 
  p := alist;
  alist := alist^.prev;
  Result := p^.prev;
  dispose(p);
 
end;

begin
initkeyboard;
stPop(st,dat);
 
repeat
c:=readkey;
//------
until c=#27; 

end.
Конечно можно обойти эту проблему, воспользовавшись любым из трех вышеперечисленных вариантов. Но меня больше волнует не решение, меня вгоняет в ступор такое странное и "не логичное" поведение программы.(особенно второй пункт, с банальной заменой ф-ций на процедуры).

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

textual
Листинг программы
{$MODE OBJFPC}
program main;
 
uses
  KeyBoard;
 
  function ReadKey(IsWait: boolean = False): char;
  var
    Key: TKeyevent;
  begin
    Key := GetKeyEvent;
    Key := TranslateKeyEvent(Key);
    Result := GetKeyEventChar(Key);
  end;
 
var
  c: char;
begin
  InitKeyBoard;
  repeat
  until ReadKey = #27;
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
Похожие ответы