App Designer のコールバック
コールバックは、ユーザーがアプリの UI コンポーネントを操作したときに実行される関数です。コールバックを使用してアプリの動作をプログラムできます。たとえば、アプリ ユーザーがボタンをクリックしたときに何らかのデータをプロットするコールバックや、ユーザーがスライダーを操作したときにゲージ コンポーネントの針を動かすコールバックを記述できます。
ほとんどのコンポーネントに少なくとも 1 つのコールバックがあり、各コールバックがコンポーネントの特定の操作に関連付けられています。ただし、ラベル、ランプなどのコンポーネントは情報を表示するのみのコンポーネントであるため、コールバックをもちません。コンポーネントでサポートされるコールバックのリストを確認するには、コンポーネントを選択し、[コンポーネント ブラウザー] で [コールバック] タブをクリックします。
コールバック関数の作成
UI コンポーネントのコールバックを作成する方法はいくつかあります。作業している App Designer の場所に応じて、異なるアプローチを使用できます。最適なアプローチを次のリストから選択します。
キャンバス、[コンポーネント ブラウザー]、または [アプリ レイアウト] ペインでコンポーネントを右クリックし、[コールバック] 、 [(コールバック プロパティ) コールバックの追加] を選択します。
[コンポーネント ブラウザー] で [コールバック] タブを選択します。[コールバック] タブの左側に、サポートされるコールバック プロパティが表示されます。各コールバック プロパティの横にあるドロップダウン リストで、コールバック関数の名前を指定するか、山かっこ <> で囲まれた既定の名前を選択できます。アプリに既存のコールバックがある場合、ドロップダウン リストにそれらのコールバックが含まれます。複数の UI コンポーネントが同じコードを実行するようにする場合は、既存のコールバックを選択します。
コードの [コード ビュー] の [エディター] タブで、 [コールバック] をクリックします。あるいは、[コード ブラウザー] ペインの [コールバック] タブで、 ボタンをクリックします。
[コールバック関数の追加] ダイアログ ボックスで、次のオプションを指定します。
コンポーネント — コールバックを実行する UI コンポーネントを指定します。
コールバック — コールバック プロパティを指定します。コールバック プロパティは、コールバック関数を特定の操作にマップします。一部のコンポーネントは、複数のコールバック プロパティをもつことができます。たとえば、スライダーには 2 つのコールバック プロパティ (
ValueChangedFcn
およびValueChangingFcn
) があります。ValueChangedFcn
コールバックは、ユーザーがスライダーを動かし、マウスを離したときに実行されます。同じコンポーネントのValueChangingFcn
コールバックは、ユーザーがスライダーを動かしている間繰り返し実行されます。名前 — コールバック関数の名前を指定します。App Designer によって既定の名前が設定されますが、テキスト フィールドでそれを変更できます。アプリに既存のコールバックがある場合は、[名前] フィールドの横にドロップダウン矢印が表示され、リストから既存のコールバックを選択できることが示されます。
コールバック関数のプログラム
コンポーネントのコールバックを作成すると、App Designer の [コード ビュー] にコールバック関数が生成され、カーソルがその関数に置かれます。このコールバック関数で、コールバックの動作をプログラムするコードを記述します。
コールバックの入力引数
App Designer で作成されるすべてのコールバック関数には、関数シグネチャに次の入力引数があります。
app
—app
オブジェクト。このオブジェクトは、アプリ内の UI コンポーネント、およびプロパティとして格納されている他の変数にアクセスするために使用します。event
— アプリ ユーザーによる UI コンポーネントの操作に関する特定の情報が含まれているオブジェクト。
app
引数は、コールバックに app
オブジェクトを提供します。この構文を使用して、任意のコールバック内の任意のコンポーネント (およびコンポーネント固有のすべてのプロパティ) にアクセスできます。
app.Component.Property
たとえば、次のコマンドはゲージの Value
プロパティを 50
に設定します。この例では、ゲージの名前は PressureGauge
です。
app.PressureGauge.Value = 50;
event
引数は、実行されている特定のコールバックに応じて、さまざまなプロパティをもつオブジェクトを提供します。オブジェクト プロパティには、コールバックが応答している操作のタイプに関連する情報が含まれています。たとえば、スライダーの ValueChangingFcn
コールバックの event
引数には、Value
と呼ばれるプロパティが含まれています。このプロパティには、ユーザーがサムを動かしたとき (ユーザーがマウスを離す前) にスライダー値が格納されます。event
引数を使用して、ゲージがスライダーの値を追跡するようにするスライダーのコールバック関数を次に示します。
function SliderValueChanging(app,event) latestvalue = event.Value; % Current slider value app.PressureGauge.Value = latestvalue; % Update gauge end
event
引数の詳細については、そのコンポーネントのプロパティ ページを参照してください。プロパティ ページを開くには、コンポーネントを右クリックして [選択のヘルプ] を選択します。すべての UI コンポーネントのプロパティ ページのリストについては、アプリ作成コンポーネントを参照してください。コールバック関数間でのデータの共有
複数のコールバックでアクセスする必要があるデータを保存するには、"プロパティ" を作成します。プロパティにはアプリに属するデータが格納されます。アプリの内部でのみ共有するデータを保存する場合は "プライベート プロパティ"、アプリの外部で (データにアクセスする必要があるスクリプト、関数、その他のアプリなどと) 共有するデータを保存する場合は "パブリック プロパティ" を作成できます。
パブリック プロパティまたはプライベート プロパティを作成するには、[コード ビュー] の [エディター] タブで [プロパティ] ボタンをクリックします。プロパティの名前を入力します。その後、アプリのすべてのコールバック内のプロパティについて、app.
PropertyName
の構文を使用して値を割り当てたりアクセスしたりできます。
詳細については、App Designer アプリ内でのデータの共有を参照してください。
複数のコンポーネント間でのコールバックの共有
コンポーネント間でコールバックを共有すると、アプリで複数の操作方法を提供する場合に便利です。たとえば、ボタンをクリックしたときと、編集フィールドで Enter キーを押したときに、アプリは同じように反応できます。
共通のコールバック タイプをもつ複数のコンポーネントに対して 1 つの共有コールバックを作成できます。たとえば、編集フィールドとスライダーをもつアプリで、両方のコンポーネントを選択し、それらの 1 つを右クリックして [コールバック]、[ValueChangingFcn コールバックの追加] を選択できます。App Designer によって単一の新しいコールバックが作成され、このコールバックが編集フィールドとスライダーの両方に割り当てられます。
あるいは、いずれかのコンポーネントのコールバックを作成した後、それを 2 番目のコンポーネントに割り当てて共有できます。[コンポーネント ブラウザー] で 2 番目のコンポーネントを右クリックし、[コールバック] 、 [既存のコールバックを選択] を選択します。[コールバック関数の選択] ダイアログ ボックスが表示されたら、[名前] ドロップダウン リストから既存のコールバックを選択します。
2 つのコンポーネント間でコールバックを共有するアプリの例については、App Designer の複数のコンポーネントに 1 つのコールバックを使用するを参照してください。
コールバックのプログラムによる作成と割り当て
コールバック関数の作成と割り当ては、アプリ コード内でプログラムによって行うこともできます。[コンポーネント ブラウザー] に表示されないコンポーネントまたはグラフィックス オブジェクトのコールバックを作成するには、この方法を使用します。たとえば、プログラムでは、アプリ コード内で作成するダイアログ ボックスや UIAxes
コンポーネントにプロットする Line
オブジェクトにコールバックを割り当てることができます。
コールバック関数をプライベート関数として作成するには、ツールストリップの [エディター] タブで [関数] 、 [プライベート関数] を選択します。関数の最初の 3 つの引数は、app
、src
および event
でなければなりません。プライベート関数として記述したコールバックの例は次のとおりです。
methods (Access = private) function myclosefcn(app,src,event) disp('Have a nice day!'); end end
コールバック関数をコンポーネントに割り当てるには、@app.
FunctionName
の構文を使用して、コールバック プロパティの値をコールバック関数のハンドルとして指定します。たとえば、次のコードは、関数 myclosefcn
を CloseFcn
コールバック プロパティに割り当てる警告ダイアログ ボックスを作成します。この関数はダイアログ ボックスを閉じるときに実行されます。
uialert(app.UIFigure,"File not found","Alert", ... "CloseFcn",@app.myclosefcn);
追加の入力引数を受け入れるコールバック関数を記述するには、最初の 3 つの引数の後に追加の引数を指定します。たとえば、次のコールバックは、1 つの追加の入力 name
を受け入れます。
methods (Access = private) function displaymsg(app,src,event,name) msg = name + " dialog box closed"; disp(msg); end end
このコールバックをコンポーネントに割り当てるには、コンポーネントのコールバック プロパティを cell 配列として指定します。cell 配列内の 1 番目の要素は関数ハンドルでなければなりません。その後の要素は追加の入力値でなければなりません。以下に例を示します。
uialert(app.UIFigure,"File not found","Alert", ... "CloseFcn",{@app.displaymsg,"Alert"});
詳細については、プログラムによる App Designer への UI コンポーネントの追加を参照してください。
コード内のコールバックの検索
アプリに多数のコールバックがある場合は、[コード ブラウザー] の [コールバック] タブの上部にある検索バーに名前の一部を入力することによって、特定のコールバックをすばやく検索して移動できます。入力を始めると、[コールバック] ペインがクリアされ、検索に一致するコールバックのみが表示されます。
検索結果をクリックし、コールバックをスクロールして表示します。検索結果を右クリックして [移動] を選択すると、コールバック関数にカーソルが置かれます。
コールバックの変更または切断
コンポーネントに別のコールバックを割り当てるには、[コンポーネント ブラウザー] でそのコンポーネントを選択します。次に、[コールバック] タブをクリックし、ドロップダウン リストから別のコールバックを選択します。ドロップダウン リストには、既存のコールバックのみが表示されます。
コンポーネントと共有されているコールバックを切断するには、[コンポーネント ブラウザー] でそのコンポーネントを選択します。次に、[コールバック] タブをクリックし、ドロップダウン メニューから [<コールバックなし>] を選択します。このオプションの選択により、コンポーネントからコールバックのみが切断されます。コードから関数定義が削除されることはなく、また他のコンポーネントからコールバックが切断されることもありません。コールバックを切断した後、コンポーネントの新しいコールバックを作成するか、コンポーネントをコールバック関数なしの状態のままにできます。
コールバックの削除
アプリのいずれのコンポーネントでも使用していないコールバック関数がコードに含まれている場合、その関数を完全に削除できます。コールバックを削除するには、[コード ブラウザー] の [コールバック] タブでコールバックを右クリックして、コンテキスト メニューから [削除] を選択します。
例: スライダー コールバックをもつアプリ
このアプリには、ユーザーがサムを動かしたときにスライダーの値を追跡するゲージが含まれています。スライダーの ValueChangingFcn
コールバックは、event
引数からスライダーの現在の値を取得します。その後、ゲージの針がその値に移動されます。