最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

コールバック間のデータ共有

データの共有方法の概要

多くのアプリには、相互に依存するコントロール、メニュー、グラフィックス オブジェクトが含まれます。各コールバック関数はそれぞれ固有のスコープをもつので、この関数にアクセスする必要があるアプリの部分ごとに明示的にデータを共有しなければなりません。次の表で、アプリ内でデータを共有するための方法をいくつか説明します。

方法説明要件とトレードオフ
UserData またはその他のオブジェクト プロパティへのデータの格納

コンポーネント オブジェクトを使用して、直接プロパティ値を取得または設定します。

すべての UI コンポーネントには、任意の MATLAB® データを格納できる UserData プロパティがあります。

  • プロパティを設定または取得するには、そのコンポーネントにアクセスできる必要があります。

  • UserData が一度に保持できる変数は 1 つのみですが、複数の値を struct 配列または cell 配列として格納できます。

アプリケーション データとしてのデータの格納

関数 setappdata を使用して、特定のコンポーネントにデータを関連付けます。後で関数 getappdata を使用して、そのコンポーネントにアクセスできます。

  • アプリケーション データを設定または取得するには、そのコンポーネントにアクセスできる必要があります。

  • 複数の変数を共有できます。

入れ子にされたコールバック関数の作成

メイン関数の内部でコールバック関数を入れ子にします。これにより、コールバック関数がメイン関数内のすべての変数にアクセスできます。

  • コールバック関数は、メイン関数と同じファイル内にコーディングする必要があります。

  • 複数の変数を共有できます。

関数 guidata によるデータの格納

関数 guidata を使用して、データを Figure ウィンドウと共有します。

  • 任意の UI コンポーネントを使用してデータの格納や取得を行います。

  • 一度に格納できる変数は 1 つのみですが、複数の値を struct 配列または cell 配列として格納できます。

UserData またはその他のオブジェクト プロパティへのデータの格納

UI コンポーネントのプロパティには、役立つ情報が含まれています。たとえば、Value プロパティをクエリすると、スライダーの現在の位置がわかります。さらに、すべてのコンポーネントに UserData プロパティがあり、ここに任意の MATLAB 変数を格納できます。コールバック関数がコンポーネントにアクセスできる限り、すべてのコールバック関数は UserData プロパティに格納された値にアクセスできます。

従来の Figure で作成されたアプリでのユーザー データの共有

従来の Figure のプロパティの設定およびクエリを行うには、ドット表記を使用します。

hfig = figure;
figname = hfig.Name;
hfig.Name = 'My Window';

コードからコンポーネントへ直接アクセスしていない場合は、関数 findobj を使用して、そのコンポーネントを検索できます。正常に検索された場合、findobj はコンポーネントを出力として返します。その後、コンポーネントのプロパティにアクセスできます。

次のアプリ コードは、UserData プロパティを使用してスライダーに関する情報を共有します。その動作を表示するには、このコードをコピーしてエディターに貼り付け、実行します。

function my_slider()
hfig = figure();
slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'UserData',struct('val',0,'diffMax',1),...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Difference',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	sval = hObject.Value;
	diffMax = hObject.Max - sval;
	data = struct('val',sval,'diffMax',diffMax);
	hObject.UserData = data;
end

function button_callback(hObject,eventdata)
	h = findobj('Tag','slider1');
	data = h.UserData;
	display([data.val data.diffMax]);
end
スライダーが移動されると、slider_callback は、以下のコマンドを使用して構造体にデータを格納します。

  • data = struct('val',sval,'diffMax',diffMax) は、値 svaldiffMaxdata という構造体に格納します。

  • hObject.UserData = data は、data の値をスライダーの UserData プロパティに格納します。

プッシュ ボタンがクリックされると、button_callback は、以下のコマンドを使用してデータを取得します。

  • h = findobj('Tag','slider1') は、スライダー コンポーネントを検索します。

  • data = h.UserData は、スライダーの UserData プロパティの値を取得します。

アプリケーション データとしてのデータの格納

アプリケーション データを格納するには、関数 setappdata を次のように呼び出します。

setappdata(obj,name,value);
最初の入力 obj は、データを格納するコンポーネント オブジェクトです。2 番目の入力 name は、値を記述するフレンドリ名です。3 番目の入力 value は、格納する値です。

アプリケーション データを取得するには、関数 getappdata を次のように使用します。

data = getappdata(obj,name);
コンポーネント obj は、データを含むコンポーネント オブジェクトでなければなりません。2 番目の入力 name は、データの格納時に使用した名前と一致しなければなりません。変数を 1 つだけもつ UserData プロパティとは異なり、setappdata を使用すると複数の変数を格納できます。

アプリケーション データの共有

このアプリは、アプリケーション データを使用して 2 つの値を共有します。その動作を表示するには、このコードをコピーしてエディターに貼り付け、実行します。

function my_slider()
hfig = figure();
setappdata(hfig,'slidervalue',0);
setappdata(hfig,'difference',1);

slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Values',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	diffMax = hObject.Max - hObject.Value;
	setappdata(hObject.Parent,'slidervalue',hObject.Value);
	setappdata(hObject.Parent,'difference',diffMax);
end

function button_callback(hObject,eventdata)
	currentval = getappdata(hObject.Parent,'slidervalue');
	diffval = getappdata(hObject.Parent,'difference');
	display([currentval diffval]);
