Controlling Message Dialog Buttons

メッセージダイアログのボタンを制御する!

メッセージダイアログのボタンを「状況によってはクリックできないように設定」する必要に迫られて、その方法を調べてみたのだけれど、探した範囲では見つからず、よくよくコードを眺めたら、ボタンにはEnabledプロパティがあることに気付き、簡単に実現できちゃった・・・というお話。

1.ヒトはよく間違える
2.ボタンをクリック不可に設定
3.まとめ
4.お願いとお断り

1.ヒトはよく間違える

TImageに表示した画像上で、連続して矩形選択するプログラムを書いた。ユーザーが画像上で矩形選択する毎に次のメッセージダイアログを表示し、続けて矩形選択する場合は「はい」や「やり直し」、指定した選択範囲をすべて保存して終了する場合は「終了」、設定内容を保存せずに終了する場合は「キャンセル」を、それぞれ選択できるようにプログラミングしたのだが・・・

説明をよく読んで作業してもらえば大丈夫だと思ったんだけど・・・

50回とか、それくらい連続して矩形選択を繰り返すと、『終了』をクリックしなければならない場面で、つい・うっかり、『はい』をクリックしてしまうという、いかにも人間らしい失敗があちこちで発生。この問題が起きるのを防止するため、次のようにラベルに残りの選択数を表示して注意を促したが・・・

ラベルに残りの選択回数を表示

「あー!まちがえちゃったー☆」という声が増えはしても、減ることはなく、根本的な間違いクリック防止対策を施す必要性を痛感。で、行うべき対策はただひとつ。矩形選択が残り0回になったら、表示するメッセージダイアログの「はい」ボタンをクリック不可能に設定する & それまでは「はい」ボタンを初期選択状態としていたのを「終了」ボタンに変更する。これだけ!

早速、『Delphi メッセージダイアログ ボタン Enabled』を検索キーワードにしてGoogle先生にお伺いをたてたが探した範囲では、参考となる情報は見つからず。

仕方がないので、残り0回になったら「はい」ボタンのないメッセージダイアログを表示することにしようか・・・と思いつつ、コードを眺めていたら、

TButton(Dlg.FindComponent('YES')).Caption := 'はい';

TButton・・・? の
Captionプロパティを「はい」に設定してる・・・?

・・・ってコトは、当然、Enabledプロパティも設定できるはず! と気づき、早速設定☆

2.ボタンをクリック不可に設定

矩形選択の残りの回数がゼロになった時点で「はい」ボタンのEnabledプロパティをFalseに設定し、これをクリックできないようにする。さらにそれまでは「はい」ボタンが初期選択状態であったのを「終了」ボタンに変更してみた。その方法は次の通り。

var
  msg : string;
  rc : integer;
  Dlg : TForm;
begin
  Dlg:=CreateMessageDialog(msg,mtConfirmation,[mbYes,mbNo,mbOK,mbCancel]);
  try
    //フォームの中央に表示
    Dlg.Left:=Form1.Left+(Form1.Width -Dlg.Width ) div 2;
    Dlg.Top:=Form1.Top +(Form1.Height-Dlg.Height) div 2;
    //ボタンの文字を変更
    TButton(Dlg.FindComponent('YES')).Caption := 'はい';
    TButton(Dlg.FindComponent('NO')).Caption := 'やり直し';
    TButton(Dlg.FindComponent('OK')).Caption := '終了';
    TButton(Dlg.FindComponent('CANCEL')).Caption := 'キャンセル';
    //選択(クリック)の可否を設定
    if StrToInt(矩形設定数.Text) - 矩形選択数 <> 0 then
    begin
      //「はい」ボタンを選択できる
      TButton(Dlg.FindComponent('YES')).Enabled := True;
      //初期選択状態のボタンを「はい」にする
      Dlg.ActiveControl := TWinControl(Dlg.FindComponent('YES'));
    end else begin
      //「はい」ボタンは選べない
      TButton(Dlg.FindComponent('YES')).Enabled := False;
      //初期選択状態のボタンを「終了」にする
      Dlg.ActiveControl := TWinControl(Dlg.FindComponent('OK'));
    end;
    //表示
    rc := Dlg.ShowModal;
  finally
    Dlg.Free;
  end;

  //必要に応じて記述
  case rc of
    mrYes: begin
      //「はい」が選択された場合の処理

    end;
    ・・・省略・・・
  end;

end;

テストしてみました!
矩形選択数が残り0(ゼロ)になると・・・

「はい」ボタンはクリックできない!

これでもう大丈夫☆
このシーンで間違って「キャンセル」をクリックするヒトは、そんなに多くないはず・・・

3.まとめ

メッセージダイアログに表示した特定のボタンをクリックできないようにするには・・・

//「はい」ボタンをクリック不可に設定
TButton(Dlg.FindComponent('YES')).Enabled := False;

メッセージダイアログは何度も使ってきたけれど、ボタンのEnabledを設定したのは今回が初めての経験でした!!

4.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。