pascal - Pascal readkey 命令问题
问题描述
我两次使用 readkey 命令。它第一次工作正常,但拒绝在第二次工作。我希望该程序等待我的按键,但程序会自行结束。
代码:
program window1;
uses crt;
var x,y:integer;
begin
clrscr;
window(1,1,80,25);
readkey;
//writting just window borders
for x:=1 to 80 do
for y:=1 to 25 do
begin
if (x >= 2) and (x <= 79) and
(y >= 2) and (y <= 24) then
continue
else
begin
gotoxy(x,y);
write('*');
end;
end;
gotoxy(2,23);
write('inside window press any key to exit...');
readkey;
//readln;
end.
我按了向上箭头键。
解决方案
我按下了向上箭头键
键盘上的某些键会生成所谓的扩展键。箭头键(除其他外)就是这样的键。他们返回两个字符,而不是一个。第一个字符是 ASCII 0,第二个是按键的扫描码。
因为ReadKey
它被记录在案:
ReadKey 从键盘缓冲区中读取 1 个键,并返回它。如果已按下扩展键或功能键,则返回零 ASCII 码。然后,您可以通过第二次 ReadKey 调用读取密钥的扫描码。
我可以补充一点,ReadKey
如果键盘缓冲区为空(但仅当它为空时),它会等待输入。
因此,当您的程序第一次调用ReadKey
时,您按下“向上箭头键”,两个字节被放入缓冲区,$00 和 $48。第一个 ($00) 返回到您的代码,向上箭头的扫描代码保留在输入缓冲区中。当您稍后再次调用ReadKey
时,它会从缓冲区接收扫描代码并立即继续,而不会停止输入。
您可以通过以下两种方式之一处理此问题:
1.写一个程序,说WaitForAnyKey
处理扩展键:
procedure WaitForAnyKey;
var
c: char;
begin
c:=ReadKey;
if c=#0 then
c:=ReadKey;
end;
你调用它而不是ReadKey
直接调用。
2.编写一个仅等待并接受特定密钥的过程:
procedure WaitForCR; // wait for CR, Carriage Return (Enter)
const
CR=#13;
var
c: Char;
begin
repeat
c:=ReadKey;
until c=CR;
end
你调用它而不是ReadKey
直接调用。
推荐阅读
- python - 我们如何在 Python 中定义函数之前调用它们?
- javascript - 到达最后一张图片后,如何让我的图片库滑块循环播放而不反转动画?
- time-complexity - 计算给定输入的图灵机的时间复杂度
- javascript - WebWorkers with angular 2+
- docker - 使用 m4 构建 Dockerfiles 的 Makefile 未重建
- generics - 从 Kotlin 中的通用扩展函数/方法派生函数引用
- java - 在 gradle 中获取现有构建
- c - 比较字符串和 C 中的字符
- excel - excel获取每天对应时间的最大值
- laravel - 如何在实时服务器 cpanel 中使用 barryvdh/laravel-snappy 包