Программа не реагирует на нажатие клавиш - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д