プロパティ値変更のリスニング
プロパティ リスナーの作成
handle クラスでは、あらかじめ定義されたプロパティ イベント (PreSet
、PostSet
、PreGet
および PostGet
と指定) のリスナーを定義できます。これらの指定イベントのリスナーは次の方法で作成します。
SetObservable
プロパティまたはGetObservable
プロパティのいずれか、または両方の属性を指定する。コールバック関数を定義する。
プロパティの名前とイベントを
addlistener
またはlistener
への呼び出しに含めることで、プロパティ リスナーを作成する。必要に応じて、
event.data
をサブクラス化し、コールバック関数に渡す特化したイベント データ オブジェクトを作成する。新しい値が現在の値と同じ場合、コールバックの実行を回避する (プロパティ値が変化しない場合の代入を参照)。
プロパティの属性を有効なプロパティ イベントに設定
プロパティ ブロックで、SetObservable
属性を有効にします。次のブロックで定義されているプロパティの PreSet
および PostSet
のリスナーをそれぞれ定義できます。
properties (SetObservable)
PropOne
PropTwo
end
プロパティ イベントのコールバック関数の定義
MATLAB® がプロパティ イベントをトリガーするときに、リスナーはコールバック関数を実行します。リスナーにより呼び出されるときに関数に自動的に渡される、2 つの特定の引数をもつコールバック関数を定義します。
イベント ソース — プロパティ イベントのソースであるオブジェクトを記述する
meta.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
プロパティを使用することもできます。
クラスのメタデータでは、meta.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',@package.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 つのリスナーを定義します。
プロパティ
PropOne
PostSet
イベントプロパティ
PropTwo
PostSet
イベント
同様のアプローチを使用して、他のイベントまたは他のプロパティに対するリスナーを定義できます。各リスナーに同じコールバック関数を使用する必要はありません。リスナー コールバック関数に渡される引数に含まれる情報については、関数 meta.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