Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 德尔菲:VK_空间,右键_Delphi - Fatal编程技术网

Delphi 德尔菲:VK_空间,右键

Delphi 德尔菲:VK_空间,右键,delphi,Delphi,我有点困惑。关于: 上面说“空间”的正确键是#20。我试过了,但没用。 然而,用#32代替它似乎是可行的: procedure TForm14.cxTextEdit5KeyPress(Sender: TObject; var Key: Char); begin if not (Key in [#8,#32, '0'..'9']) then begin ShowMessage('Only numbers !'); Key := #0; end; end; 所以现在我不确定这是否

我有点困惑。关于:

上面说“空间”的正确键是#20。我试过了,但没用。 然而,用#32代替它似乎是可行的:

procedure TForm14.cxTextEdit5KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in [#8,#32, '0'..'9']) then begin
  ShowMessage('Only numbers !');
  Key := #0;
  end;
end;
所以现在我不确定这是否适用于所有Windows版本?

是的。在所有版本的Windows中定义为
0x20
(以C表示十六进制值
20
,等于
32
)。 您的链接也列出了十六进制值

编辑

正如David指出的,虚拟键代码
VK_空间
OnKeyPress
事件处理程序的上下文中是不相关的。(使用空格字符的ASCII值定义的事实应视为巧合。)

您可以简单地依赖以下事实:
#32
是空格字符的正确表示法(也可以是
#$20
或简单地
'

上面说“空间”的正确键是#20

不,没有
#20
是顺序为20位小数的字符。您参考的表包含十六进制值
VK_空间
是一个虚拟键代码,是一个整数,十进制值为32,十六进制值为20

但是,
OnKeyPress
事件处理程序不使用虚拟键代码,
VK_SPACE
的值与您的问题无关。OnKeyPress事件处理程序使用UTF-16字符代码。空格的UTF-16字符代码是32位十进制,20位十六进制。如果使用Unicode之前的Delphi,
OnKeyPress
使用ANSI而不是UTF-16


值得记住的是,
OnKeyPress
使用UTF-16/ANSI代码,因为它对应于
WM\u CHAR
。和
OnKeyDown
onkeydup
通过从
WM\u KEYDOWN
WM\u keydup
触发来使用虚拟键代码

VK\u SPACE
是一个整数常量,
Key
Char
@TOndrej类型的变量。您可以使用
Chr(VK\u SPACE)
VK\u SPACE
转换为字符,然后执行字符对字符的比较。@SilverWarior是,或者您可以与
Ord(Key)进行比较
@TOndrej这是正确的。我认为所有这些在语义上都是错误的,因为虚拟键代码不同于字符代码。