Main Content

プログラムで作成したアプリ用のコールバックの作成

アプリの UI コンポーネントをアプリ ユーザーの入力に応答するようにプログラムするには、その UI コンポーネントの "コールバック関数" を作成します。コールバック関数は、ボタンのクリックなどのユーザー操作への応答として実行される関数です。各 UI コンポーネントに、それぞれ特定のアクションに対応する複数の "コールバック プロパティ" があります。ユーザーがアプリの実行時にそれらのアクションのいずれかを実行すると、関連するコールバック プロパティに割り当てられた関数が MATLAB® で実行されます。

たとえば、ボタンがあるアプリで、そのボタンをユーザーがクリックしたときにアプリが更新されるようにするとします。そのためには、更新を実行する関数を記述し、ボタンの ButtonPushedFcn プロパティをその関数のハンドルに設定します。コールバック関数は、コンポーネントの作成時に名前と値の引数としてコールバック プロパティに割り当てることができます。また、コード内の任意の場所からドット表記を使用してプロパティを設定できます。

UI コンポーネントのコールバック プロパティを調べるには、各 UI コンポーネントのプロパティのページを参照してください。

コールバック関数の引数

MATLAB では、UI コンポーネントでコールバック関数を実行する際、その関数に 2 つの入力引数を自動的に渡します。これらの入力引数の名前は、多くの場合 srcevent です。最初の引数は、コールバックをトリガーした 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

A UI figure window with a label and drop-down. The drop-down value is "Purple", and the items contain "Purple" as an option.

コールバック関数の指定

次のいずれかの方法で、コールバック関数をコールバック プロパティに割り当てます。

  • 関数ハンドルの指定 — この方法は、コールバックに追加の入力引数が必要ない場合に使用します。

  • cell 配列の指定 — この方法は、コールバックに追加の入力引数が必要な場合に使用します。cell 配列には、最初の要素として関数ハンドルが含まれ、その後に関数で使用する入力引数が含まれます。

  • 無名関数の指定 — この方法は、簡単なコールバック コードの場合や常にコールバックとして実行されるわけでない関数を再利用する場合に使用します。

  • MATLAB コマンドを含むテキストの指定 (非推奨)

関数ハンドルの指定

関数ハンドルは、関数を変数として表す手段を提供します。関数として、アプリ コードと同じファイル内のローカル関数や入れ子関数、または MATLAB パス上にある個別のファイルで定義された関数を指定できます。関数ハンドルを作成するには、関数の名前の前に @ 演算子を指定します。

たとえば、クリックに応答するボタンを作成するには、次の関数を MATLAB パス上の codeButtonResponse.m という名前のファイルに保存します。このコードは、関数 uibutton を使用してボタンを作成し、ButtonPushedFcn プロパティを関数 buttonCallback のハンドルに設定します。このハンドルは @buttonCallback という表記を使用して作成されます。関数ハンドルで明示的には入力引数を参照していませんが、関数宣言に srcevent の入力引数が含まれていることに注目してください。

function codeButtonResponse
  fig = uifigure('Position',[500 500 300 200]);
  btn = uibutton(fig,'ButtonPushedFcn',@buttonCallback);
    
  function buttonCallback(src,event)
    disp('Button pressed');
  end
end

A UI figure window with a button component.

コールバックを関数ハンドルとして指定すると、各コールバック関数をコンポーネントに割り当てるときに、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

A UI figure window with a check box component above a button component.

関数ハンドルとして指定されたコールバックと同様に、cell 配列として指定されたコールバックについては、コンポーネントに割り当てるときに MATLAB で構文エラーや見つからない依存関係がチェックされます。コールバック関数に問題がある場合、ユーザーがコールバックをトリガーするまで待たなくても、すぐに MATLAB からエラーが返されます。この動作は、コードの問題をユーザーの環境で発生する前に特定するのに役立ちます。

無名関数の指定

無名関数は、プログラム ファイルに保存されない関数です。無名関数は以下の場合に指定します。

  • UI コンポーネントで関数ハンドルや cell 配列に必要なソースとイベントの 2 つの引数をサポートしない関数を実行する。

  • UI コンポーネントでスクリプトを実行する。

  • コールバックが単一の実行可能ステートメントで構成されている。

無名関数を指定するには、必須であるソースとイベントの 2 つの入力引数を含めて、コールバック関数、スクリプト、またはステートメントを実行する関数ハンドルを作成します。

たとえば、関数 changeSlider は、スライダー UI コンポーネントとスライダーの値をインクリメントするボタンを作成します。コールバックの内部と外部のどちらからでも呼び出せるように設計されているため、関数 incrementSlider にはソースとイベントの入力引数がありません。ボタンが押されたときに incrementSlider を実行するには、srcevent の入力引数を受け入れ、それらを無視して 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

A UI figure window with a slider component with a value of 1, and a button below the slider with the text "Increment".

コールバックが単一の実行可能ステートメントである場合は、コールバックを無名関数として指定すると、ステートメントに対して個別の関数を定義せずに済みます。たとえば、次のコードは、コールバックを無名関数として指定して、ボタンがクリックされたときに「Button pressed」と表示するボタンを作成します。

fig = uifigure('Position',[500 500 300 200]);
btn = uibutton(fig,'ButtonPushedFcn',@(src,event)disp('Button pressed'));

A UI figure window with a button component.

関数ハンドルまたは 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))');

A UI figure window with an axes and a button component. The button text says "Plot Data". The axes has three lines of random data displayed on it.

関連するトピック