Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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中禁用某些键_Delphi_Delphi 7 - Fatal编程技术网

如何在delphi中禁用某些键

如何在delphi中禁用某些键,delphi,delphi-7,Delphi,Delphi 7,我在我的程序中添加了以下代码,据我所知,这些代码必须禁止输入字母。 我将窗体的KeyPreview属性设置为True, 接下来我添加了这个代码 procedure FormKeyPress(Sender: TObject; var Key: Char) ; 定义为 procedure TFibo.FormKeyPress(Sender: TObject; var Key: Char); begin if Key in ['a'..'z'] then Key := #0 end;

我在我的程序中添加了以下代码,据我所知,这些代码必须禁止输入字母。 我将窗体的KeyPreview属性设置为True, 接下来我添加了这个代码

procedure FormKeyPress(Sender: TObject; var Key: Char) ;
定义为

 procedure TFibo.FormKeyPress(Sender: TObject; var Key: Char);
  begin
 if Key in ['a'..'z'] then Key := #0
  end;
这似乎不起作用,因为我可以在表单的编辑组件中输入a-z;我做错了什么

这是我的程序代码

 unit Unit1;

 interface

 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls;

 type
   TFibo = class(TForm)
   lblInput: TLabel;
   edtInput: TEdit;
   procedure FormKeyPress(Sender: TObject; var Key: Char) ;
 end;

var
  Fibo: TFibo;

implementation

{$R *.dfm}

procedure Tfibo.FormKeyPress(Sender:TObject;var Key:char);
begin
  if Key in ['a'..'z', 'A'..'Z'] then
    Key := #0
end;

end.

你没有提到Delphi版本。如果您使用的是Unicode之前的版本,只需确保同时处理小写和大写字符,如下所示:

if Key in ['a'..'z', 'A'..'Z'] then Key := #0;
如果使用Unicode delphi,请包含
字符
单元,然后尝试以下操作:

if TCharacter.IsLetter(Key) then Key := #0;
或者您可以尝试使用API函数:

if IsCharAlpha(Key) then Key := #0;

您的代码运行良好,因为它阻止了“a”到“z”。也许您的问题是它不阻止大写字符。为此,您需要:

if Key in ['a'..'z', 'A'..'Z'] then
  Key := #0

在字里行间阅读时,似乎希望允许使用大写字母,但不允许使用小写字母。与其过滤小写字符,为什么不将editbox的
CharCase
属性设置为
ecUpperCase
?这样,输入的所有字符都转换为大写。

问题得到解决。在事件选项卡中设置
OnKeyPress
事件有效


使用表单的对象检查器设置OnkeyPress事件。我已经编写了代码,但没有通过对象检查器分配事件。因此,事件未注册,也未触发

您使用的是什么版本的Delphi?它在D5和D2009中都能工作。
如果不能(输入['0'..'9','.'.]),那么将其限制为数字和小数点不是更好的选择吗?否则,你会阻止e而不是ë…而不是回答问题,结束这个问题的正确方法是你自己用答案回答问题,然后接受这个答案。。。。或者请Marjan善意地将她的评论转化为可以接受的答案。@Cosmin@Marjan是的,那会更好。我特别说过我可以输入a-z;我从来没有提到过A-Z。@sunandan问题是,如果你采取你提到的步骤,那么“A”到“Z”就会被阻止。在一个空的应用程序中试用。@sunandan:您确定FormKeyPress事件处理程序已连接到窗体的事件吗?如果处理程序没有执行,则代码不会执行任何操作,因为流媒体系统没有分配OnKeyPress属性。使用对象检查器检查表单的OnKeyPress事件是否实际列出了FormKeyPress。@sunandan,如果您使用Unicode Delphi(2009+),则只需要
字符
单元。在Delphi 7上,第一个变体工作得非常好,实际上我在发布之前就试过了。@sunandan字符单位与Delphi 7无关。你的主要问题是你所描述的问题无法重现。请详细说明这个答案,因为它目前的形式对其他人没有帮助。我猜大多数用户都是通过双击Object Inspector中的
OnKeyPress
来创建
FormKeyPress
过程的,因为这会自动创建一个具有正确签名的过程,并选择它作为
OnKeyPress
的处理程序。请不要“窃取”Marjan在其中一条评论中提供的答案!