0

フォームに 2 つの編集ボックスがあります。1 つは最小値用、もう 1 つはユーザーが入力する必要がある最大値用です。ユーザーが値を入力しているときに発生する可能性のあるエラーをキャッチしたい。考えられるエラーの 1 つは、最大値が最小値より小さいことです。これが発生した場合、エラー メッセージが表示されます。ただし、ユーザーが最小ボックスに 5 を入力し、最大ボックスに 100 を入力したい場合でも、ユーザーが既に最大ボックスに 100 の「1」を入力している場合でも、エラー メッセージが表示されます。 min ボックスに 5 を入力しました。エラー メッセージが表示される前に、ユーザーが値全体を入力できるようにするにはどうすればよいですか?

これが私のコードです(他のエラーもキャッチしますが、最大 < 最小エラーのみが影響を受けるようです):

procedure TfrmAnalysisOptions.lbleConstraintsMaxChange(Sender: TObject);
var
  I: integer;
  Val, ValidEntry: string;
  Chr: char;
  RangeMin, RangeMax: Double;
  const Allowed = ['0'..'9', '.'];
begin

  Val := lbleConstraintsMax.Text;

      //initialize values    
  ValidEntry := '';
  ConstraintsMaxChange := '';

  //value can contain only numerals, and "."
    for I := 1 to Length(Val) do
     begin
       Chr := Val[I];
       if not (Chr in Allowed) then
       begin
     MessageDlgPos('The value entered for the max value of the ' +
               'constraint must contain only a numeral, a decimal ' +
               'point or a negative sign.',
            mtError, [mbOK], 0, 300, 300);
     Exit;

       end
       else ValidEntry := 'OK'; //validity check for this part

     end;

     //max value cannot be zero or less than the min value
    if not TryStrToFloat(Val, RangeMax) then Exit
    else if RangeMax = 0 then
    begin
       MessageDlg('Max value cannot be zero.', mtError, [mbOK], 0);
       Exit;
    end
    else if not TryStrToFloat(lbleConstraintsMin.Text, RangeMin) then Exit
    else if RangeMax < RangeMin then
      begin
    MessageDlgPos('Max value cannot be less than Min value.',
           mtError, [mbOK], 0, 300, 300);
    Exit;
      end

    else if (RangeMax < 0) then
      begin
    MessageDlgPos('A constraint cannot be negative.',
              mtError, [mbOK], 0, 300, 300);
    Exit;
      end

    //final validity check
    else if ValidEntry = 'OK' then ConstraintsMaxChange := 'OK'
    else MessageDlgPos('There was an unexpected problem with the ' +
               'value entered in the max constraints box.',
            mtError, [mbOK], 0, 300, 300);

end;
4

2 に答える 2

5

このOnChangeイベントは、編集コントロールのコンテンツが変更されるたびにトリガーされます。これは、無効な文字を除外するのに適した場所ですが、数値を検証するのに適した場所ではありません。5ユーザーが入力しようとしている数字、 、505005,000、それぞれが許容されるかどうかを予測する方法はありません。

解決策 1 : これらの編集コントロールの両方が入力され、ユーザーが次のステップ (保存、続行、読み込み、開始など) に移動しようとした後で、このチェックを行います。

解決策 2 : メッセージ ボックスを表示するのではなく、同じロジックを維持しながら、これらのコントロールの横に「無効なエントリ」というラベルを表示できます。そうすれば、ユーザーは多数のメッセージ ボックスに直面することはありません。

解決策 3 : のOnExit代わりにイベントを使用しOnChangeます。これで問題が完全に解決されるわけではありませんが、最小限に抑えてください。このイベントは、フォーカスがコントロールから離れたときにトリガーされます。

解決策 4解決策 2 と同様に、 と を使用OnChangeして、ユーザーが次に押すと思われるボタンOnExitのプロパティを制御します。Enabled

解決策 5解決策 4 と同様に、アクションを使用してEnabled、その特定のアクションのプロパティを変更します。その場合、ユーザーが押す可能性のあるボタンはどれもクリックできません。


余談ですが、無効な文字を除外するときは、メッセージをポップアップ表示するよりも、これらの文字を無視して最初からコントロールに入れないようにする方が少しエレガントです。OnKeyPress代わりにイベントを使用するか、TMaskEdit.

于 2013-10-09T20:46:38.883 に答える