Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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 5 - Fatal编程技术网

如何验证Delphi中的文本框仅包含数字?

如何验证Delphi中的文本框仅包含数字?,delphi,delphi-5,Delphi,Delphi 5,也许这是一个很简单的问题,但我从未接触过德尔菲。 我有一个编辑框,可以接受字符。但在某些特殊情况下,我必须验证编辑框字符仅为数字 我们怎么能做到呢 注意:用户可以输入任何字符,但在验证时,我必须验证上面的字符。我不知道您打算使用什么事件来调用验证,但验证可以这样完成: if TryStrToInt(Edit1.Text, Value) then DoSomethingWithTheNumber(Value) else HandleNotANumberError(Edit1.Text);

也许这是一个很简单的问题,但我从未接触过德尔菲。 我有一个编辑框,可以接受字符。但在某些特殊情况下,我必须验证编辑框字符仅为数字

我们怎么能做到呢


注意:用户可以输入任何字符,但在验证时,我必须验证上面的字符。

我不知道您打算使用什么事件来调用验证,但验证可以这样完成:

if TryStrToInt(Edit1.Text, Value) then
  DoSomethingWithTheNumber(Value)
else
  HandleNotANumberError(Edit1.Text);

我知道您说过,
用户可以输入任何字符,但在验证时

然而,我想提供另一种选择,因为允许用户输入值,却在1分钟后向用户投诉,这似乎非常愚蠢;闻起来真香。。。不太好

我不允许输入除数字以外的任何内容。
如果你有特别简单的整数:

填写编辑框的OnKeyPress事件

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char) ;
begin
  if not(Key IN ['0'..'9', #8, #9, #13, #27, #127]) then key:= #0;
end;
这会丢弃任何不是数字的东西

如果允许使用负数,则需要额外检查
-
之前是否未输入

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char) ;
var
  Edit1Text: string;
begin
  if (Key = '-') and Pos('-',Edit1.Text) = 0 then begin
    Edit1.Text:= '-' + Edit1.Text;  //Force the '-' to be in the front.
  end
  else if (Key = '-') and Pos('-',Edit1.Text) <> 0 then begin  //else flip the sign
    Edit1Text:= Edit1.Text;
    Edit1.Text:= StringReplace(Edit1Text, '-', '',[]);
  end;
  if not(Key IN ['0'..'9', #8, #9, #13, #27, #127]) then key:= #0;
end;
过程TForm1.Edit1KeyPress(发送方:TObject;变量键:Char);
变量
Edit1Text:字符串;
开始
如果(Key='-')和Pos('-',Edit1.Text)=0,则开始
Edit1.Text:='-'+Edit1.Text//强制“-”位于前面。
结束
else if(Key='-')和Pos('-',Edit1.Text)0则开始//else翻转符号
Edit1文本:=Edit1.Text;
Edit1.Text:=StringReplace(Edit1Text,'-','',[]);
结束;
如果没有(输入['0'、'9'、#8、#9、#13、#27、#127]),则输入:=#0;
结束;
由于用户还可以将数据粘贴到编辑框中,因此在编辑中更改文本时,您仍需检查数据。
因为这在ONKeyPress事件中变得相当复杂,所以我使用了一个自定义编辑组件来进行这种检查,并防止用户在编辑框中输入口中输入的内容


就我个人而言,我不相信会发出错误消息,您应该始终努力在一开始就不允许用户输入无效数据。

我不明白为什么您要允许用户输入字符,然后再不允许其通过验证

如果您真的需要阻止进入,那么为您执行此操作的控件比您自己进行黑客攻击要好。如果您的delphi版本非常旧,那么可以在JVCL组件库中尝试JVCL:TJvValidateEdit,例如,在delphi的所有版本中。然而,在最近的delphi常规版本(2009年及更高版本)中,已经内置了几种可能的解决方案,包括TMaskEdit和TSpinEdit

如果您只需要编写一个验证方法,那么考虑使用正则表达式或手工编码的验证函数,并将该代码与控件分开。

// Taking OP question obsessively literally, this 
// function doesn't allow negative sign, decimals, or anything
// but digits
function IsValidEntry(s:String):Boolean;
var
  n:Integer;
begin
  result := true;
  for n := 1 to Length(s) do begin
    if (s[n] < '0') or (s[n] > '9') then
    begin
       result := false;
       exit;
    end;
  end;
end;
//从字面上痴迷地回答OP问题
//函数不允许负号、小数或任何东西
//但是数字
函数IsValidEntry(s:String):布尔值;
变量
n:整数;
开始
结果:=真;
对于n:=1到长度(s)不开始
如果(s[n]<'0')或(s[n]>'9'),则
开始
结果:=假;
出口
结束;
结束;
结束;
但我有一些特殊的条件 验证编辑框字符是否正确的步骤 只有数字

您需要两个编辑控件。一个用于仅数字值,一个用于允许所有值。启用或禁用与条件匹配的控件。如果这两个控件有很好的标题(可能还有提示,为什么控件被启用或禁用),那么用户就知道他必须输入什么以及为什么要输入

  • 我不喜欢阻止用户。一个场景:
  • 我输入“abc123”
  • 离开编辑控件时,我收到一条错误消息“仅允许数字”
  • 我意识到我忘记了达到特殊状态
  • 我想做点什么来达到这个特殊的条件
  • 但我不能,因为我总是收到错误信息“只允许数字”
  • 所以我必须把值改成“123”
  • 做一些事情来达到特殊的条件
  • 再次键入我的旧“abc123”值
aarrgghh:-)


对于简单的数据输入表单,我执行以下操作:我允许错误输入,但对于每个输入无效的编辑控件,将字体颜色切换为红色(当不允许空值时,红色字体颜色是不够的)。如果用户试图发布数据,我会给出一条错误消息,通知用户所有无效的输入字段并中止发布。

您可能希望将该设置更改为
['0'..'9',#8,#9,#13,#27,#127'-']
。尤其是退格和删除对于输入很方便。;)(对于浮动,您可能还希望包括小数分隔符。)-1表示不注意OP的注释。很抱歉动态验证数字可能是个例外,但在退出或提交时进行验证是一种很好的常规做法。@NGLN,我拒绝编写发出错误消息的程序,我将忽略您的注释。我坚信,用户永远是对的。@Johan:小心。并非所有错误都来自用户,如果您不通知用户出了什么问题,这可能会导致他们感到沮丧。您仍然必须在退出/更改时验证文本,因为将数据放入编辑框的方法比按键多。例如粘贴文本。请澄清为什么不希望阻止用户输入无效数据。用户在输入字段中遇到无效数据被视为“用户陷阱”许多开发人员认为它的用户界面设计很糟糕。@Warren请澄清为什么你想阻止用户在源代码处输入值,从而剥夺他们看到按键导致字符出现在屏幕上的反馈。不允许用户在控件中输入无效值并不意味着不给他反馈。您仍然可以弹出一些消息说“您输入了一个错误的值,等等。”就像在windows登录时打开Capslock一样。@David:没有