このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
GUIDE でのコールバックの作成
メモ
GUIDE 環境は将来のリリースで削除される予定です。既存の GUIDE アプリは、GUIDE が削除された後も引き続き MATLAB® で動作しますが、GUIDE での編集はできません。
既存の GUIDE アプリを引き続き編集するには、将来の MATLAB リリースとの互換性維持に役立つ方法について、GUIDE の移行策を参照してください。新しいアプリを対話的に作成する場合は、代わりにApp Designer を使用したアプリ開発を参照してください。
異なるユーザー操作用のコールバック
UI とグラフィックスのコンポーネントのプロパティには、特定のコールバック関数に関連付けできるものがあります。これらのプロパティはそれぞれ、特定のユーザー操作に対応します。たとえば、uicontrol には、Callback
と呼ばれるプロパティがあります。このプロパティの値は、コールバック関数へのハンドル、無名関数、または MATLAB 式を含む文字ベクトルとして設定できます。このプロパティを設定すると、uicontrol を操作するときにアプリが応答するようになります。Callback
プロパティに値が指定されていない場合、ユーザーが uicontrol を操作しても何も起きません。
次の表に、使用可能なコールバック プロパティ、コールバック関数をトリガーするユーザー操作、それらのプロパティを使用する一般的な UI コンポーネントとグラフィックス コンポーネントの一覧を示します。
コールバック プロパティ | ユーザー アクション | このプロパティを使用するコンポーネント |
---|---|---|
ButtonDownFcn | ポインターがコンポーネント上または Figure 上にあるときにエンド ユーザーがマウス ボタンをクリックする。 | |
Callback | エンド ユーザーがコンポーネントをトリガーする。以下に例を示します。メニュー項目の選択、スライダーの移動、プッシュ ボタンの押し下げ。 | |
CellEditCallback | エンド ユーザーがテーブル内にある編集可能なセルの値を編集する。 | |
CellSelectionCallback | エンド ユーザーがテーブル内のセルを選択する。 | |
ClickedCallback | エンド ユーザーがマウスの左ボタンでプッシュ ツールまたはトグル ツールをクリックする。 | |
CloseRequestFcn | Figure が閉じる。 | |
CreateFcn | MATLAB がオブジェクトを作成し、そのオブジェクトが表示される前にコールバックが実行される。 |
|
DeleteFcn | MATLAB が Figure を削除する直前にコールバックが実行される。 |
|
KeyPressFcn | ポインターがオブジェクト上にあるときにエンド ユーザーがキーボードのキーを押す。 | |
| ポインターがオブジェクト上にあるときにエンド ユーザーがキーボードのキーを離す。 | |
OffCallback | トグル ツールの | |
OnCallback | トグル ツールの | |
|
| |
SelectionChangedFcn | エンド ユーザーが、ボタン グループ内にある別のラジオ ボタンやトグル ボタンを選択する。 | |
WindowButtonDownFcn | ポインターが Figure ウィンドウ内にあるときにエンド ユーザーがマウス ボタンをクリックする。 | |
WindowButtonMotionFcn | エンド ユーザーが Figure ウィンドウ内でポインターを移動する。 | |
WindowButtonUpFcn | エンド ユーザーがマウス ボタンを離す。 | |
WindowKeyPressFcn | ポインターが Figure 上またはその子オブジェクト上にあるときにエンド ユーザーがキーを押す。 | |
WindowKeyReleaseFcn | ポインターが Figure 上またはその子オブジェクト上にあるときにエンド ユーザーがキーを離す。 | |
| ポインターが Figure 上にあるときにエンド ユーザーがマウス ホイールを回す。 |
GUIDE が生成するコールバック関数とプロパティ値
GUIDE がコールバック関数とプロパティを管理する方法
UI に uicontrol
、uimenu
または uicontextmenu
のコンポーネントを追加すると、UI を保存する前に GUIDE は Callback
プロパティに値 %automatic
を指定します。この値は、GUIDE がコールバック関数の名前を生成することを示します。
UI の保存時に、GUIDE はコード ファイルに空のコールバック関数定義を追加し、コントロールの Callback
プロパティを無名関数として設定します。次の関数の定義は、プッシュ ボタンについて GUIDE が生成するコールバック関数の例です。
function pushbutton1_Callback(hObject,eventdata,handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) end
myui
という名前を付けて保存すると、GUIDE はプッシュ ボタンの Callback
プロパティに次の値を設定します。@(hObject,eventdata)myui('pushbutton1_Callback',hObject,eventdata,guidata(hObject))
pushbutton1_Callback
の参照として機能する無名関数です。この無名関数には入力引数が 4 つあります。最初の引数は、コールバック関数の名前です。残り 3 つの引数は MATLAB によって指定されるもので、GUIDE コールバックの構文で説明しています。メモ
テーブル、パネル、ボタン グループなどのその他の UI コンポーネントについて、GUIDE はコールバック関数を自動生成しません。これらのコンポーネントのいずれかからコールバック関数を実行する場合は、コールバックを作成しなければなりません。このためには、レイアウト内のコンポーネントを右クリックし、コンテキスト メニューの [コールバックの表示] から項目を選択します。
GUIDE コールバックの構文
コールバックはすべて、少なくとも 3 つの入力引数を受け取らなければなりません。
hObject
— コールバックをトリガーした UI コンポーネントeventdata
— 特定のマウスやキーボード操作についての詳細情報を含む変数handles
— UI 内のすべてのオブジェクトを含むstruct
。GUIDE は、関数guidata
を使用してこの構造体を保存し維持します。
コールバック関数が追加の引数を受け取るようにするには、関数定義の引数リストの最後に追加の引数を指定しなければなりません。
eventdata 引数
eventdata
引数は、特定のコールバック関数に詳細情報を表示します。たとえば、ユーザーが KeyPressFcn
をトリガーした場合、MATLAB はエンド ユーザーが押した特定のキー (またはキーの組み合わせ) に関する情報を表示します。コールバック関数で使用できる eventdata
がない場合、MATLAB はこれを空の配列として渡します。次の表に、eventdata
を使用するコールバックとコンポーネントを示します。
コールバックのプロパティ名 | コンポーネント |
---|---|
WindowKeyPressFcn WindowKeyReleaseFcn WindowScrollWheel | figure |
KeyPressFcn | figure , uicontrol , uitable |
KeyReleaseFcn | figure , uicontrol , uitable |
SelectionChangedFcn | uibuttongroup |
CellEditCallback CellSelectionCallback | uitable |
GUIDE コールバック間のデータ共有
アプリ内で相互依存するコントロール、メニュー、グラフィックス オブジェクトを作成するには、コンポーネントにアクセスする必要のあるアプリの各部分と明示的にデータを共有しなければなりません。
方法 | 説明 | 要件とトレードオフ |
---|---|---|
UserData の共有 | コンポーネント オブジェクトを使用して、直接プロパティ値を取得または設定します。 すべての UI コンポーネントには、任意の MATLAB データを格納できる |
|
アプリケーション データの共有 | 関数 |
|
guidata の使用 | 関数 |
|
GUIDE アプリでの UserData の共有
UI コンポーネントのプロパティには、役立つ情報が含まれています。たとえば、Value
プロパティをクエリすると、スライダーの現在の位置がわかります。さらに、すべてのコンポーネントに UserData
プロパティがあり、ここに任意の MATLAB 変数を格納できます。コールバック関数がコンポーネントにアクセスできる限り、すべてのコールバック関数は UserData
プロパティに格納された値にアクセスできます。
スライダーのデータを UserData
プロパティと共有するように GUIDE アプリを設定するには、次の手順を実行します。
コマンド ウィンドウで「
guide
」と入力し、新しい空白の GUI を開きます。以下の手順に従って、コンポーネント パレットに UI コンポーネントの名前を表示します。
[ファイル] 、 [基本設定] 、 [GUIDE] を選択します。
[コンポーネント パレットに名前を表示] をオンにします。
[OK] をクリックします。
レイアウト エディターの左のコンポーネント パレットから [プッシュ ボタン] ツールを選択し、レイアウト領域にドラッグします。
レイアウト エディターの左のコンポーネント パレットから [スライダー] ツールを選択し、レイアウト領域にドラッグします。
[ファイル] 、 [保存] を選択します。UI を
myslider.fig
として保存します。MATLAB で、コード ファイルがエディターで開きます。オープニング関数
myslider_OpeningFcn
のUserData
プロパティの初期値を設定します。この関数は、UI がユーザーに対して表示可能になる直前に実行されます。myslider_OpeningFcn
内のhandles.output = hObject
コマンドの直後に以下のコマンドを挿入します。コマンドを追加した後、data = struct('val',0,'diffMax',1); set(handles.slider1,'UserData',data);
myslider_OpeningFcn
は次のようになります。function myslider_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to junk (see VARARGIN) % Choose default command line output for myslider handles.output = hObject; data = struct('val',0,'diffMax',1); set(handles.slider1,'UserData',data); % Update handles structure guidata(hObject, handles); % UIWAIT makes myslider wait for user response % uiwait(handles.figure1);
handles
がmyslider_OpeningFcn
への入力引数である点に注意してください。変数handles
は、UI 内のすべてのコンポーネントを含む構造体です。この構造体の各フィールドは個々のコンポーネントに対応しています。各フィールド名は、対応するコンポーネントのTag
プロパティに一致します。したがって、handles.slider1
は、この UI 内のスライダー コンポーネントです。コマンドset(handles.slider1,'UserData',data)
は、変数data
をスライダーのUserData
プロパティに格納します。スライダー コールバックに、データを変更するためのコードを追加します。以下のコマンドを、関数
slider1_Callback
の末尾に追加します。コマンドを追加した後、maxval = get(hObject,'Max'); sval = get(hObject,'Value'); diffMax = maxval - sval; data = get(hObject,'UserData'); data.val = sval; data.diffMax = diffMax; % Store data in UserData of slider set(hObject,'UserData',data);
slider1_Callback
は次のようになります。% --- Executes on slider movement. function slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider maxval = get(hObject,'Max'); sval = get(hObject,'Value'); diffMax = maxval - sval; data = get(hObject,'UserData'); data.val = sval; data.diffMax = diffMax; % Store data in UserData of slider set(hObject,'UserData',data);
hObject
が関数slider1_Callback
の入力引数である点に注意してください。hObject
は、常にコールバックをトリガーするコンポーネント (この例ではスライダー) です。したがって、set(hObject,'UserData',data)
は、変数data
をスライダーのUserData
プロパティに格納します。プッシュ ボタン コールバックに、データを取得するためのコードを追加します。以下のコマンドを、関数
pushbutton1_Callback
の末尾に追加します。コマンドを追加した後、% Get UserData from the slider data = get(handles.slider1,'UserData'); currentval = data.val; diffval = data.diffMax; display([currentval diffval]);
pushbutton1_Callback
は次のようになります。% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get UserData from the slider data = get(handles.slider1,'UserData'); currentval = data.val; diffval = data.diffMax; display([currentval diffval]);
このコードは、handles 構造体を使用してスライダーにアクセスします。コマンド
data = get(handles.slider1,'UserData')
は、スライダーのUserData
プロパティを取得します。その後、関数display
が格納された値を表示します。エディターのツールストリップで [保存] を押して、コードを保存します。
GUIDE アプリでのアプリケーション データの共有
アプリケーション データを格納するには、関数 setappdata
を次のように呼び出します。
setappdata(obj,name,value);
obj
は、データを格納するコンポーネント オブジェクトです。2 番目の入力 name
は、値を記述するフレンドリ名です。3 番目の入力 value
は、格納する値です。アプリケーション データを取得するには、関数 getappdata
を次のように使用します。
data = getappdata(obj,name);
obj
は、データを含むコンポーネント オブジェクトでなければなりません。2 番目の入力 name
は、データの格納時に使用した名前と一致しなければなりません。変数を 1 つだけもつ UserData
プロパティとは異なり、setappdata
を使用すると複数の変数を格納できます。アプリケーション データを共有するように GUIDE アプリを設定するには、次の手順を実行します。
コマンド ウィンドウで「
guide
」と入力し、新しい空白の GUI を開きます。以下の手順に従って、コンポーネント パレットに UI コンポーネントの名前を表示します。
[ファイル] 、 [基本設定] 、 [GUIDE] を選択します。
[コンポーネント パレットに名前を表示] をオンにします。
[OK] をクリックします。
レイアウト エディターの左のコンポーネント パレットから [プッシュ ボタン] ツールを選択し、レイアウト領域にドラッグします。
レイアウト エディターの左のコンポーネント パレットから [スライダー] ツールを選択し、レイアウト領域にドラッグします。
[ファイル] 、 [保存] を選択します。UI を
myslider.fig
として保存します。MATLAB で、コード ファイルがエディターで開きます。オープニング関数
myslider_OpeningFcn
にアプリケーション データの初期値を設定します。この関数は、UI がユーザーに対して表示可能になる直前に実行されます。myslider_OpeningFcn
内のhandles.output = hObject
コマンドの直後に以下のコマンドを挿入します。コマンドを追加した後、setappdata(handles.figure1,'slidervalue',0); setappdata(handles.figure1,'difference',1);
myslider_OpeningFcn
は次のようになります。function myslider_OpeningFcn(hObject,eventdata,handles,varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to junk (see VARARGIN) % Choose default command line output for junk handles.output = hObject; setappdata(handles.figure1,'slidervalue',0); setappdata(handles.figure1,'difference',1); % Update handles structure guidata(hObject, handles); % UIWAIT makes junk wait for user response (see UIRESUME) % uiwait(handles.figure1);
handles
がmyslider_OpeningFcn
への入力引数である点に注意してください。変数handles
は、UI 内のすべてのコンポーネントを含む構造体です。この構造体の各フィールドは個々のコンポーネントに対応しています。各フィールド名は、対応するコンポーネントのTag
プロパティに一致します。この場合、handles.figure1
が figure オブジェクトです。したがって、setappdata
は、この figure オブジェクトを使用してデータを格納できます。スライダー コールバックに、データを変更するためのコードを追加します。以下のコマンドを、関数
slider1_Callback
の末尾に追加します。コマンドを追加した後、maxval = get(hObject,'Max'); currval = get(hObject,'Value'); diffMax = maxval - currval; % Store application data setappdata(handles.figure1,'slidervalue',currval); setappdata(handles.figure1,'difference',diffMax);
slider1_Callback
は次のようになります。このコールバック関数はfunction slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider maxval = get(hObject,'Max'); currval = get(hObject,'Value'); diffMax = maxval - currval; % Store application data setappdata(handles.figure1,'slidervalue',currval); setappdata(handles.figure1,'difference',diffMax);
handles
構造体にアクセスできるため、setappdata
コマンドはデータをhandles.figure1
に格納します。プッシュ ボタン コールバックに、データを取得するためのコードを追加します。以下のコマンドを、関数
pushbutton1_Callback
の末尾に追加します。コマンドを追加した後、% Retrieve application data currentval = getappdata(handles.figure1,'slidervalue'); diffval = getappdata(handles.figure1,'difference'); display([currentval diffval]);
pushbutton1_Callback
は次のようになります。このコールバック関数は% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Retrieve application data currentval = getappdata(handles.figure1,'slidervalue'); diffval = getappdata(handles.figure1,'difference'); display([currentval diffval]);
handles
構造体にアクセスできるため、getappdata
コマンドはhandles.figure1
からデータを取得します。エディターのツールストリップで [保存] を押して、コードを保存します。
GUIDE アプリでの guidata
を使用したデータの保存および共有
GUIDE では、関数 guidata
を使用して、すべての UI コンポーネントを含む handles
と呼ばれる構造体を格納します。配列 handles
は MATLAB で各コールバック関数に渡されます。追加データを共有するために guidata
を使用する場合は、オープニング関数の handles
構造体にフィールドを追加します。オープニング関数は、名前に _OpeningFcn
を含むコード ファイルの先頭付近で定義される関数です。
コールバック関数のデータを変更するには、handles
構造体を変更してから、関数 guidata
を使用してその構造体を格納します。次のスライダーのコールバック関数は、GUIDE コールバック関数内で handles
構造体を変更して格納する方法を示します。
function slider1_Callback(hObject, eventdata,handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range handles.myvalue = 2; guidata(hObject,handles); end
GUIDE の例: guidata を使用したスライダー データの共有
ここでは、関数 guidata
を使用してスライダーとテキスト フィールド間でデータを共有する、プリビルドの GUIDE アプリを示します。スライダーを動かすと、テキスト フィールドに表示された数字が変化し、新しいスライダーの位置を示します。
GUIDE の例: 2 つのアプリ間でのデータの共有
ここでは、アプリケーション データと関数 guidata
を使用して 2 つのダイアログ ボックス間でデータを共有する、プリビルドの GUIDE アプリを示します。2 番目のダイアログ ボックスにテキストを入力して [OK] をクリックすると、最初のダイアログ ボックスのボタン ラベルが変わります。
changeme_main.m
では、関数 buttonChangeMe_Callback
がこのコマンドを実行して 2 つ目のダイアログ ボックスを表示します。
changeme_dialog('changeme_main', handles.figure)
handles.figure
入力引数は、[changeme_main] ダイアログ ボックスの Figure
オブジェクトです。
関数 changeme_dialog
は Figure
オブジェクトから handles
構造体を取得します。したがって、[changeme_main] ダイアログ ボックスのすべてのコンポーネントを 2 つ目のダイアログ ボックスから使用できます。
GUIDE の例: 3 つのアプリ間でのデータの共有
ここでは、guidata
および UserData
を使用して 3 つのアプリ ウィンドウ間でデータを共有する、プリビルドの GUIDE アプリを示します。大きなウィンドウはアイコンのエディターで、ツール パレットおよびカラー パレットのウィンドウからの情報を受け取ります。
guide_inconeditor.m
では、関数 guide_iconeditor_OpeningFcn
に次のコマンドが含まれています。
colorPalette = guide_colorpalette('iconEditor', hObject)
引数は、次のようになります。
'iconEditor'
は、関数の実行でトリガーされる guide_iconEditor ウィンドウのコールバックを指定します。hObject
は、guide_iconEditor ウィンドウのFigure
オブジェクトです。colorPalette
は、guide_colorPalette ウィンドウのFigure
オブジェクトです。
同様にして、guide_iconeditor_OpeningFcn
は、同じような入力引数と出力引数をもつ関数 guide_toolpalette
を呼び出します。
これらの関数間で Figure
オブジェクトを渡すことにより、guide_iconEditor ウィンドウで他の 2 つのウィンドウの handles
構造体にアクセスすることが可能になります。また、他の 2 つのウィンドウでも guide_iconEditor ウィンドウの handles
構造体にアクセスできます。
GUIDE が生成するコールバックの名前変更と削除
コールバックの名前の変更
GUIDE はコンポーネントの Tag
プロパティとコールバックのプロパティ名を組み合わせて、コールバック関数の名前を作成します。コンポーネントの Tag
値を変更すると、次回の UI の保存時に GUIDE がコールバックの名前を変更します。
UI を保存した後に Tag
値を変更する場合、GUIDE は次の項目を更新します (すべてのコンポーネントが一意の Tag
値をもつと仮定)。
コンポーネントのコールバック関数の定義
コンポーネントのコールバック プロパティの値
handles
構造体の対応するフィールドを指すコード ファイル内の参照
コンポーネントの Tag
プロパティを変更せずにコールバック関数の名前を変更するには、次の手順に従います。
コールバック関数定義内の名前を変更します。
無名関数に渡す最初の引数を変更して、コンポーネントのコールバック プロパティを更新します。たとえば、プッシュ ボタンの元のコールバック プロパティは次のようになっています。
@(hObject,eventdata)myui('pushbutton1_Callback',... hObject,eventdata,guidata(hObject))
この例では、
'pushbutton1_Callback'
を新しい関数名に変更しなければなりません。コード ファイル内で、古い関数名を指すその他すべての参照を変更して、新しい関数名を指すようにします。
コールバックの削除
エンド ユーザーが特定の操作を行ったときに実行される関数の削除または変更を行う場合、コールバック関数を削除できます。コールバック関数を削除するには、次の手順に従います。
コード内にあるコールバック関数を参照するすべてのインスタンスを検索し、置き換えします。
GUIDE で UI を開き、プロパティ インスペクターを使用して、コールバック関数を参照するすべてのインスタンスを置き換えます。
コールバック関数を削除します。