2017-11-02 1 views
1

基本的に上記と同じです。guidata(hObject、handles)とhandles = guidata(hObject)の違いは何ですか?

私のMATLAB GUIには、テキストボックスからデータを取得し、それを配列ハンドル(より具体的には複数のウェイポイント)に保存するプッシュボタンがあります。私は後の段階でこの行列を使用しているので、ハンドルに格納されたデータが必要です。

コールバック関数では、これを行う別の関数を呼び出しています(メインファイルをきれいに整えておくため)。ここでは、対応するハンドルにすべてのデータを保存した後、guidata(hObject, handles)に電話して変更を保存します。

しかし、コールバックでは、display(handle.data)を呼び出すたびに、私はコールバックを呼び出す前にハンドルを表示しますが、私はそれをリフレッシュしました。今すぐ別のguidata(hObject, handles)をコールバックで直接呼び出しても何も変わりませんが、handles = guidata(hObject)を呼び出すと動作します。

私の質問:なぜですか? MATLABですか?

CODE:

func_addWaypoint(hObject, handles) 
display(handles.cart_coords) 
handles = guidata(hObject); 
display(handles.free_coords) 

注:最初のdisplay()は、私に古いデータを与える第二は、私に新しいデータを提供します。 handlesあなたの変数の2つのコピーが実際にあります

function func_addWaypoint(hObject,handles) 

new_waypoint = nan(3,2); 

coord_constraint = ones(3,2); 


new_waypoint(1,1) = str2double(handles.edit_start_x1.String); 
new_waypoint(2,1) = str2double(handles.edit_start_x2.String); 
new_waypoint(3,1) = str2double(handles.edit_start_x3.String); 

new_waypoint(1,2) = str2double(handles.edit_stop_x1.String); 
new_waypoint(2,2) = str2double(handles.edit_stop_x2.String); 
new_waypoint(3,2) = str2double(handles.edit_stop_x3.String); 
v     
for i = 1:numel(new_waypoint) 
    if isnan(new_waypoint(i)) 
     new_waypoint(i) = rand() * 2 - 1; 
     coord_constraint(i) = 0; 
    end 
end 

handles.cart_coords = [handles.cart_coords, new_waypoint]; 
handles.free_coords = [handles.free_coords, coord_constraint]; 

guidata(hObject, handles); 

答えて

0

Documentation for guidata

関数guidata(object_handle、データ)object_handleによって指定されたオブジェクト と可変データを格納します。

VSデータ= guidataを(object_handle)何も格納されていない場合、以前に格納されたデータ、または 空行列を返します。

handles構造で何かを変更する場合、機能を終了する前にguidata(hObject,handles)に電話してください。

同様に、他の場所で変更されたハンドルのカスタム情報に頼っている場合は、機能の先頭に​​を呼び出します。

それ以外の場合は、handles構造の古いコピーがある場所を見ているような問題に遭遇します

0

::1は、機能func_addWaypointの外workspaceに存在し、一つはfunc_addWaypointのワークスペースが存在する は、ここに私の関数です。関数を呼び出すと、関数外の変数のデータが関数内の変数にコピーされます(caveat)。

あなたは関数内handles変数に変更を加えると、その後guidata(hObject, handles);を使用してhObjectにその修正版を添付してください。ただし、関数の外にある元のhandles変数には未変更データがあります。この変数は、handles = guidata(hObject);を使用してフェッチすると、hObjectに関連付けられた新しい値で上書きされます。

関連する問題