如何从我的自定义函数中将自己的变量添加到句柄结构中?

时间:2011-04-29 05:58:10

标签: matlab handles

我有一个问题要问这里的MATLAB大师..

所以这是我的代码(仅显示与此处问题相关的代码行):

mainProcess(hObject, handles)

handles.Checkpoint2 =1;
guidata(hObject, handles);

function testGUI1_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
handles.Checkpoint1 = 1;
mainProcess(hObject, handles);
handles.Checkpoint3 = 1; //EDIT: Checkpoint2 is also not visible at this line
guidata(hObject, handles);
handles.Checkpoint4 = 1;


function saveAndContinueButton_Callback(hObject, eventdata, handles)

(breakpoint here) --> faceDatabase(handles.currentImageIteration).lookingTowardsCamera=handles.lookingAtCamera;

因此,在上面的代码中,我在代码的不同部分制作了这些“检查点”,并在单独单击保存和继续按钮时查看哪些是可见的... 在调用我的自定义函数mainProcess之前创建了Checkpoint1,在mainProcess的代码中创建了Checkpoint2,并且在mainProcess完成执行后创建了Checkpoint3,并且控件返回了调用它的函数,即testGUI1_OpeningFcn ...而Checkpoint4是在testGUI1_OpeningFcn中创建WITHIN,但是在testGUI1_OpeningFcn代码中更新了句柄结构之后..

所以我的问题是,当点击按钮并且我看到那时可见的内容时,按钮回调代码可以看到检查点1和3,但检查点2和4是不可见的...我明白了Checkpoint4不可见,因为它是在testGUI1_OpeningFcn的代码中更新了句柄结构之后创建的...但是为什么Checkpoint2不可见,即使在mainProcess的代码结束时,我确实放了一行:

guidata(hObject, handles);

我的意思是mainProcess函数正在获取对hObject和句柄的引用,所以它应该具有对它的写访问权,对吧?

那么为什么Checkpoint2对按钮的回调代码不可见..?

任何线索?

编辑:我只是试着查看Checkpoint2是否在mainProcess的调用函数中是可见的,在控件返回调用者之后,甚至Checkpoint2也不可见(参见上面代码中的EDIT)..

2 个答案:

答案 0 :(得分:3)

这是正确的,你需要调用guidata来更新你拥有的handle变量。然而,guidata需要一个论点。我认为正确的命令是:

handles = guidata(hObject);  

您可能会发现此链接很有用:

http://www.mathworks.com/matlabcentral/answers/10197-guidata-doesn-t-work-the-way-i-expected-it-to

答案 1 :(得分:0)

我相信你需要在调用mainProcess()

之后添加以下内容
handles = guidata();

通常,'handles'结构通过值传递给guidata()函数。因此,mainProcess()无法更改句柄结构 - 只需将现有结构附加到句柄即可。在进行进一步修改之前,您需要将其恢复(使用handles = guidata()),更新它并使用guidata(h,handle)再次设置它。

如果这不够清楚(或者只是不起作用,请告诉我)。

修改

你需要改变这样的代码:

function testGUI1_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
handles.Checkpoint1 = 1;
mainProcess(hObject, handles);
handles = guidata();   // <--- new line

handles.Checkpoint3 = 1; //EDIT: now checkpoint2 will be visible here
guidata(hObject, handles);

handles.Checkpoint4 = 1;
guidata(hObject, handles); // Otherwise Checkpoint4 will not be bound to hObject