2017-01-04 10 views
1

私は3つのGUIをMATLABに持っています。それぞれのタグは'P0','P1','P2'です。 3つのGUIすべてのハンドルを構造体に配置し、3つのGUIのいずれかからこの構造体にアクセスしてその中の値を更新できるようにしたいと思います。これを達成する最良の方法は何ですか?GUIのハンドルの構造MATLAB

+0

'getappdata'と' setappdata'を見ましたか? – Matt

+0

データを格納する 'handle'クラスを作成し、' guidata'でハンドルを保存し、いずれかのGUIから変更することができます – Suever

答えて

5

これを行う方法にはいくつかのオプションがあります。 1つの方法は、ルートグラフィックスオブジェクトをsetappdatagetappdataと一緒に使用して値を格納および取得することです。

fig0 = findall(0, 'tag', 'P0'); 
fig1 = findall(0, 'tag', 'P1'); 
fig2 = findall(0, 'tag', 'P2'); 

% Combine the GUIdata into a single struct 
handles.P0 = guidata(fig0); 
handles.P1 = guidata(fig1); 
handles.P2 = guidata(fig2); 

% Store this struct in the root object where ALL GUIs can access it 
setappdata(0, 'myappdata', handles); 

次に、あなたのコールバックの中から、あなたは、単にこの構造体を取得し、直接

function mycallback(hObject, evnt, ~) 
    % Ignore the handles that is passed in and use your own 
    handles = getappdata(0, 'myappdata'); 

    % Now if you modify it, you MUST save it again 
    handles.P0.value = 1; 

    setappdata(0, 'myappdata', handles) 
end 

を、それを使用したい別のオプションは、あなたの値を格納するためにhandle classを使用するようにして、あなたが参照を格納することができますです各GUIのhandles構造体内のこのハンドルクラスにこの構造体を変更すると、変更はすべてのGUIに反映されます。

structobj使用することですこれを行う簡単な方法(免責事項:私は、開発者午前)handleオブジェクトに任意のstructを変換します。

% Create an object that looks like a struct but is a handle class and fill it with the 
% handles struct from each GUI 
handles = structobj(guidata(fig0)); 
update(handles, guidata(fig1)); 
update(handles, guidata(fig2)); 

% Now store this in the guidata of each figure 
guidata([fig0, fig1, fig2], handles) 

我々は数字のguidata内のものを格納しているので、それは自動的に標準handles入力引数を経由して、あなたのコールバックに渡されます。だから今、あなたのコールバックは次のようになります。

function mycallback(hObject, evnt, handles) 
    % Access the data you had stored 
    old_thing = handles.your_thing; 

    % Update the value (changes will propagate across ALL GUIs) 
    handles.your_thing = 2; 
end 

このアプローチの利点は、あなたが同時に実行している3つのGUIの複数のインスタンスを持つことができ、データが互いに干渉しないであろうということです。

+0

ありがとう – chsafouane

関連する問題