Программа не реагирует на нажатие клавиш - 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.