プログラムで作成したアプリ用のコールバックの作成
アプリの UI コンポーネントをアプリ ユーザーの入力に応答するようにプログラムするには、その UI コンポーネントの "コールバック関数" を作成します。コールバック関数は、ボタンのクリックなどのユーザー操作への応答として実行される関数です。各 UI コンポーネントに、それぞれ特定のアクションに対応する複数の "コールバック プロパティ" があります。ユーザーがアプリの実行時にそれらのアクションのいずれかを実行すると、関連するコールバック プロパティに割り当てられた関数が MATLAB® で実行されます。
たとえば、ボタンがあるアプリで、そのボタンをユーザーがクリックしたときにアプリが更新されるようにするとします。そのためには、更新を実行する関数を記述し、ボタンの ButtonPushedFcn
プロパティをその関数のハンドルに設定します。コールバック関数は、コンポーネントの作成時に名前と値の引数としてコールバック プロパティに割り当てることができます。また、コード内の任意の場所からドット表記を使用してプロパティを設定できます。
UI コンポーネントのコールバック プロパティを調べるには、各 UI コンポーネントのプロパティのページを参照してください。
コールバック関数の引数
MATLAB では、UI コンポーネントでコールバック関数を実行する際、その関数に 2 つの入力引数を自動的に渡します。これらの入力引数の名前は、多くの場合 src
と event
です。最初の引数は、コールバックをトリガーした UI コンポーネントです。2 番目の引数は、コールバック関数にイベント データを提供します。提供されるイベント データは、コールバック プロパティおよびコンポーネントの種類に固有です。コールバック プロパティに関連付けられたイベント データを調べるには、コールバックを実行する UI コンポーネントのプロパティのページを参照してください。
たとえば、関数 updateDropDown
は、それらのコールバックの入力を使用して、ユーザーが新しい値を入力したときに編集可能なドロップダウン メニューに項目を追加します。ドロップダウンで addItems
コールバックが実行されると、src
にドロップダウン コンポーネントが格納され、event
に操作に関する情報が格納されます。関数は、event.Edited
プロパティを使用して、その値がユーザーの入力した新しい値であるか既存の項目であるかをチェックします。新しい値の場合、関数は次に event.Value
プロパティを使用して、その値をドロップダウンの項目に追加します。
この関数を実行するには、MATLAB パス上の updateDropDown.m
という名前のファイルに保存します。ドロップダウン メニューで新しい値を入力して Enter キーを押し、更新されたドロップダウンの項目を確認します。
function updateDropDown fig = uifigure('Position',[500 500 300 200]); dd = uidropdown(fig, ... 'Editable','on', ... 'Items',{'Red','Green','Blue'}, ... 'ValueChangedFcn',@addItems); end function addItems(src,event) val = event.Value; if event.Edited src.Items{end+1} = val; end end
コールバック関数の指定
次のいずれかの方法で、コールバック関数をコールバック プロパティに割り当てます。
関数ハンドルの指定 — この方法は、コールバックに追加の入力引数が必要ない場合に使用します。
cell 配列の指定 — この方法は、コールバックに追加の入力引数が必要な場合に使用します。cell 配列には、最初の要素として関数ハンドルが含まれ、その後に関数で使用する入力引数が含まれます。
無名関数の指定 — この方法は、簡単なコールバック コードの場合や常にコールバックとして実行されるわけでない関数を再利用する場合に使用します。
関数ハンドルの指定
関数ハンドルは、関数を変数として表す手段を提供します。関数として、アプリ コードと同じファイル内のローカル関数や入れ子関数、または MATLAB パス上にある個別のファイルで定義された関数を指定できます。関数ハンドルを作成するには、関数の名前の前に @
演算子を指定します。
たとえば、クリックに応答するボタンを作成するには、次の関数を MATLAB パス上の codeButtonResponse.m
という名前のファイルに保存します。このコードは、関数 uibutton
を使用してボタンを作成し、ButtonPushedFcn
プロパティを関数 buttonCallback
のハンドルに設定します。このハンドルは @buttonCallback
という表記を使用して作成されます。関数ハンドルで明示的には入力引数を参照していませんが、関数宣言に src
と event
の入力引数が含まれていることに注目してください。
function codeButtonResponse fig = uifigure('Position',[500 500 300 200]); btn = uibutton(fig,'ButtonPushedFcn',@buttonCallback); function buttonCallback(src,event) disp('Button pressed'); end end
コールバックを関数ハンドルとして指定すると、各コールバック関数をコンポーネントに割り当てるときに、MATLAB で構文エラーや見つからない依存関係がチェックされるという利点があります。コールバック関数に問題がある場合、ユーザーがコールバックをトリガーするまで待たなくても、すぐに MATLAB からエラーが返されます。この動作は、コードの問題をユーザーの環境で発生する前に特定するのに役立ちます。
cell 配列の指定
コールバックは、いずれもソースとイベントの 2 つの入力引数を受け入れます。これらの 2 つ以外の追加の入力引数を受け入れるコールバックを指定するには、cell 配列を使用します。cell 配列の最初の要素は関数ハンドルです。cell 配列の他の要素は使用する追加の入力引数であり、コンマで区切って指定します。指定する関数は、関数ハンドルの指定で説明しているように、最初の 2 つの入力引数としてソースとイベントの引数を受け入れなければなりません。ただし、それらの最初の 2 つの引数の後に、関数宣言で追加の入力を定義できます。
たとえば、関数 codeComponentResponse
は、ボタンとチェック ボックスのコンポーネントを作成します。その両方で同じ関数をコールバックとして使用しますが、渡す引数が異なります。それぞれのコンポーネントに異なる入力引数を指定するには、両方のコンポーネントのコールバック プロパティを cell 配列に設定します。cell 配列の最初の要素は関数 componentCallback
のハンドルで、2 番目は関数に渡す追加の入力引数です。
この例を実行するには、関数を MATLAB パス上の codeComponentResponse.m
という名前のファイルに保存します。チェック ボックスをオンまたはオフにすると、MATLAB で「You clicked the check box
」と表示されます。ボタンをクリックすると、MATLAB で「You clicked the button
」と表示されます。
function codeComponentResponse fig = uifigure('Position',[500 500 300 200]); cbx = uicheckbox(fig,'Position',[100 125 84 22], ... 'ValueChangedFcn',{@componentCallback,'check box'}); btn = uibutton(fig,'Position',[100 75 84 22], ... 'ButtonPushedFcn',{@componentCallback,'button'}); function componentCallback(src,event,comp) disp(['You clicked the ' comp]); end end
関数ハンドルとして指定されたコールバックと同様に、cell 配列として指定されたコールバックについては、コンポーネントに割り当てるときに MATLAB で構文エラーや見つからない依存関係がチェックされます。コールバック関数に問題がある場合、ユーザーがコールバックをトリガーするまで待たなくても、すぐに MATLAB からエラーが返されます。この動作は、コードの問題をユーザーの環境で発生する前に特定するのに役立ちます。
無名関数の指定
無名関数は、プログラム ファイルに保存されない関数です。無名関数は以下の場合に指定します。
UI コンポーネントで関数ハンドルや cell 配列に必要なソースとイベントの 2 つの引数をサポートしない関数を実行する。
UI コンポーネントでスクリプトを実行する。
コールバックが単一の実行可能ステートメントで構成されている。
無名関数を指定するには、必須であるソースとイベントの 2 つの入力引数を含めて、コールバック関数、スクリプト、またはステートメントを実行する関数ハンドルを作成します。
たとえば、関数 changeSlider
は、スライダー UI コンポーネントとスライダーの値をインクリメントするボタンを作成します。コールバックの内部と外部のどちらからでも呼び出せるように設計されているため、関数 incrementSlider
にはソースとイベントの入力引数がありません。ボタンが押されたときに incrementSlider
を実行するには、src
と event
の入力引数を受け入れ、それらを無視して incrementSlider
を実行する無名関数を作成します。
関数 changeSlider
を実行するには、以下のコードを MATLAB パス上の changeSlider.m
という名前のファイルに保存します。
function changeSlider fig = uifigure('Position',[500 500 300 200]); s = uislider(fig,'Position',[75 150 150 3]); incrementSlider; b = uibutton(fig,'Position',[100 50 100 22], ... 'Text','Increment', ... 'ButtonPushedFcn',@(src,event)incrementSlider); function incrementSlider if s.Value < s.Limits(2) s.Value = s.Value + 1; end end end
コールバックが単一の実行可能ステートメントである場合は、コールバックを無名関数として指定すると、ステートメントに対して個別の関数を定義せずに済みます。たとえば、次のコードは、コールバックを無名関数として指定して、ボタンがクリックされたときに「Button pressed
」と表示するボタンを作成します。
fig = uifigure('Position',[500 500 300 200]); btn = uibutton(fig,'ButtonPushedFcn',@(src,event)disp('Button pressed'));
関数ハンドルまたは cell 配列として指定されたコールバックとは異なり、無名関数として指定されたコールバックについては、コンポーネントに割り当てるときに MATLAB で構文エラーや見つからない依存関係がチェックされません。無名関数に問題がある場合、ユーザーがコールバックをトリガーするまで検出されません。
MATLAB コマンドを含むテキストの指定 (非推奨)
少数の簡単なコマンドを実行する場合、コールバックを文字ベクトルまたは string スカラーとして指定できますが、含まれるコマンドが少数でないとコールバックの管理が難しくなることがあります。関数ハンドルまたは cell 配列として指定されたコールバックとは異なり、文字ベクトルまたは string については、MATLAB で構文エラーや見つからない依存関係が "チェックされません"。MATLAB 式に問題がある場合、ユーザーがコールバックをトリガーするまで検出されません。指定する文字ベクトルまたは string は、関数の引数を含めることができる有効な MATLAB 式で構成しなければなりません。
たとえば、以下のコードは、UIAxes
オブジェクトと、クリックされたときにランダム データを座標軸にプロットするボタンを作成します。文字ベクトル 'plot(ax,rand(20,3))'
に変数 ax
が含まれていることに注目してください。変数 ax
は、ユーザーがコールバックをトリガーしたときにベース ワークスペースに存在していなければならず、存在していないと MATLAB からエラーが返されます。コールバック プロパティの値を割り当てる時点で変数が存在している必要はありませんが、ユーザーがコールバックをトリガーした時点で存在している必要があります。
コードを実行し、ボタンをクリックします。ax
がベース ワークスペースに存在しているため、コールバック コマンドは有効であり、MATLAB でデータがプロットされます。
fig = uifigure; ax = uiaxes(fig,'Position',[125 100 300 300]); b = uibutton(fig,'Position',[225 50 100 22], ... 'Text','Plot Data', ... 'ButtonPushedFcn','plot(ax,rand(20,3))');