8

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

我们怎么能做到这一点?

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

4

4 回答 4

11

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

if TryStrToInt(Edit1.Text, Value) then
  DoSomethingWithTheNumber(Value)
else
  HandleNotANumberError(Edit1.Text);
于 2011-06-23T13:29:26.197 回答
7

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

如果您确实需要阻止进入,那么为您执行此操作的控件比您自己破解要好。如果你的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;
于 2011-06-23T15:24:05.040 回答
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 事件中变得相当繁琐,所以我使用了一个自定义编辑组件来执行这种检查并防止用户将脚入式输入输入到编辑框中。

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

于 2011-06-23T14:19:52.660 回答
3

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

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

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

:-)

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

于 2011-06-23T19:57:03.550 回答