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 に答える