話の結論は 「いいえ」と「キャンセル」の違いって?
となるのだが以下小話まじえて説明です。
ここに4つ実行ボタンがある。センスの欠片もない画面だが許してください。
実行ボタン1
procedure TForm1.Button1Click(Sender: TObject);
begin
if MessageDlg('サンプル'+ #13#10 +'です。実行してよろしいですか?', mtWarning, [mbOK, mbNo, mbCancel], 0) <> mrOk then
begin
showmessage('Cancelしました');
exit;
end;
Showmessage('実行しました');
end;
というようなことがやりたいとする。
実行ボタン2
procedure TForm1.Button2Click(Sender: TObject);
begin
if MessageDlg('サンプル'+ #13#10 +'です。実行してよろしいですか?', mtWarning, [mbOK, mbCancel], 0) <> mrCancel then
begin
showmessage('実行しました');
end;
end;
別パターン。
実行ボタン3
procedure TForm1.Button3Click(Sender: TObject);
begin
if MessageDlg('サンプル'+ #13#10 +'です。実行してよろしいですか?', mtWarning, [mbOK, mbNo, mbCancel], 0) = mrOK then
begin
showmessage('実行しました');
end;
end;
これも別パターン。
実行ボタン4 (アンチパターン)
//罠
procedure TForm1.Button4Click(Sender: TObject);
begin
if MessageDlg('サンプル'+ #13#10 +'です。実行してよろしいですか?', mtWarning, [mbOK, mbNo], 0) <> mrNo then
begin
showmessage('実行しました');
end;
end;
2 や 3 と何が違うのか?というと mrCancel
が画面上からなくなり mrNo
になっているだけに見える。
CancelもNoも同じじゃないかと感じそうだがここで事故が起こる。
事故の再現映像
ソースは一見「実行ボタン2」「実行ボタン3」と似ているが
こちらはCancelされるんですね。
Delphiの dialog.pas
の中身を見るともう少し紐解けるのですがいったんここは別の機会に譲りつつ
function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons): TForm;
つまりは「いいえ」と「キャンセル」は明確に違う。本来下のような用途。
つまりこの場合の「はい」と「いいえ」は、表面上は文書を保存するかどうかを確認しているのですが、どちらも暗黙的に「アプリを終了する」という事を意味しています。これに対し「キャンセル」は、メニューから「アプリの終了」を“選択した事自体”をキャンセルしますので、何もしません。したがって、アプリも終了しません。
この誤解により昔に大事故があった(右上のxボタンを押したのに処理が...)ようなので確かめてみました。以上参考になればさいわいです。