首页 > 解决方案 > 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.

我按了向上箭头键。

标签: pascal

解决方案


我按下了向上箭头键

键盘上的某些键会生成所谓的扩展键。箭头键(除其他外)就是这样的键。他们返回两个字符,而不是一个。第一个字符是 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直接调用。


推荐阅读