Pascal readkey命令问题

Pascal readkey命令问题,pascal,Pascal,我使用readkey命令两次。 第一次可以,第二次就不行了。 我希望该程序等待我的按键,但程序会自动结束 代码: 程序窗口1; 使用阴极射线管; 变量x,y:整数; 开始 clrsc; 窗口(1,1,80,25); readkey; //只写窗口边框 对于x:=1到80 do 对于y:=1到25 do 开始 如果(x>=2)和(x=2)和(y 我按了向上箭头键 键盘上的一些键生成所谓的扩展键。箭头键(以及其他键)就是这样的键。它们返回两个字符,而不是一个。第一个字符是ASCII 0,第二个是按下

我使用readkey命令两次。 第一次可以,第二次就不行了。 我希望该程序等待我的按键,但程序会自动结束

代码:

程序窗口1;
使用阴极射线管;
变量x,y:整数;
开始
clrsc;
窗口(1,1,80,25);
readkey;
//只写窗口边框
对于x:=1到80 do
对于y:=1到25 do
开始
如果(x>=2)和(x=2)和(y
我按了向上箭头键

键盘上的一些键生成所谓的扩展键。箭头键(以及其他键)就是这样的键。它们返回两个字符,而不是一个。第一个字符是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

你的确切意思是什么,例如,在你有机会按下一个键之前,窗口关闭,或者在你第二次按下一个键时,窗口保持在屏幕上,不应该关闭?我在Lazarus(免费Pascal的IDE)中试过你的程序,它工作得很好:它清除屏幕,等待我按下一个键,然后吸引你的注意力哦,写下“Inside window…”消息,等待我按下一个键,然后它关闭,这样对我来说效果很好。这是:在你有机会按下一个键之前,窗口关闭。程序在使用Ctrl+F9运行并返回FPC编辑器后完成其执行。我正在使用CMD(windows 10的)中的FPC进行编码作为管理员。您首先按下哪个按钮(响应第一个
ReadKey
)?您是否阅读了文档中关于
ReadKey
的说明?我已按下向上箭头键。请注意“仅接受特定键”:如果扩展密钥发送#0#13…谢谢@lin,但我认为这不是一个合理的问题,因为扫描码为13的密钥代表可打印字符,因此不会作为#00#13发送。你们是最好的!好的解决方案!它很好!我使用了WaitForAnyKey;@TomBrunberg您是对的;但从代码为$0和$48的示例来看,简单算法将无法等待“H”(ascii$48),因为它无法“记住”密钥是否被扩展。@linuxfan现在你是对的(而且从一开始就是对的)。防止这样的错误变得相当混乱。类似于检查#0,如果是,请再次阅读,但扔掉它。我会考虑它。
procedure WaitForCR; // wait for CR, Carriage Return (Enter)
const
  CR=#13;
var
  c: Char;
begin
  repeat
    c:=ReadKey;
  until c=CR;
end