我在GUI中的Callback中有几个函数(在单独的文件中定义),如下所示:
function myFunction_Callback(hObject, eventdata, handles)
[output] = function1(input);
[output] = function2(input);
[output] = function3(input);
guidata(hObject, handles);
现在,假设我正在定义function1,我想在句柄中存储一个局部变量。我喜欢的时候:
[output] = function1(input)
localVariable = [1 2 3];
handles.myVariable = localVariable;
一旦function1完成, handles.myVariable
'会从句柄中消失'。如何让它“留在”手柄?我是否必须将其定义为输出,然后存储在这样的句柄中:
[output, localVariable] = function1(input)
...
localVariable = [1 2 3];
以后
function myFunction_Callback(hObject, eventdata, handles)
[output, handles.myVariable] = function1(input);
[output] = function2(input);
[output] = function3(input);
guidata(hObject, handles);
?? 我知道这个问题听起来非常愚蠢,可能不清楚,但请原谅我,我对GUI很困惑并处理新手:) 谢谢!
答案 0 :(得分:1)
是的,你的一般方法是可以的,虽然有一些事情:
handles
通常是指包含对象句柄的数据结构。向其中添加其他类型的数据是有效的,但不可取,因为它只是令人困惑。
不需要功能单个输出的括号。当然,这是一个品味和编码风格的问题,但这是我建议反对的;仅使用括号对属于一起的东西进行分组。
您的input
在某处包含handles
吗?同样,函数output
是否包含handles
的修改版本?如果没有函数修改handles
,那么每次调用回调时都不需要重新保存它......
总而言之,做到这样的事情:
function myFunction_Callback(hObject, eventdata, handles)
...
output = func1(input);
output = func2(output);
output = func3(output);
...
guidata(hObject, output); % <-- NOTE: output contains handles
function output = func1(input)
...
output.handles = input.handles;
...
output.localVar = [1 2 3];
...
答案 1 :(得分:1)
围绕这些功能传递数据可能会非常痛苦。
我发现为这些原因应用面向对象编程非常有帮助。特别是将您的班级定义为classdef myclass < handles
。使用这些可以轻松完成各种各样的酷事 - 例如在不相关的数字之间传输数据。
实施singleton pattern而不是全局是有帮助的。我还给出了here的答案observer pattern。