【问题标题】:How to identify unicode keys on key press?如何识别按键上的unicode键?
【发布时间】:2010-02-03 09:43:31
【问题描述】:

我的应用程序使用 unicode 字符,并且我有几个文本字段,我想限制用户输入特殊字符,例如 :'";

begin
    if not (Key in ['a'..'z','A'..'Z',' ','0'..'9',#13,#8]) then
        Key := #0;
    if Key = #13 then
        bOk.Click;
end;

所以此时它允许用户添加空格并使用退格键擦除,当然还有 Enter 键确认。

我也想输入几个 unicode 字符。 ą, č, ė, į, š, ų, ū, ž 和他们的大写替代品,但只是像这样将它们添加到集合中......

Key in ['a'..'z','A'..'Z',' ','0'..'9',#13,#8,'ą'..'ž','Ą'..'Ž']

...什么都不做,我仍然无法在文本字段中写下这些符号。

我想知道如何解决这个问题。有没有办法判断按下的键是否是我正在寻找的 unicode 字符?

谢谢

【问题讨论】:

  • 请注意,在 D2009 中一般应使用CharInSet。编译器会就此向您发出警告。 CharInSet 仅适用于 ANSI 字符集。 utku_karatas 的答案是正确的方法。
  • +1 @Smasher:回答一下就行了。

标签: delphi unicode delphi-2009


【解决方案1】:

如果您使用的是 D2009 或更高版本,则有一个名为 Character 的单元,其中包含 IsLetterOrDigitIsLetter 等函数。所有这些都专门处理什么你需要。

【讨论】:

  • 谢谢,我已经阅读了关于“字符”的帮助文件,它解决了我的问题。我已经改变了我的'if'语句,如下所示:'if not IsLetterOrDigit(Key) and not CharInSet(Key,[#8,#13,' ']) then'。
【解决方案2】:

编译应用时请注意提示和警告。忽略它们就是忽略潜在的问题

您应该收到“WideChar 已缩减为字节字符...”的警告。这就是问题所在:Key 在您的 set 操作中不再是 Unicode!

警告建议您使用CharInSet;您还可以查看TCharacter(具有识别某些字符类别的类函数的特殊类)。如果这些都不符合您的要求,则使用包含所有 有效 字符的字符串常量,并使用Pos 函数确定Key 是否存在。

最后,您可能更愿意考虑排除特定字符,而不是尝试考虑要包含的每个特定字符。

【讨论】:

  • 也很有帮助的答案。谢谢你。在我想允许或限制写入某些字符的情况下,具有特定字符和 Pos 函数的字符串非常方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 2020-10-03
  • 2015-04-16
  • 1970-01-01
  • 2021-05-11
  • 2021-12-04
  • 1970-01-01
相关资源
最近更新 更多