函數(shù)挪用
在一個m文件中,可以界說多個函數(shù),但是文件名必定要與第一個函數(shù)(主函數(shù))一概,
該文件中其他函數(shù)則為本文件的私有函數(shù),外部不行訪問(可以經(jīng)歷參數(shù)挪用的要領(lǐng)訪問,下面會形容)。
比如在一個步驟中,創(chuàng)建一個fig后,會天生這樣一個m文件:
function varargout =febirdfun(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @febirdfun_OpeningFcn, ...
'gui_OutputFcn', @febirdfun_OutputFcn, ...
'gui_LayoutFcn', [], ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
剖析 一下這個主函數(shù):結(jié)果 gui_State是一個機(jī)關(guān),指定了figure打開和輸出函數(shù),
開始 gui_CallBack為空,倘使輸入?yún)?shù)個數(shù)不為0,接下來將輸入第一個參數(shù)通報給gui_State.callback。
接下來用交給 gui_mainfcn函數(shù)治理,gui_mainfcn 按照gui_State和傳入?yún)?shù)
來確定是執(zhí)子函數(shù),仍舊打開 fig 文件和運(yùn)行 OpeningFcn和OutputFcn。
如過 gui_Callback為空,那么就運(yùn)行打開主窗口fig文件,不然,挪用子函數(shù)
這個函數(shù)的作用有:
1.當(dāng)輸入不帶參數(shù)的時辰,可能打開fig文件,而且初始化控件
2.當(dāng)指定必要挪用的函數(shù)名時,可以作為其他控件callback運(yùn)用 (實(shí)則挪用同文件中的子函數(shù))
比如,在某一個控件的 callback 內(nèi)里這樣寫:(febrdfun為主函數(shù))
febirdfun("@push_button_Callback",gcbf,[])
這樣的挪用就可以挪用文件內(nèi)里的子函數(shù)。
固然也可以運(yùn)用其他文件內(nèi)里的函數(shù)作為callback,不外那樣的話,數(shù)據(jù)通報會繁難一些。
下面看figure Openning Function
%================================
function Main_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
% 通常在這內(nèi)里界說自己的數(shù)據(jù)機(jī)關(guān)比如
s=struct("P1",v1...
"P2",v2);
handles.MyStruct=s;
% 更新handles數(shù)據(jù)機(jī)關(guān) 特別重要?。?
guidata(hObject, handles);
%================================
function varargout = Main_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
這個函數(shù)是輸出返回值的界說
注意: matlab 中,function 對應(yīng)的 end 可以沒有,但是隨著版本的更新,end將會被要求。
六:數(shù)據(jù)通報
在matlab GUI步驟中實(shí)行值通報我時時運(yùn)用的兩種要領(lǐng):
1.使用主函數(shù)的 handles 數(shù)據(jù)機(jī)關(guān)傳值
比如在某一個圖像窗口句柄 中有一個方向 handles(可以界說自己的數(shù)據(jù)機(jī)關(guān))
那么在一個子Callback函數(shù)中,可以經(jīng)歷handles通報數(shù)據(jù):
function sliderbar1_Callback(hObject,eventdata,handles)
%% eg1
v1=get(hObject,'value');
obj=handles.Text1 %直接定位 Tag 為 Text1的控件
set(obj,'value',v1);
%% eg2
handles.MyStruct.P1=v1; % 改變handles中的數(shù)據(jù)
guidata(hObject,handles); %更新 handles !!重要
end
2.使用控件的 UserData 來傳值
每一個控件平常都有一個屬于自己的自界說域,userData,你可以界說這樣一個域用來存儲自己的數(shù)據(jù),比如在界說 timer 的 TimerFcn中
t1=timer('TimerFcn',{@Timer1Fcn},'ErrorFcn',@Timer 1ErrorFcn},'Period',1.0,'ExecutionMode','fixedrate' );
t1.Userfata=handles.MyStruct;
這里 Timer1Fcn的挪用看似沒有傳入任何參數(shù),現(xiàn)實(shí)上此函數(shù)的界說必定要有至少兩個參數(shù)
function Timer1Fcn(obj,eventata)
obj.UserData=XXXXX;%可以這樣共享數(shù)據(jù)
end
固然Timer界說的時辰答應(yīng)這樣通報一個參數(shù),固然這樣也可以實(shí)行傳值.
t1=timer('TimerFcn',{@Timer1Fcn,handles},'ErrorFcn ',{@Timer1ErroFcnr,handles},'Period',1.0,'Execution Mode','fixedrate');