最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
多くのアプリには、相互に依存するコントロール、メニュー、グラフィックス オブジェクトが含まれます。各コールバック関数はそれぞれ固有のスコープをもつので、この関数にアクセスする必要があるアプリの部分ごとに明示的にデータを共有しなければなりません。次の表で、アプリ内でデータを共有するための方法をいくつか説明します。
方法 | 説明 | 要件とトレードオフ |
---|---|---|
UserData またはその他のオブジェクト プロパティへのデータの格納 | コンポーネント オブジェクトを使用して、直接プロパティ値を取得または設定します。 すべての UI コンポーネントには、任意の MATLAB® データを格納できる |
|
アプリケーション データとしてのデータの格納 | 関数 |
|
入れ子にされたコールバック関数の作成 | メイン関数の内部でコールバック関数を入れ子にします。これにより、コールバック関数がメイン関数内のすべての変数にアクセスできます。 |
|
関数 guidata によるデータの格納 | 関数 |
|
UI コンポーネントのプロパティには、役立つ情報が含まれています。たとえば、Value
プロパティをクエリすると、スライダーの現在の位置がわかります。さらに、すべてのコンポーネントに UserData
プロパティがあり、ここに任意の MATLAB 変数を格納できます。コールバック関数がコンポーネントにアクセスできる限り、すべてのコールバック関数は UserData
プロパティに格納された値にアクセスできます。
従来の 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)
は、値 sval
と diffMax
を data
という構造体に格納します。
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_callback
は diffMax
を計算します。その後、以下のコマンドを使用して、アプリケーション データを変更します。
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_callback
が data
構造体の val
と diffMax
のフィールドを更新します。エンド ユーザーがプッシュ ボタンをクリックすると、関数 button_callback
によって、data
に格納されている値が表示されます。関数 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 つの値が表示されます。