可能这是一个非常简单的问题,但我从未接触过德尔福。我有一个编辑框,可以接受字符。但在某些特殊情况下,我必须验证编辑框字符只是数字。
我们怎么能做到这一点?
注意:用户可以输入任何字符,但在验证时我必须验证以上一个。
我不知道您打算使用什么事件来调用验证,但验证可以这样完成:
if TryStrToInt(Edit1.Text, Value) then
DoSomethingWithTheNumber(Value)
else
HandleNotANumberError(Edit1.Text);
我不明白你为什么要允许用户输入一个字符,然后不允许它通过验证。
如果您确实需要阻止进入,那么为您执行此操作的控件比您自己破解要好。如果你的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;
我知道你说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 事件中变得相当繁琐,所以我使用了一个自定义编辑组件来执行这种检查并防止用户将脚入式输入输入到编辑框中。
就我个人而言,我不相信会发出错误消息,您应该始终努力不允许用户首先输入无效数据。
但在某些特殊情况下,我必须验证编辑框字符只是数字。
您需要两个编辑控件。一个用于仅数字值,一个用于允许所有值。启用或禁用符合条件的控件。如果这两个控件有很好的标题(也许还有提示,为什么启用或禁用一个控件),那么用户就知道他必须输入什么以及为什么要输入。
啊:-)
对于简单的数据输入表单,我执行以下操作:我允许错误输入,但将每个具有无效输入的编辑控件的字体颜色切换为红色(当不允许空值时,红色字体颜色是不够的)。如果用户尝试发布数据,我会给出一条错误消息,通知用户所有无效输入字段并中止发布。