プロパティ値変更のリスニング
プロパティ リスナーの作成
handle クラスでは、あらかじめ定義されたプロパティ イベント (PreSet、PostSet、PreGet および PostGet と指定) のリスナーを定義できます。これらの指定イベントのリスナーは次の方法で作成します。
SetObservableプロパティまたはGetObservableプロパティのいずれか、または両方の属性を指定する。コールバック関数を定義する。
プロパティの名前とイベントを
addlistenerまたはevent.proplistenerへの呼び出しに含めることで、プロパティ リスナーを作成する。必要に応じて、
event.EventDataをサブクラス化し、コールバック関数に渡す特化したイベント データ オブジェクトを作成する。新しい値が現在の値と同じ場合、コールバックの実行を回避する (プロパティ値が変化しない場合の代入を参照)。
プロパティの属性を有効なプロパティ イベントに設定
プロパティ ブロックで、SetObservable 属性を有効にします。次のブロックで定義されているプロパティの PreSet および PostSet のリスナーをそれぞれ定義できます。
properties (SetObservable) PropOne PropTwo end
プロパティ イベントのコールバック関数の定義
MATLAB® がプロパティ イベントをトリガーするときに、リスナーはコールバック関数を実行します。リスナーにより呼び出されるときに関数に自動的に渡される、2 つの特定の引数をもつコールバック関数を定義します。
イベント ソース — プロパティ イベントのソースであるオブジェクトを記述する
matlab.metadata.Propertyオブジェクトイベント データ — イベントについての情報を含む
event.PropertyEventオブジェクト
必要な場合、追加の引数を渡すことができます。これら 2 つの引数は、それらのプロパティに最も必要な情報を含むので、このメソッドを Static として定義することは、しばしば簡単です。
たとえば、関数 handlePropEvents は、他のクラスのオブジェクトの 2 つのプロパティに対してリスナーを作成する、クラスの静的メソッドであるものとします。
methods (Static) function handlePropEvents(src,evnt) switch src.Name case 'PropOne' % PropOne has triggered an event case 'PropTwo' % PropTwo has triggered an event end end end
他に、イベント名 (この場合、PreSet または PostSet) をキーオフする switch ステートメントにおいて、event.PropertyEvent オブジェクトの EventName プロパティを使用することもできます。
matlab.metadata.Property クラスの詳細については、クラスのメタデータを参照してください。
リスナーのプロパティへの追加
addlistener ハンドル クラスのメソッドを使用すると、リスナー オブジェクトを永続変数として保存しなくても、リスナーをプロパティに付加できます。プロパティ イベントに対して、引数を 4 つもつ addlistener を使用します。
addlistener の呼び出しは次のようになります。
addlistener(EventObject,'PropOne','PostSet',@ClassName.handlePropertyEvents);
引数は、次のようになります。
EventObject— イベントを生成するオブジェクトのハンドルPropOne— リッスンしようとするプロパティ名PostSet— リッスンしようとするイベント名@— 静的メソッドを参照する関数ハンドル。クラス名を使用する必要があります。ClassName.handlePropertyEvents
リスナー コールバックが通常のメソッドで、静的メソッドではない場合、構文は以下のようになります。
addlistener(EventObject,'PropOne','PostSet',@obj.handlePropertyEvents);
ここで、obj は、コールバック メソッドを定義するオブジェクトのハンドルです。
リスナー コールバックがクラス メソッドではない関数である場合、その関数に関数ハンドルを渡します。コールバック関数が名前空間関数であると仮定します。
addlistener(EventObject,'PropOne','PostSet',@namespace.handlePropertyEvents);
関数を引数として渡す方法の詳細については、関数ハンドルの作成を参照してください。
プロパティ イベントとリスナー クラス
次の 2 つのクラスは、2 つのプロパティ (PropOne と PropTwo) に対して PostSet プロパティ リスナーを作成する方法を示します。
イベントを生成するクラス
PropEvent クラスにより、SetObservable プロパティの属性を指定することで、プロパティ PreSet と PostSet のイベント トリガーが可能になります。さらに、これらのプロパティは、AbortSet 属性も有効にします。プロパティがそれらの現在値と同じ値に設定される場合、プロパティ イベントのトリガーを妨げます。プロパティ値が変化しない場合の代入を参照してください。
classdef PropEvent < handle properties (SetObservable, AbortSet) PropOne PropTwo end methods function obj = PropEvent(p1,p2) if nargin > 0 obj.PropOne = p1; obj.PropTwo = p2; end end end end
リスナーを定義するクラス
PropListener クラスは、以下の 2 つのリスナーを定義します。
プロパティ
PropOnePostSetイベントプロパティ
PropTwoPostSetイベント
同様のアプローチを使用して、他のイベントまたは他のプロパティに対するリスナーを定義できます。各リスナーに同じコールバック関数を使用する必要はありません。リスナー コールバック関数に渡される引数に含まれる情報の詳細については、matlab.metadata.Property および event.PropertyEvent のリファレンス ページを参照してください。
classdef PropListener < handle % Define property listeners methods function obj = PropListener(evtobj) if nargin > 0 addlistener(evtobj,'PropOne','PostSet',@PropListener.handlePropEvents); addlistener(evtobj,'PropTwo','PostSet',@PropListener.handlePropEvents); end end end methods (Static) function handlePropEvents(src,evnt) switch src.Name case 'PropOne' sprintf('PropOne is %s\n',num2str(evnt.AffectedObject.PropOne)) case 'PropTwo' sprintf('PropTwo is %s\n',num2str(evnt.AffectedObject.PropTwo)) end end end end