プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

C++/CLIでデリゲートを利用する。

f:id:paveway:20190914064630j:plain

はじめに

ユーザへの通知用にメッセージを表示するダイアログを作成することはよくあると思います。
ダイアログにはOKボタンを用意し、ユーザがメッセージを確認したときに、OKボタンを押下してダイアログを閉じるようにします。
その際、それぞれの状況で個別の処理を行いたい場合もあると思います。
この処理をメッセージダイアログ側に記述すると、処理が増えるたびにメッセージダイアログを修正しなくてはなりません。
そのためそれぞれの処理は呼出側画面側に用意し、メッセージダイアログはその処理を呼び出すようにしたいと思います。

デリゲートを利用する。

メッセージダイアログから、呼び出し元画面側に用意した処理を呼び出すにはデリゲートを利用します。 メッセージダイアログに次の3つを準備します。

  1. デリゲートを定義します。デリゲート名は任意です。
    戻り値の型、引数の型や数は要件に合わせます。
    今回は両方ともvoidとしました。
  2. デリゲートオブジェクトを用意します。
    デリゲートオブジェクト名も任意です。
  3. デリゲート処理を実行します。
    今回は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つを準備します。

  1. デリゲートメソッドを用意します。
    メソッド名は任意ですが、戻り値の型、引数の型や数は、メッセージダイアログのデリゲートの定義に合わせます。
  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