Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

プロパティ値変更のリスニング

プロパティ リスナーの作成

handle クラスでは、あらかじめ定義されたプロパティ イベント (PreSetPostSetPreGet および 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 つのプロパティ (PropOnePropTwo) に対して PostSet プロパティ リスナーを作成する方法を示します。

イベントを生成するクラス

PropEvent クラスにより、SetObservable プロパティの属性を指定することで、プロパティ PreSetPostSet のイベント トリガーが可能になります。さらに、これらのプロパティは、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

関連するトピック