Программа не реагирует на нажатие клавиш - 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.
Объяснение кода листинга программы
- Объявлена функция ReadKey(IsWait: boolean = False) которая принимает параметр IsWait типа boolean со значением по умолчанию равным False.
- Внутри функции объявлена переменная Key типа TKeyEvent.
- Вызывается функция GetKeyEvent для инициализации переменной Key.
- Вызывается функция TranslateKeyEvent для преобразования значения переменной Key.
- Вызывается функция GetKeyEventChar для получения символа из события клавиатуры.
- Результат записывается в переменную Result.
- Функция возвращает результат.
- В основной программе объявлена переменная c типа char.
- Вызывается функция InitKeyBoard для инициализации клавиатуры.
- В цикле repeat вызывается функция ReadKey до тех пор, пока она не вернет значение #27.
- Цикл повторяется до тех пор, пока не будет нажата клавиша Esc.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д