普段 Abort 手続き自体使うことは無かったんだけどオリジナルで使っていたから調べてみたら何十年も思い違いをしていた
(というのを何年か前に調べてたんだけど記録してないから忘れてた)
Abort 手続き
Abort は,エラーを報告せずに処理を終了します。
Abort は,特殊な「サイレント例外」を生成します。サイレント例外は他の例外(EAbort)と同じように動作しますが,「サイレント例外」の場合,エンドユーザーにはエラーメッセージは表示されません。Abort は,try .. finally ブロックの最後に制御を移します。
というDelphi5 時代のヘルプを読んでいたので単純に exit と同じような扱いだと思っていたら普通に「Delphi abort Exit 違い」ってサジェストがあった
TMemo と TSpeedButton (新規作成 NewDocumentSpeedButton)一個ずつのテスト
private
{ Private 宣言 }
function QuerySaveDocument:Boolean;
function SaveExecute:Boolean;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Modified:=False;
end;
function TForm1.QuerySaveDocument: Boolean;
begin
Result:=False;
if Memo1.Modified then
begin
case MessageDlg('現在編集中の文書を保存しますか?', mtWarning, mbYesNoCancel, 0) of
mrYes :Result:=SaveExecute;
mrNo :Result:=True;
mrCancel:Abort;//※1 ここが mrCancel:exit; だと例外は起きずQuerySaveDocumentを抜けるだけ
end;
end else Result:=True;
end;
function TForm1.SaveExecute: Boolean;
begin
Result:=True;//本当は保存処理
end;
procedure TForm1.NewDocumentSpeedButtonClick(Sender: TObject);
begin
QuerySaveDocument;
// if not QuerySaveDocument then exit; が必要だと思っていたが
Memo1.Lines.Clear;//Cancel:Abort だとこの行は実行されない(例外発生)
end;
end.
※1 の時点で例外(Abort)が起こっているのでサイレントで無い普通の例外の場合を考えると処理されないのは当たり前だった
(ここで「エラーメッセージ」が出るはず)
情けない
いやでもやっぱり「保存します(Yes)」を選んでそこで「名前をつけて保存」的なモノをユーザがキャンセルしたら?
ああ function SaveExecute の方もセーブしなかった時に Abort すればいいのか
いやいやそれはそれで管理しにくいんじゃないか?
Abort は Abort で基本押さえておいて
if QuerySaveDocument then
にしておいた方がいいか
難しい
結局グデグデじゃねーか