M文件中内的每个Callback都可以视为一个独立的可执行的接口,因此,任一个Callback触发后所执行的运算值若要在其他Callback中使用,就无法与MATLAB工作空间内的变量继续执行操作,也就是说每个Callback之间无法直接做沟通操作,因此变量的传递会有问题。主要的几种数据传递方式主要有: (1)宣告为全局变量 将欲传递的变量在传递双方的Callback位置中都设置为全局变量,就可以直接在任一方的Callback中调用。这种方式是最简单的操作方式,但是当GUI全局变量太多时,在执行上就可能造成混乱。 (2)应用对象的userdata属性 通过对象的userdata属性可以直接进行各个Callback之间的数据存取操作。首先必须先将数据存储到一个特定的对象中,假设该对象的句柄值为uihandle,需要存储的数据为value,将输入以下程序即可: set('uihandle','UserData',value); 此时,value数据已经存储到句柄为uihandle的对象内,在执行过程中若要取回该变量就可以通过以下方式在任一Callback中获取该值。 value=get('uihandle','UserData'); 使用这种方式在操作上固然简单方便,但是每一个对象仅能存取一个变量值,因此当同一对像存储两次变量时,先前的变量值就会被覆盖掉,这样对于复杂的操作会造成诸多不便,因此一般都是用Userdata存取简单的数据。 (3)应用setappdata,getappdata与rmappdata 使用setappdata,getappdata与rmappdata函数进行数据传递是最用弹性的,此种方式在使用上非常类似UserData属性的操作,但它克服了UserData的缺点,是一个对象可以存取多个变量,因此会比UserData属性在操作上更具有弹性和数据安全性。 用法如下: setappdata(uihandle,'VariableName',vaule); value=getappdata(uihandle,'VariableName'); rmappdata(uihandle,'VariableName'); 另外一种用法是结合handles结构与guidata函数,虽然在操作上非常简单,但是当变量过多时会使GUI在程序上变得比较复杂,日后程序排错时可能比较费时,因此不推荐使用。 使用方式如下: 如果在对象的Callback中存取变量值到VARdata字段中,使用如下程序: handles.VARdata=A;%将A存放到handles的VARdata字段中去 guidata(hObject,handles);%将新的handles值存储起来 如果在另一个Callback中使用变量A,使用如下程序: A=handles.VARdata; |
|
请发表评论