2

我正在尝试构建一个功能/检查以防止键盘输入错误,我在这里有点迷失了。

function ReadInputs : integer;
var 
  number : integer;
begin
  repeat
    Write('Set random number (1-10): ');
    Readln(number);

    if NOT((number <= 10) AND (number >= 1)) then
      begin
        Writeln('Error! Type 1-10!');
      end;
  until (number >= 1) AND (number <= 10);
  result := column;
end;

如何防止输入除数字 1-10 之外的任何其他字符?为什么即使我设置整数,在我的函数中只定义数字也是不够的?当我输入例如“A”时它崩溃了,那么正确的方法是什么?谢谢你。

4

3 回答 3

3

就目前而言,如果用户输入无法转换为整数的内容,您的程序将因错误而失败。那是因为您传递给 Readln 的变量被键入为整数。这实际上是用户输入数字的断言。但是您希望比这更灵活,并允许用户从非数字输入中恢复。

你需要做的是读取一个字符串。这将永远成功。然后您可以决定如何处理该字符串。例如,您将尝试转换为整数,如果成功,则执行进一步的有效性检查。

或许是这样的:

var
  Input: string;
  Num: Integer;
....
Readln(Input);
if TryStrToInt(Input, Num) then
  // perform checks on Num, etc.
else
  // handle error: the value input was not numeric
于 2013-08-17T17:49:48.920 回答
0

您已经从 David H 那里得到了一个很好的答案,但更多的解释可能会有所帮助。

ReadLn() 过程可以追溯到应用程序有 GUI 之前,它并没有真正限制用户可以输入的内容。用户可能只需按 [return] 或键入不是数字(或 +/-)的字符。如果用户键入的内容恰好转换为整数,ReadLn(AnInteger) 将成功,否则失败。

另一方面,Readln(AString) 总是会成功,那么问题就是如何检查它是否代表一个整数,而 DH 的答案向您展示了如何做到这一点。

如果您想知道,一个 GUI 应用程序,您可以控制编辑控件将接受哪些字符,例如通过使用 TMaskEDit,它允许您指定可接受的字符模式(例如 6 位数字,仅此而已) - 如果用户键入与掩码不匹配的东西,编辑控件不接受它。但是,即使您使用 TMaskEdit,最好检查输入的内容是否实际转换为您想要的数字类型。

于 2013-08-17T18:26:08.083 回答
0

或者您可以在 OnKeyPress 事件中使用它:

if NOT(key in['0'..'9', #8]) then
  key := #0;
于 2014-08-23T21:27:30.757 回答