如何验证必须是整数、非负数、非小数且不是字符串的值? 或字母词来自 InputQuery?

问题描述

我使用 InputQuery 来捕获用户的值,但它必须只是一个整数 (from 1 to 9999999...),不是小数,也不是字符串(不是 ABCDEF)或不是字母数字({{ 1}}) 而不是特殊字符 (A1B2C3)。在德尔福`RAD STUdio 2010 中。

作用域是捕获值,然后显示一条消息,告诉用户如果是这样,他必须只输入有效值。

我怎样才能做到这一点?

解决方法

这很简单:

var
  s: string;
  i: Integer;
begin

  if InputQuery(Caption,'Please enter a positive integer:',s) then
    if TryStrToInt(s,i) and (i > 0) then
      ShowMessage('An excellent choice,sir!')
    else
      ShowMessage('That''s not a positive integer,is it?')

如果用户取消它(这是预期的),这将显示提示并且不执行任何操作。另一方面,如果用户确实输入了一个值,则会使用 TryStrToInt 和简单的符号测试进行验证。

请注意,由于布尔短路求值,第二个连接词 (i > 0) 只会在第一个连接词 (TryStrToInt(s,i)) 求值为 True 时才求值,因此我们永远不会测试一个未初始化的变量 i(不过在这种情况下它并不重要)。

您可能还想使用 a more sophisticated input box 自动验证对话框中的输入(免责声明:我的网站)。


或者,您可以使用 InputQuery 函数自己的验证功能,该功能将在用户单击“确定”时验证输入:

var
  s: array of string;
  i: Integer;
begin
  SetLength(s,1);
  if InputQuery(Caption,['Please enter a positive integer:'],s,function(const Values: array of string): Boolean
    begin
      Result := (Length(Values) = 1) and TryStrToInt(Values[0],i) and (i > 0);
      if not Result then
        ShowMessage('That''s not a positive integer,is it?')
    end)
  then
    ShowMessageFmt('You chose %d. That''s an excellent choice,sir!',[i]);