12/31/2006

Handles結構矩陣扮演的角色

利用guide產生的M檔案,主要在搭配介面作為一種橋樑之功能。在處理過程中,GUI利用此程式中一個以handles為名之結構陣列作為傳遞參數之媒介,因此處理諸項參數時不可不知。由前述之屬性表中可知,各元件中均有一個'Tag'的名稱。只要利用handles.Tag的名稱型式即可指出所要處理的對象與參數值,而且可將此值直接傳遞到其對應之回叫函數中應用。此handles內資料之儲存,常需與guidata配合,詳細用法參考後面guidata之應用一節。

資料之分享


例如要將存於X中之資料傳至函數中時,可以藉handles結構將其設定於其下之一欄位參數,然後利用guidata傳遞:

handles.current_data= X;
guidata(hObject, handles)

只要在起始函數中作上述動作,則未來在其他回叫函數中,均可利用handles結構取出該項值:

X = handles.current_data;

若在其他回叫函數中,更改到handles內之任何項數值,則必須將對應該參數值改變後,再次執行guidata(hObject,handles)一次,新值才能為其他函數使用。

例如:若有一組滑尺與編輯輸入元件,當編輯輸入值改變時,其對應之滑尺位置亦會改變,反之亦然。換言之,當滑尺更動位置時,編輯口有產生對應新值:


set(handles.edit1,'String', num2str(get(handles.slider1,'Value')))


程式中之edit1與slider1分別為編輯口及滑尺之標籤(Tag)名稱。其中get指令是先取得滑尺之位置值,並利用num2str()指令轉換為文字串,然後用set指令將該文字串設定給編輯口之String,以供顯示。

其次是由編輯口輸入值再轉換為滑尺置。由於滑尺之範圍在0與1之間,故輸入值若在範圍之外,必須顯示錯誤訊息,比較週到的話計算輸入錯誤之次數,以茲警惕。下面為有關於滑尺之回叫函叫函數內容:

滑尺位置之設定


編輯口輸入值之後可由下面程式進行檢查。若所得之值在其最大值與最小值之間,則更改滑尺之數值及對應位置。


val = str2double(get(handles.edit1,'String'));
% Determine whether val is a number between 0 and 1
if isnumeric(val) & ...
val >= get(handles.slider1,'Min') & ...
val <= get(handles.slider1,'Max')
set(handles.slider1,'Value',val);
else
% Increment the error count, and display it
handles.number_errors = handles.number_errors+1;
guidata(hObject,handles); % store the changes
set(handles.edit1,'String',...
['You have entered an invalid entry ',...
num2str(handles.number_errors),' times.']);
end


在處理錯誤輸入之功能上,則必須自handles.number_errors取出舊值,加上本次後,再存入guidata,以更新舊資料;同時在輸入口上印出此次輸錯之次數。

取得GUI資料


同樣,利用handles結構亦可應用於選單上,取得所需之相關資料。例如某一選單有巧克力、草苺及香草等項。此時其元件屬性中之'String'應為此三項的內容,而對應之'Value'則存有所選定的項值。例如若已選定草苺,則其對應之'Value'應等於2。設此選單之'Tag'為'my_menu',則下列程式可以得到對應之選單名稱current_choice:

all_choices = get(handles.my_menu, 'String')
current_choice = all_choices{get(handles.my_menu, 'Value')};

執行此回叫函數後,其current_choice值應為'草苺'。

這種變數甚至可以包括整個圖介面。設其屬性標籤為figure1,則下面的指令可以將此介面刪除,或等於結束本程式之執行:

delete(handles.figure1)

參考資料: