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; |