[Delphi] フォームを閉じる時に入力チェックをしてエラーなら閉じない
トップページへ
※全てのDelphi(楽天市場で探す ・ amazonで探す)で動作する保証はありません。また、内容に関し管理人は全ての責任を負いかねます
サンプルの概要
フォームを閉じる時(アプリを終了する時)入力チェックをして、エラーならフォームを閉じないというものです。
それだけでは記事として物足りないので、TryStrToInt を使用し「整数以外はエラー」「負の数はエラー」という処理もあわせて実施しています。
なお、フォームにはTEditの「EDT_PR」を設置しています。
ポイント
・FormCloseQueryイベント(公式)を使用し、エラーなら CanClose に False をセットしてフォームを閉じる処理をキャンセルしています。
・TryStrToInt関数(公式)で、入力した文字が整数なのかどうかをチェックし、例えば小数ならエラーとする。さらに、0未満の値でもエラーとし、いずれもの場合もエラーならフォームを閉じない。
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var w_answer: Integer; begin if TryStrToInt(EDT_PR.Text, w_answer) = false then begin MessageDlg('整数を入力して下さい', mtWarning, [mbOK], 0); EDT_PR.SetFocus; CanClose := False; Exit; end else begin if (w_answer < 0) then begin MessageDlg('0以上を入力して下さい', mtWarning, [mbOK], 0); EDT_PR.SetFocus; CanClose := False; Exit; end; end; フォームを閉じる時の処理 end;
補足
「フォームを閉じる時の処理」は何もすることがなければ記述する必要はありませんが、レジストリなどに値を残したい場合は、そこで処理すれば良いかと思います。
そのためにサンプルの if文には「Exit;」を記述していますし、私の場合、「閉じる時の処理」の有無に関係なく常にExit;を記述しています。
余談
同じ挙動で「OpenDialogにもCanCloseがあります」
事例
OpenDialogでテキストファイルを選び[開く]ボタンをクリックした時に(OpenDialogを閉じる前に)、中身に特定の文字列を含んでいたらメッセージダイアログを出して、ファイルを開かないようにした一例です。
procedure TF_MAIN.OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean); var Enc: TEncoding; w_tsm: TStringList; begin Enc := TEncoding.GetEncoding(CP_UTF8); w_tsm := TStringList.Create; try w_tsm.LoadFromFile( OpenDialog1.FileName , Enc); if ( AnsiPos( '<img', w_tsm.Text ) <> 0 ) then begin MessageDlg('すでに画像タグが存在します', mtInformation, [mbOk], 0, mbOk); CanClose := False; end; finally w_tsm.Free; Enc.Free; end; end;