12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Delphi: いいえ(No)とキャンセル(Cancel)は違う

Posted at

話の結論は 「いいえ」と「キャンセル」の違いって?
となるのだが以下小話まじえて説明です。
ここに4つ実行ボタンがある。センスの欠片もない画面だが許してください。
image.png

実行ボタン1

image.png

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

image.png

procedure TForm1.Button2Click(Sender: TObject);
begin
  if MessageDlg('サンプル'+ #13#10 +'です。実行してよろしいですか?', mtWarning, [mbOK, mbCancel], 0) <> mrCancel then
  begin
    showmessage('実行しました');
  end;
end;

別パターン。

実行ボタン3

image.png

procedure TForm1.Button3Click(Sender: TObject);
begin
  if MessageDlg('サンプル'+ #13#10 +'です。実行してよろしいですか?', mtWarning, [mbOK, mbNo, mbCancel], 0) = mrOK then
  begin
    showmessage('実行しました');
  end;
end;

これも別パターン。

実行ボタン4 (アンチパターン)

問題のパターンです。以下ソースは罠なので注意ください。
image.png

//罠
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も同じじゃないかと感じそうだがここで事故が起こる。

事故の再現映像

test.gif

ソースは一見「実行ボタン2」「実行ボタン3」と似ているが

test.gif
test.gif

こちらはCancelされるんですね。
Delphiの dialog.pas の中身を見るともう少し紐解けるのですがいったんここは別の機会に譲りつつ

function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons): TForm;

つまりは「いいえ」と「キャンセル」は明確に違う。本来下のような用途。
image.png

つまりこの場合の「はい」と「いいえ」は、表面上は文書を保存するかどうかを確認しているのですが、どちらも暗黙的に「アプリを終了する」という事を意味しています。これに対し「キャンセル」は、メニューから「アプリの終了」を“選択した事自体”をキャンセルしますので、何もしません。したがって、アプリも終了しません。

この誤解により昔に大事故があった(右上のxボタンを押したのに処理が...)ようなので確かめてみました。以上参考になればさいわいです。

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?