ユーザーが情報を入力するためのいくつかのラベル付きの編集とラジオ ボタン (ラジオ グループにグループ化) と、エントリを保存するための [保存] ボタンを備えたフォームがあります。[保存] ボタンもフォームを閉じます。無効なエントリ (数字ではなく英字など) がある場合、または一部のエントリが空白のままになっている場合は、エラーを修正するようユーザーに警告し、空白の編集ボックスやチェックされていないラジオがなくなるまでフォームを閉じないようにしたいグループ。ユーザーに間違いを警告する messageDlg を発生させることにより、編集ボックスとラジオ グループごとに個別にエラー チェックを行います。ただし、ユーザーが間違いを修正せずにフォームを保存しようとすると、フォームを開いたままにして (閉じることができないようにして)、ユーザーに間違いを警告したいと考えています。すべてのエントリが有効で、チェックされていないラジオ グループがなくなった後にのみ、フォームを閉じることができるはずです。
以前のメッセージへのいくつかの返信に基づいて、次のコードを作成しました。1 つ目は 1 つの編集ボックス (いくつかあります) のデータ入力検証の例で、2 つ目は [保存] ボタンの OnClick イベントのコードです。
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;
これは、[保存] ボタンの OnClick イベントのコードです。ご覧のとおり、いくつかのエントリの有効性をチェックしており、すべてが有効な場合 (つまり、対応する変数の値として「OK」がある場合) にのみ、フォームを閉じることができます。無効なエントリがある場合、messageDlg が正しく発生しています。ただし、エラーが修正されて [保存] ボタンが押された後も、messageDlg が発生し続けています。
procedure TfrmAnalysisOptions.btnSaveOptionsClick(Sender: TObject);
//save input and output options
begin
//check if all the option questions have been answered
if not ((ConstraintsMinChange = 'OK') and //validation of correct entry as it is being entered
(ConstraintsMinExit = 'OK') and //validation of entry as user is moving to another entry after an incorrect entry
//several other such 'OK's
then
begin
MessageDlgPos('There is an invalid entry on the form. Please ' +
'correct it.', mtError, [mbOK], 0, 300, 300);
Exit;
end
else if //more messageDlgs if some other conditions are not met
else
begin
//save input and output options
end;
//finally if all the conditions are met, close the form
Close;
end;