guidata(hObject,handles)和handle = guidata(hObject)有什么区别?

时间:2017-11-02 16:24:59

标签: matlab matlab-guide

基本上和上面一样。

在我的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()给我旧数据,第二个给我新数据。 这是我的功能:

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);

2 个答案:

答案 0 :(得分:0)

实际上,变量handles有两个副本:一个存在于函数func_addWaypoint的{​​{3}} 中,一个存在于 func_addWaypoint的工作空间。当您调用该函数时,函数外部变量的数据将被复制到函数内部的变量(workspace)。

您对函数中的handles变量进行了修改,然后使用hObject将修改后的版本附加到guidata(hObject, handles);。但是,函数工作区外部中存在的原始handles变量仍具有未修改的数据。当您使用hObject提取时,此变量会被附加到handles = guidata(hObject);的新值覆盖。

答案 1 :(得分:0)

Documentation for guidata

  

guidata(object_handle,data)将变量数据与对象一起存储   由object_handle指定。

VS

  

data = guidata(object_handle)返回先前存储的数据,或者   如果没有存储空矩阵。

基本上,如果您修改handles结构中的任何内容,请确保在退出该功能之前调用guidata(hObject,handles)

同样,如果您依赖于在其他地方修改过的句柄中的自定义信息,请在函数顶部调用handles = guidata(jObject)

否则你会遇到一些问题,比如你在哪里看到你可能有handles结构的旧副本