[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;






関連記事
[Delphi] TStringGrid

[Delphi] 時間のかかる処理は砂時計・ListBoxの高速化

[Delphi] 個人的 逆引き関数リファレンス

[Delphi]小ネタ備忘録

[Delphi]MySQLへの接続で失敗(未解決)