end
スライダーが移動されると、関数 slider_callbackdiffMax を計算します。その後、以下のコマンドを使用して、アプリケーション データを変更します。

  • setappdata(hObject.Parent,'slidervalue',hObject.Value) は、現在のスライダーの値を、'slidervalue' という名前を使用して figure に格納します。この場合、hObject.Parent が figure です。

  • setappdata(parentfig,'difference',diffMax) は、diffMax を、'difference' という名前を使用して figure に格納します。

プッシュ ボタンがクリックされると、関数 button_callback は、以下のコマンドを使用してデータを取得します。

  • currentval = getappdata(hObject.Parent,'slidervalue') は、figure から現在のスライダーの値を取得します。この場合、hObject.Parent が figure です。

  • diffval = getappdata(hObject.Parent,'difference') は、figure から difference の値を取得します。

入れ子にされたコールバック関数の作成

コールバック関数は、プログラム アプリのメイン関数内で入れ子にできます。こうすると、入れ子にされたコールバック関数はメイン関数とワークスペースを共有します。その結果、入れ子関数はメイン関数に定義されているすべての UI コンポーネントと変数にアクセスできるようになります。次のコード例では、入れ子関数を使用してスライダーの位置に関するデータを共有します。その動作を表示するには、このコードをコピーしてエディターに貼り付け、実行します。

function my_slider()
	hfig = figure();
	data = struct('val',0,'diffMax',1);
	slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
	button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Difference',...
         'Callback',@button_callback);

	function slider_callback(hObject,eventdata)
		sval = hObject.Value;
		diffMax = hObject.Max - sval;
		data.val = sval;
		data.diffMax = diffMax;
	end

	function button_callback(hObject,eventdata)
		display([data.val data.diffMax]);
	end
end
メイン関数は、data という名前の struct 配列を定義します。ユーザーがスライダーを動かすと、関数 slider_callbackdata 構造体の valdiffMax のフィールドを更新します。エンド ユーザーがプッシュ ボタンをクリックすると、関数 button_callback によって、data に格納されている値が表示されます。

関数 guidata によるデータの格納

関数 guidata を使用すると、Figure ウィンドウとデータを共有できます。hObject コンポーネントを使用して、任意のコールバックでデータの格納や取得を実行できます。つまり、UserData やアプリケーション データの操作と異なり、データを設定または取得するために、1 つの特定のコンポーネントにアクセスする必要はありません。データを格納するには、次のように入力引数を 2 つ指定して guidata を呼び出します。

guidata(object_handle,data);
最初の入力 object_handle は、任意の UI コンポーネントです (通常は、hObject)。2 番目の入力 data は格納する変数です。2 つの入力引数を使用して guidata を呼び出すたびに、MATLAB は前に格納されたデータを上書きします。つまり、一度に格納できる変数は 1 つのみであることを意味します。複数の値を共有する場合は、データを struct 配列または cell 配列として格納します。

データを取得するには、入力引数と出力引数をそれぞれ 1 つ使用して guidata を呼び出します。

data = guidata(object_handle);
データの格納用に指定するコンポーネントと、データの取得用に使用するコンポーネントを同じにする必要はありません。

データが struct 配列または cell 配列として格納されている場合、他の要素を変更せずに 1 つの要素を更新するには、まずデータを取得してから、変更した配列で置き換えます。

data = guidata(hObject);
data.myvalue = 2;
guidata(hObject,data);

guidata を使用したデータの保存および共有

プログラム アプリで guidata を使用するには、メイン関数で初期値のデータを格納します。次に、任意のコールバック関数でこのデータを取得して変更します。

次のコードは、guidata を使用して、2 つのフィールドをもつ構造体を共有する簡単なプログラム アプリの例です。その動作を表示するには、このコードをコピーしてエディターに貼り付け、実行します。

function my_slider()
hfig = figure();
guidata(hfig,struct('val',0,'diffMax',1));
slider = uicontrol('Parent', hfig,'Style','slider',...
         'Units','normalized',...
         'Position',[0.3 0.5 0.4 0.1],...
         'Tag','slider1',...
         'Callback',@slider_callback);
     
button = uicontrol('Parent', hfig,'Style','pushbutton',...
         'Units','normalized',...
         'Position',[0.4 0.3 0.2 0.1],...
         'String','Display Values',...
         'Callback',@button_callback);
end

function slider_callback(hObject,eventdata)
	data = guidata(hObject);
	data.val = hObject.Value;
	data.diffMax = hObject.Max - data.val;
	guidata(hObject,data);
end

function button_callback(hObject,eventdata)
	data = guidata(hObject);
	display([data.val data.diffMax]);
end
スライダーが移動されると、関数 slider_callback は以下のコマンドを実行し、格納されたデータを取得して変更します。

  • data = guidata(hObject) は、格納されたデータを構造体として取得します。

  • data.diffMax = maxval - data.val は、構造体内の diffMax フィールドを変更します。

  • guidata(hObject,data) は、変更された構造体を格納します。

プッシュ ボタンがクリックされると、関数 button_callback によって guidata が呼び出され、格納されている構造体のコピーが取得されます。次に、構造体に格納されている 2 つの値が表示されます。

関連するトピック