【问题标题】:How do I verify that a text box contains only numbers in Delphi?如何验证文本框仅包含 Delphi 中的数字?
【发布时间】:2011-06-23 13:23:10
【问题描述】:

这可能是一个非常简单的问题,但我从未接触过 delphi。 我有一个编辑框,可以接受字符。但在某些特殊情况下,我必须验证编辑框字符是否只是数字。

我们该怎么做?

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

【问题讨论】:

  • 请说明您不想阻止用户输入无效数据的原因。用户卡在输入字段中的无效数据被认为是“用户陷阱”,并且被许多开发人员认为是糟糕的用户界面设计。
  • @Warren 请说明为什么要阻止用户在源代码处输入值,从而剥夺他们看到按键导致屏幕上出现字符的反馈。
  • 不允许用户在控件中输入无效值并不意味着不给他反馈。您仍然可以弹出一些消息说“您输入了错误的值,等等......”就像在 Windows 登录时打开 Capslock 时一样。
  • @David:对击键无响应实际上也可能使一些用户感到困惑。也许一个理想的反应是在屏幕上闪烁一个大红灯,然后发出哔哔声。如果他们坚持输入非数字,我们可能不得不给他们一个 eNoogie。 :-)
  • @Warrent 是您提出“对击键无响应”。是的,这会令人困惑。

标签: delphi delphi-5


【解决方案1】:

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

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

【讨论】:

  • 在调用 DoSomethingWithTheNumber 之前不应该有一个“else”吗?
  • @awmross 好点。在我的脑海中,错误处理程序引发了一个异常,但这太强了,而且是假设性的。
  • 哦,谢谢!我正在将编辑框文本转换为 char 并比较每个 char 是否在集合中或 [0..9] 是否存在。基于此,我尝试过,但这看起来更短。
  • @GAPS 如果您想将答案限制在 12 年前的软件版本中,您确实应该在提问时这么说。
【解决方案2】:

我不明白你为什么要允许用户输入一个字符,然后又不允许它通过验证。

如果您确实需要阻止进入,那么为您执行此操作的控件比您自己破解要好。如果你的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;

【讨论】:

  • +1 我的想法完全正确,但我无法理解代码,David 代码在一行中做到了这一点:TryStrToInt()
  • @Warren,他说,“但在某些特殊情况下,我必须验证编辑框字符只是数字。”所以他只需要在某些情况下验证这一点,而不是一直验证。顺便说一句,请在最新版本的 Delphi 中将编辑控件中的 NumbersOnly 属性添加到您的内置解决方案列表中。将 NumbersOnly 属性设置为 True 将使编辑控件拒绝任何非数字字符。
  • NumbersOnly 不是一个有效的选项 imo 也不是由 WinAPI (ES_NUMBER) 设置的,因为即使那样你也可以粘贴无效的文本。
  • 哦有趣的发现@vcldeveloper!听起来有问题吗?
  • @Stefan,我无法使用 Delphi 2010 重现您在 Windows 7 中提到的问题。其 NumbersOnly 属性设置为 True 的 Edit 控件不接受粘贴任何字母字符。跨度>
【解决方案3】:

我知道你说过user can enter any char but at the time of validation
但是我想提供一个替代方案,因为允许用户输入值似乎很愚蠢,只是在 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;

由于用户也可以将数据粘贴到编辑框中,因此您仍然需要在编辑中更改文本时检查数据。
因为这在 ONKeyPress 事件中变得相当繁琐,所以我使用了一个自定义编辑组件来执行这种检查并防止用户将脚入式输入输入到编辑框中。

我个人不相信会发出错误消息,您应该始终努力避免让用户输入无效数据。

【讨论】:

  • 您可能希望将该设置更改为['0'..'9', #8, #9, #13, #27, #127, '-']。特别是退格和删除对于输入输入很方便。 ;)(对于浮点数,您可能还想包含 DecimalSeparator。)
  • -1 因为没有注意 OP 的注释。对不起。动态验证数字可能是个例外,但在退出或提交时验证是很好的常见做法。
  • @NGLN,我拒绝编写发出错误消息的程序,你我会忽略你的评论。我坚信,用户永远是对的。
  • @Johan:小心。并非所有错误都来自用户,如果您不告知用户出了什么问题,这可能会导致他们感到沮丧。
  • 您仍然必须在退出/更改时验证文本,因为将数据放入编辑框中的方法比按键更多。例如粘贴文本。
【解决方案4】:

但在某些特殊情况下,我有 验证编辑框字符是 只有数字。

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

  • 我不喜欢阻止用户。一个场景:
  • 我输入“abc123
  • 离开编辑控件时,我收到一条错误消息“仅允许数字”
  • 我意识到我忘了达到特殊条件
  • 我想做点什么来达到特殊条件
  • 但我不能,因为我总是收到错误消息“只允许数字”
  • 所以我必须将值更正为“123
  • 做事要达到特殊条件
  • 再次重新输入我的旧“abc123”值

aarrgghh :-)

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

【讨论】:

  • 是的!即使我也这样做。但我想提一件事关于这种情况。该条件仅基于复选框值,仅此而已
猜你喜欢
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2015-07-31
相关资源
最近更新 更多