はじめに
ユーザへの通知用にメッセージを表示するダイアログを作成することはよくあると思います。
ダイアログにはOKボタンを用意し、ユーザがメッセージを確認したときに、OKボタンを押下してダイアログを閉じるようにします。
その際、それぞれの状況で個別の処理を行いたい場合もあると思います。
この処理をメッセージダイアログ側に記述すると、処理が増えるたびにメッセージダイアログを修正しなくてはなりません。
そのためそれぞれの処理は呼出側画面側に用意し、メッセージダイアログはその処理を呼び出すようにしたいと思います。
デリゲートを利用する。
メッセージダイアログから、呼び出し元画面側に用意した処理を呼び出すにはデリゲートを利用します。 メッセージダイアログに次の3つを準備します。
- デリゲートを定義します。デリゲート名は任意です。
戻り値の型、引数の型や数は要件に合わせます。
今回は両方ともvoidとしました。 - デリゲートオブジェクトを用意します。
デリゲートオブジェクト名も任意です。 - デリゲート処理を実行します。
今回はOKボタンが押下されたタイミングで実行します。
// メッセージダイアログクラス namespace Sample { ref class MessageForm: Form { public: // 1.デリゲートを定義します。 delegate void ClickOKDelegate(); // 2.デリゲートオブジェクトを用意します。 ClickOKDelegate^ clickOKDelegate; private: /// /// フォーム上のOKボタンがクリックされた時に呼び出されるイベントハンドラ /// System::Void ButtonOK_Click(System::Object^ sender, System::EventArgs^ e) { // 呼び出し元画面でデリゲートが設定されていない場合、 // そのまま呼び出すとクラッシュするのでnullチェックしてから // 呼び出すとと安全です。 if (clickOKDelegate != nullptr) { // 3.デリゲート処理を実行します。 clickOKDelegate(); } // フォームをクローズします。 this->Close(); } }; };
呼出側画面では次の2つを準備します。
- デリゲートメソッドを用意します。
メソッド名は任意ですが、戻り値の型、引数の型や数は、メッセージダイアログのデリゲートの定義に合わせます。 - メッセージダイアログのデリゲートオブジェクトに、呼出側画面で用意したデリゲートメソッドを設定します。
// 呼出側画面クラス namespace Sample { ref class MainForm: Form { private: /// /// フォームがロードされた時に呼び出されるイベントハンドラ /// 今回は画面を表示した時にメッセージダイアログも表示するようにしました。 /// System::Void MainForm_Load(System::Object^ sender, System::EventArgs^ e) { // メッセージフォームを生成します。 MessageForm^ form = gcnew MessageForm(); // 2.デリゲートを設定します。 form->clickOKDelegate = gcnew MessageForm::ClickOKDelegate(this, &MainForm::ClickOK); // メッセージフォームを表示します。 form->ShowDialog(this); } /// /// 1.デリゲートを用意します。 /// メッセージフォームのOKボタンがクリックされた時に呼び出されるデリゲート /// void ClickOK() { // 何か処理を記述します。 } }; };
おわりに
デリゲートの仕組み自体は大好きで、理解しているのですが、いまだにデリゲートという言葉自体はピンときていません。
コールバックと言われた方がしっくりします。
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688