ドキュメンテーション

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

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

データの共有方法の概要

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

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

ドット構文 object.property を使用して、オブジェクト プロパティの値の格納または取得を行います。

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

  • オブジェクト プロパティの設定または取得を行うために、オブジェクトにアクセスする必要があります。

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

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

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

  • アプリケーション データの設定または取得を行うために、オブジェクト ハンドルにアクセスする必要があります。

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

入れ子のコールバック関数の作成 (プログラム GUI)

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

  • メイン GUI コードと同じファイル内に関数をコード化する必要があります。

  • GUIDE GUI には推奨しません。

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

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

関数 guidata を使用して、GUI の Figure とデータを共有します。

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

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

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

UI コンポーネントのプロパティには有用な情報があり、コンポーネント ハンドルを使用している場合は直接アクセスできます。コンポーネントのハンドルを使用している場合は、関数 findobj によって、既知のプロパティ値をもつハンドルを検索します。UI コンポーネントや Figure の UserData プロパティには任意のデータを格納できます。たとえば、次のプログラム GUI コードでは 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 がスライダーの現在の値と、現在の値と最大値との差を UserData プロパティに格納します。エンド ユーザーがプッシュ ボタンをクリックすると、関数 button_callback によって、Tag プロパティとして 'slider1' をもつコンポーネントのハンドルが検索されます。次に、関数 button_callback の最後の 2 つのコマンドによって、スライダーの UserData プロパティに格納されている値が取得されてから、表示されます。

UserData プロパティには任意の MATLAB 変数を格納できます。データの格納と取得の構文は、GUIDE GUI でもプログラム GUI でも同じです。

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

アプリケーション データと呼ばれる機能を使用して、GUI 内でデータを共有できます。アプリケーション データを格納するには、関数 setappdata を次のように呼び出します。

setappdata(h,name,value);
最初の入力 h は、データを関連付けるコンポーネントのハンドルです。2 番目の入力 name は、値を識別するための文字列です。3 番目の入力 value は、格納する値です。

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

data = getappdata(h,name);
ハンドル h は、データが関連付けられているコンポーネントのハンドルでなければなりません。2 番目の入力 name は、データの格納時に使用した文字列と一致しなければなりません。変数を 1 つのみ格納する UserData とは異なり、アプリケーション データには複数の変数を格納できます。

次のプログラム GUI コードでは、アプリケーション データを使用して 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_callbacksetappdata を呼び出し、名前 'slidervalue' を使用して新しいスライダー値をアプリケーション データとして保存します。その次のコード行では、setappdata を呼び出し、名前 'difference' を使用して別の値 diffMax を保存します。両方の setappdata の呼び出しによって、データが親オブジェクト (この例では GUI の Figure) に関連付けられます。

エンド ユーザーがプッシュ ボタンをクリックすると、関数 button_callback によって getappdata が呼び出され、'slidervalue''difference' の名前をもつ値が取得されます。次に、関数 button_callback の最後のコマンドによってこれらの値が表示されます。

setappdatagetappdata の構文は、GUIDE GUI でもプログラム GUI でも同じです。

入れ子のコールバック関数の作成 (プログラム GUI)

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

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 に格納されている値が表示されます。

    メモ:   GUIDE GUI には入れ子関数は推奨しません。

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

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

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

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

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

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

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

プログラム GUI での guidata の使用

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

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

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_callbackguidata を呼び出し、格納されている struct 配列のコピーを取得します。その次の 2 行のコードで、struct 配列を変更します。関数の最後の行は、格納されている struct 配列を変更済みコピーで置き換えます。

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

GUIDE GUI での guidata の使用

GUIDE では guidata を使用して、GUI 内のすべてのハンドルを含む handles と呼ばれる struct 配列を格納します。handles 配列は MATLAB で各コールバック関数に渡されます。追加データを共有するために guidata を使用する場合は、OpeningFcn コールバックで handles 構造体にフィールドを追加します。コールバック関数のデータを変更するには、handles 配列を変更してから、guidata を使用してその配列を格納します。次のスライダーのコールバック関数では、コールバック関数内で handles 配列を変更して格納する方法を示します。

function slider1_Callback(hObject,eventdata,handles)
	handles.myvalue = 2;
	guidata(hObject,handles);
end 

関数 guidata を使用する GUIDE GUI の詳細な例を確認するには、次の手順に従ってコードをコピーし、調べてみてください。

  1. 書き込みアクセス権限のあるフォルダーに現在のフォルダーを設定します。

  2. コード例をコピーします。

    copyfile(fullfile(docroot, 'techdoc','creating_guis',...
      'examples','sliderbox_guidata.*')),...
       fileattrib('sliderbox_guidata.*', '+w');
    
  3. この例を GUIDE レイアウト エディターに表示します。

    guide sliderbox_guidata.fig
  4. [エディター] ボタン をクリックして、コードをエディターに表示します。

  5. [Figure を実行] ボタン をクリックして GUI を実行します。

複数の GUIDE GUI 間でのデータ共有

2 つの GUI 間でのデータ共有の例

アプリケーション データと関数 guidata を使用して、2 つの別個の GUI 間でデータを共有するためのフル機能の例を確認するには、次の手順に従ってコードをコピーし、コードを実行してチェックしてください。

  1. 書き込みアクセス権限のあるフォルダーに現在のフォルダーを設定します。

  2. 以下のコマンドを実行して、サンプル コードをコピーします。

    copyfile(fullfile(docroot, 'techdoc','creating_guis','examples'...
      ,'changeme*.*')),fileattrib('changeme*.*', '+w');
    
  3. 次のコマンドを実行して、GUI を 2 つの GUIDE レイアウト エディターに表示します。

    guide changeme_main
    guide changeme_dialog

  4. 両方のレイアウト エディターで [エディター] ボタン をクリックして、コードをエディターに表示します。

  5. GUI のレイアウト エディターで [Figure を実行] ボタン をクリックして、changeme_main GUI を実行します。

3 つの GUI 間でのデータ共有の例

guidataUserData データを使用して 3 つの GUI 間でデータを共有するフル機能の例を確認するには、次の手順に従ってコードをコピーし、コードを実行して調べてみてください。

  1. 書き込みアクセス権限のあるフォルダーに現在のフォルダーを設定します。

  2. 以下のコマンドを実行して、サンプル コードをコピーします。

    copyfile(fullfile(docroot, 'techdoc','creating_guis',...
      'examples','guide*.*')),...
       fileattrib('guide*.*', '+w');
    
  3. 次のコマンドを実行して、GUI を 3 つの GUIDE レイアウト エディターに表示します。

    guide guide_iconeditor; 
    guide guide_toolpalette; 
    guide guide_colorpalette;
  4. 各レイアウト エディターで [エディター] ボタン をクリックして、コードをエディターに表示します。

  5. GUI のレイアウト エディターで [Figure を実行] ボタン をクリックして、guide_iconeditor GUI を実行します。

詳細

この情報は役に立ちましたか?