Main Content

イベントとリスナーの概念

イベント モデル

イベントは、オブジェクト内で起こる変更または動作を表します。以下に例を示します。

  • クラスのデータの変更

  • メソッドの実行

  • プロパティ値のクエリと設定

  • オブジェクトの破棄

基本的には、プログラムで検出できるアクテビティは、イベントを生成でき、受け手側のオブジェクトに情報を送信できます。

MATLAB® クラスは、イベントに応答する他のオブジェクトにイベントの発生を知らせるプロセスを定義します。イベント モデルは、以下のように動作します。

  • ハンドル クラスは、イベントを表す名前を宣言します。 イベントの命名

  • イベント宣言クラスのオブジェクトを作成した後、そのオブジェクトにリスナーを付加します。リスナー ライフサイクルの制御

  • ハンドル クラスの notify メソッドの呼び出しによって、イベントの通知がリスナーにブロードキャストされます。クラス ユーザーによって、イベントをいつトリガーするかが決定されます。 イベントのトリガー

  • リスナーは、イベントの発生を知ると、コールバック関数を実行します。 リスナー コールバックの指定

  • リスナーは、イベントを定義するオブジェクトのライフサイクルにバインドしたり、リスナー オブジェクトの存在やスコープに制限したりできます。 リスナー ライフサイクルの制御

次の図は、イベント モデルを示しています。

Model of events and listeners

制限

イベントの使用には、次のような特定の制限があります。

  • イベント ソースはイベントをトリガーするときにリスナーが存在することを保証できない。

  • リスナーは、他のリスナーがイベント発生の通知を受けないようにすることができない。

  • リスナーが実行される順序は定義されない。

  • 同じハンドル オブジェクトが他のリスナーに渡されるため、リスナーはリスナー コールバックに渡されたイベント データ オブジェクトを変更してはならない。

既定のイベント データ

イベントは、コールバック関数にイベント データ引数を渡すことによって、リスナー コールバックに情報を与えます。既定では、MATLAB は event.EventData オブジェクトをリスナー コールバックに渡します。このオブジェクトは、2 つのプロパティをもちます。

  • EventName — クラス event ブロックで定義されるイベントの名前

  • Source — イベントのソースであるオブジェクト

MATLAB は、必須のイベント データ引数内のリスナー コールバックにソース オブジェクトを渡します。ソース オブジェクトを使用して、リスナー コールバック関数内から、オブジェクトのパブリック プロパティにアクセスします。

イベント データのカスタマイズ

event.EventData クラスのサブクラスを作成して、リスナー コールバック関数に追加情報を与えることができます。サブクラスで追加データを保存するプロパティを定義し、派生するイベント データ オブジェクトを作成するメソッドを提供して、notify メソッドにこのオブジェクトを渡せるようにします。

イベント特有のデータの定義には、このデータのカスタマイズ方法についての例があります。

ハンドル クラスに限られたイベント

イベントは、ハンドル クラスに限り定義できます。これは、値クラスが 1 つの MATLAB ワークスペース内でのみ可視であるため、コールバックまたはリスナーがイベントをトリガーしたオブジェクトにアクセスできないために設けられている制限です。コールバックには、オブジェクトのコピーへのアクセスがある場合があります。ただし、コピーへのアクセスは役に立ちません。これは、コールバックがイベントをトリガーしたオブジェクトの現在の状態にアクセスできなかったり、オブジェクトに変更を加えることができないことに起因します。

ハンドル クラスと値クラスの比較では、ハンドル クラスの一般的な情報について説明します。

イベントとリスナーの構文では、ハンドル クラスとイベントを定義する構文について説明します。

プロパティの設定とクエリのイベント

プロパティに関連するあらかじめ定義されたイベントが 4 つあります。

  • PreSet — プロパティ set アクセス メソッドを呼び出す前に、プロパティ値が設定される直前にトリガーされます。

  • PostSet — プロパティ値が設定された直後にトリガーされます。

  • PreGet — プロパティ get アクセス メソッドを呼び出す前に、プロパティ値のクエリの直前にトリガーされます。

  • PostGet — プロパティ値のクエリ結果が返された直後にトリガーされます。

これらのイベントは、事前定義されており、クラスの events ブロック内にリストされている必要はありません。

プロパティ イベントが発生するとき、コールバックに event.PropertyEvent オブジェクトが渡されます。このオブジェクトは、3 つのプロパティをもちます。

  • EventName — このデータ オブジェクトが記述するイベントの名前

  • Source — データ オブジェクトが記述するイベントを定義するクラスの、ソース オブジェクト

  • AffectedObject — プロパティがこのイベントのソースであるオブジェクト (つまり、AffectedObject には、アクセスまたは変更されたプロパティのあるオブジェクトが含まれています)。

event.EventData クラスをサブクラス化することによって、ユーザー独自のプロパティ変更イベント データを定義できます。event.PropertyEvent クラスは、event.EventData のシールされたサブクラスです。

プロパティ リスナーを作成する過程の説明は、プロパティ値変更のリスニングを参照してください。

例は、PostSet イベントのリスナーを参照してください。

プロパティ値へのアクセスを制御するメソッドの詳細については、プロパティの get メソッドおよび set メソッドを参照してください。

リスナー

リスナーはイベントへの応答をカプセル化します。リスナー オブジェクトは、event.listener クラスに属します。このクラスは、以下のプロパティを定義するハンドル クラスです。

  • Source — イベントを生成したオブジェクトのハンドルまたはハンドルの配列

  • EventName — イベントの名前

  • Callback — 有効なリスナーがイベント通知を受け取ったときに実行される関数

  • EnabledEnabledtrue の場合に限り実行するコールバック関数。例は、リスナーの有効化と無効化を参照してください。

  • Recursive — コールバックの実行を引き起こしたイベントと同じイベントを、リスナーがトリガーできるようにする。

    Recursive は、既定では false です。コールバックにより、それがコールバックとして定義される対象のイベントがトリガーされた場合、リスナーの再帰的実行はできません。そのため、コールバックがそれ自体のイベントをトリガーしなければならない場合は、Recursivetrue に設定します。Recursive プロパティを true に設定すると、無限再帰が再帰限界値に達してエラーがトリガーされる状況となる可能性があります。

リスナー ライフサイクルの制御では、さらに固有の情報について説明します。