handles構造体​に新しく定義した値が​更新されないのはなぜ​ですか?

4 ビュー (過去 30 日間)
MathWorks Support Team
MathWorks Support Team 2009 年 9 月 28 日
GUI を作成しています。以下のように、コールバック関数で、handles構造体を他のサブ関数の入力として引渡し、サブ関数では、handles構造体に新しいフィールドを追加します。
% コールバック関数
function callback(hObject,eventdata,handles)
subfunction(handles);
v = handles.newfield;
% サブ関数
function handles = subfunction(handles)
handles.newfield = 1;
guidata(handles.figure,handles)
サブ関数内では、GUIDATA関数で handles構造体を以下のように更新しているにもかかわらず、コールバック関数から、新しく追加されたフィールドにアクセスしようとすると、以下のようなエラーが発生します。
??? 存在しないフィールド 'newfield' を参照しています。

採用された回答

MathWorks Support Team
MathWorks Support Team 2009 年 9 月 28 日
サブ関数に handles構造体が引き渡されたとき、サブ関数は独自にhandles 構造体のコピーを持ちます。そのため、サブ関数の内部で handles構造体が更新されても、GUI(Figure)自身としての handles構造体は更新されていません。
なお、代替案として以下の2つの方法があります。
1. サブ関数の出力引数として handles構造体を定義する方法
2. コールバック関数内で handles構造体を更新する方法
それぞれについて説明します。
1. サブ関数の出力引数として handles構造体を定義する方法
サブ関数の出力引数として handlles構造体を定義し、コールバック関数で呼び出したときに更新された handles構造体を取得します。
% コールバック関数
function callback(hObject,eventdata,handles)
handles = subfunction(handles); % 出力変数を付けてサブ関数を呼びだし
v = handles.newfield;
% サブ関数
function handles = subfunction(handles)
handles.newfield = 1;
guidata(handles.figure,handles)
2. コールバック関数内で handles 構造体を更新する方法
コールバック関数内でサブ関数を呼び出した後、GUIDATA関数を使用し、handles 構造体を更新します。
% コールバック関数
function callback(hObject,eventdata,handles)
subfunction(handles);
handles = guidata(hObject); % handles構造体のリロード
v = handles.newfield;
% サブ関数
function subfunction(handles)
handles.newfield = 1;
guidata(handles.figure,handles)

その他の回答 (0 件)

カテゴリ

Find more on GUIDE アプリの移行 in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!