2012-11-05 249 views
1

我有几个功能(在单独的文件中定义)一个回调中在我的GUI,像:MATLAB:GUI和全局变量

function myFunction_Callback(hObject, eventdata, handles) 
[output] = function1(input); 
[output] = function2(input); 
[output] = function3(input); 
guidata(hObject, handles); 

现在,让我们说我定义功能1,和我想要在句柄中存储一个局部变量。当我做这样的:

[output] = function1(input) 
localVariable = [1 2 3]; 
handles.myVariable = localVariable; 

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和处理新手:) 谢谢!

回答

1

是的,你的一般的方法是好的,虽然有几件事情:

  • handles通常指包含句柄对象的数据结构。向其中添加其他类型的数据是有效的,但不可取,因为这只是令人困惑。

  • 围绕函数的单个输出的括号是没有必要的。当然,这是品味和编码风格的问题,但这是我不推荐的;使用括号来分组属于一起的事物。

  • 您的input是否包含handles某处?同样,函数outputs是否包含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

传递这些函数的数据可能会非常痛苦。

我发现为这些原因应用面向对象编程非常有帮助。特别是将你的课程定义为classdef myclass < handles。使用这些,你可以很容易地做各种很酷的东西 - 比如在不相关的数字之间传输数据。

实施singleton pattern而不是全局是有帮助的。我还给出了一个答案here,显示了一个observer pattern