グローバル変数の代替を使用したUIコールバック間でのデータ共有

グラフィカルオブジェクトアプリケーション内でデータを共有するためにグローバル変数を使用する2つの代替方法を学びます。

グローバル変数の使用を避けることは、多くのプログラミング言語の一般的なルールです。実際には、グローバルスコープで変数を宣言しすぎると、コードが複雑になり、デバッグに時間がかかります。さらに、多くのGUIアプリケーションは、相互に依存するコントロールやグラフィカルオブジェクトを含んでおり、そのグラフィカルオブジェクトへのコールバックはそれぞれ独自のスコープを持つため、スコープのデータは明示的に共有する必要があり、時間がかかります。

グラフィカルオブジェクトアプリケーション内でデータを共有するために、グローバル変数の代わりに使用できる、よりクリーンで直感的な2つの方法があります:

方法1:userdataおよびtag関数を使用してオブジェクトプロパティにデータを格納します。

UIグラフィカルオブジェクトには、オブジェクトの特定の情報を保持するプロパティが含まれています。例えば、グラフィカルオブジェクトの位置を取得または設定するには、その値を使用します。

次のコードでは、userdatatagプロパティを使用して、スライダーとプッシュボタンの UI コンポーネント間で情報を共有しています。

clc; clear all; close all;
handles.fig = figure('position',[600 400 300 300]);

function sld_callback(h,v)
       slider_val = get(h,'value');
       var1 = get(h,'max') - slider_val;
       h.userdata = [slider_val,var1];
end

function btn_callback(h,v)
       slider_h = findobj('tag','slider');
       data = get(slider_h,'userdata');
       display(['value from slider callback is ', num2str(data(2))])
end

handles.slider = uicontrol(handles.fig,'style','slider','units','norm','position',[0.25 0.65 0.5 0.15],
'callback',@sld_callback,'tag','slider',...
                            'userdata',[0,1]);

handles.ptb =uicontrol(handles.fig,'style','pushbutton','string','difference','units','norm','position',
[0.25 0.25 0.5 0.25],'callback',@btn_callback);
undock


スライダーを動かすと、スライダーのコールバックが構造の中で使われます。

h.userdata = [slider_val,var1]; % stores slider_val, var1 as a matrix in userdata property of slider.

プッシュボタンがクリックされると、コールバックはこれらのコマンドを使用してデータを取得します:

slider_h = findobj('tag','slider');  %finds the slider component by using “tag” property
data = get(slider_h,'userdata');  %gets slider_val and var1 values using slider userdata property
undock

方法2:setappdatagetappdata関数を使用してアプリケーションデータとして保存します。

注: setappdatagetappdataは文書化されていない関数です。
Setappdataは、グラフィカルオブジェクトのデータを格納するために使用されます。
setappdata(handles.fig,'sliderval',0); 

ここで:

最初の引数はオブジェクト名。

2番目の引数は値の変数名。

3番目の引数は値です。

getappdataは、グラフィカルオブジェクトからデータを取得するために使用されます。

getappdata(h_fig,'sliderval');

ここで:

最初の引数はオブジェクト名。

2番目の引数は取得したい変数名。

次のコードは、setappdata/getappdataの使い方を示しています。

clc; clear all; close all;
handles.fig = figure('position',[600 400 300 300]);
setappdata(handles.fig,'sliderval',0);
setappdata(handles.fig,'val_diff',1); 
function sld_callback(h,v)
       slider_val = get(h,'value');
       h_fig = get(h,'parent');
       val_diff = get(h,'max') - slider_val;
       setappdata(h_fig,'sliderval',slider_val);
       setappdata(h_fig,'val_diff',val_diff);
end

function btn_callback(h,v)
       h_fig = get(h,'parent');
       slider_val = getappdata(h_fig,'sliderval');
       diff_val = getappdata(h_fig,'val_diff');
       disp(['[slider val,',' difference value]','=', '[',num2str(slider_val),',',num2str(diff_val),']'])
end

handles.slider = uicontrol(handles.fig,'style','slider','units','norm','position',
[0.25 0.65 0.5 0.15],'callback',@sld_callback,'tag','slider');

handles.ptb = uicontrol(handles.fig,'style','pushbutton','string','Values','units','norm','position',[0.25 0.25 0.5 0.25],'callback',@btn_callback);

undock