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

10 ビュー (過去 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 件)

Community Treasure Hunt

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

Start Hunting!