12/31/2006

Guidata 函數之應用

guidata是介面程式特有函數指令,可供暫存介面資料的地方,因此在函數與函數之間,可以很方便地作為一個中介。當你從一個函數程式中存入後,可以到另一個函數程式中取出,繼續使用。它與其他輸入函數之功能略同,但其最大好處是不必經由函數之輸入參數位置進出。對於某些圖面所含介面參數甚多的情況,此函數特別有用。其語法如下:


guidata(h,data)
data = guidata(h)


此時h為某特定物件之握把。所以第一行指令之型式是將資料data存入與h握把指向之圖中,若h是某物件之握把時,則其指向的是包含該物件之圖。

此處之data可為MATLAB之變數,但通常均採用結構變數,因此可以逐層往下堆疊,隨時依需要增加欄位。

GUIDATA指令一次僅能處理一個變數,故連續呼叫guidata(h,data),只會將新值墊去舊值。在利用guide產生之檔案中,其函數間若使用guidata傳遞GUI資料時則僅能使用handles這個變數結構,若需要儲存與handles不同的變數,唯一的辦法是在其下建立一個新欄位,如handles.demo是。

另一指令data=guidata(h)則是自先前存放有關h握把之GUI資料取出。若前面沒有儲存則取出的為空矩陣。

若要更改先前存入之資料,則可先用data=guidata(h)取出,將data之內容更改之後,再用guidata(h,data)存入。

舉例:有一圖介面之握把設為f,此介面含有滑件、文字輸入等,其對應之uicontrol中之標籤(或變數)分別為'valueSlider'、'valueEdit'。下面舉的例子為在應用M檔案使用guiddata指令取得一個名為mygui.fig圖介面之結構資料,此資料可用guihandles指令取得,再加上程式需要之額外資料後,在回叫函數及初始化函數間傳遞之情形:

...
f = openfig('mygui.fig');
data = guihandles(f); % initialize it to contain handles

data.errorString = 'Total number of mistakes: ';
data.numberOfErrors = 0;

guidata(f, data); % store the structure

上述黃色部份為原資料data取出之後,再加入errorString、numberOfErrors等兩欄變數值,然後又置回guidata存放。

另一方面在回叫函數中,則加入下列指令:

data = guidata(gcbo); % need handles, may need error info
val = str2double(get(data.valueEdit,'String'));
if isnumeric(val) & length(val)==1 & ...
val >= get(data.valueSlider, 'Min') & ...
val <= get(data.valueSlider, 'Max')
set(data.valueSlider, 'Value', val);
else
% increment the error count, and display it
data.numberOfErrors = data.numberOfErrors + 1;
set(handles.valueEdit, 'String',...
[ data.errorString, num2str(data.numberOfErrors) ]);
guidata(gcbo, data); % store the changes...
end

上面在回叫函數中,若輸入值超出範圍或輸入不是數值時,會顯示錯誤,而且記錄錯誤之次數。完畢後再回傳guiddata。式中之gcbo(Get Current CallBack Object)則是取得現行之回叫物件握把的意思,以確認存取的位置正確。