【发布时间】:2017-01-16 18:13:09
【问题描述】:
这是许多其他人遇到的类似问题,guidata(hOjbect, handles) 似乎没有更新值。我正在将它与侦听器一起使用,但不知道如何继续。
在我的gui_OpeningFcn 我有以下行:
addlistener(handles.s, 'name', 'PostSet', @(s,e)updatefilesave(hObject, [], handles));
这会适当地设置侦听器,并在修改名称时调用updatefilesave。但是,updatefilesave 内部是以下代码:
handles.fileUnsaved = true;
guidata(hObject, handles);
在函数内部,两条线都有效。当我在第一行和步骤上设置断点时,fileUnsaved 设置为 true。在我执行第二行之后(仍然在 updatefilesave 函数内),handles.fileUnsaved 仍然设置为 true。
但是,当我退出函数时,绿色箭头会出现在 gui_OpeningFcn 函数中的 addlistener 行上。在此级别,handles.fileUnsaved 现在设置回 false。
使用侦听器时如何获取要更新的句柄?
编辑
我要做的是知道输入字段何时发生更改,以便我可以提示用户在关闭程序之前保存他们的工作。我检查了 CloseRequestFcn 中的 fileUnsaved 标志,如果为真,我会在退出前询问用户是否要保存。
function namebox_Callback(hObject, eventdata, handles)
newName = handles.namebox.String;
if ~isempty(newName)
handles.s.name = newName; % (listener gets triggered here post set)
end
handles.namebox.String = handles.s.name;
guidata(hObject, handles); % (namebox's local handles with fileUnsaved set to false gets put into hObject)
这就是为什么我不能在CloseRequestFcn 中调用handles = guidata(hObject)。阻止这种情况的唯一方法是在调用guidata(hObject, handles) 之前在名称框回调中调用handles = guidata(hObject)。但是在任何地方都这样做会破坏使用侦听器的意义。我会在每个回调函数(大约 50 个)中将 fileUnsaved 设置为 true。
【问题讨论】:
标签: matlab matlab-figure matlab-guide