2013-02-28 70 views
0

這是一個基本的問題,但我很難與它。MATLAB的uicontrol回調函數句柄輸出

基本上,我有一個回調函數分配給GUI上彈出菜單中的選項。代碼如下:

uicontrol(mainfigure, 'Style', 'popup',... 
    'String', 'A|B|C',... 
    'Position',[850 190 200 30],... 
    'Callback', @blockset); 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

function [block] = blockset(hObj,evnt) %#ok<INUSD> 

blockval = get(hObj,'Value'); 

if blockval == 1 
    block = 'A'; 
elseif blockval == 2 
    block = 'B'; 
elseif blockval == 3 
    block = 'C'; 
end 

end 

正如你所看到的,它只是分配一個字符串值,在彈出菜單中選擇不同的選擇。我想在後面的腳本(這也是嵌入在uicontrol回調)使用這些字符串作爲輸入值到另一個功能:

uicontrol(mainscreen, 'Style', 'pushbutton',... 
    'Position',[855 300 150 50],... 
    'String', 'START',... 
    'FontSize',10,'FontWeight','bold',... 
    'BackgroundColor', [.9 .9 .9],... 
    'CallBack', {@START_Callback, block}); 

的代碼就是不起作用。但我無法弄清楚如何定義uicontrol回調的輸出。我已經將「block」定義爲塊集函數的輸出,那麼如何讓START_Callback將其識別爲輸入?每次嘗試時,它都會告訴我「block」是一個未定義的函數或變量。

有什麼我需要做的'回調',@ blockset「的代碼行,讓它識別功能的輸出?

編輯:一些粗略的互聯網搜索表明,我可能不得不使用像setappdata/getappdata,或另一種解決方法的方法。但是,我並不完全理解這些文檔。我如何在這種情況下使用它們?

回答

2

的可變塊必須在工作區中存在,當你做

uicontrol(mainscreen, 'Style', 'pushbutton',... 
    'Position',[855 300 150 50],... 
    'String', 'START',... 
    'FontSize',10,'FontWeight','bold',... 
    'BackgroundColor', [.9 .9 .9],... 
    'CallBack', {@START_Callback, block}); 

但它是從彈出菜單中的回調的返回值,所以你不能這樣做,因此您的MATLAB錯誤。

要使用setappdata和getappdata,您需要將彈出式菜單的回調函數的'block'變量存儲在某個圖形的appdata屬性中,這些屬性對於這兩個回調函數都是可見的,或者如果您想要是懶惰的,可以將其存儲到根圖中。 例如

function [block] = blockset(hObj,evnt) %#ok<INUSD> 
    blockval = get(hObj,'Value'); 

    if blockval == 1 
     block = 'A'; 
    elseif blockval == 2 
     block = 'B'; 
    elseif blockval == 3 
     block = 'C'; 
    end 

    setappdata(0, 'block', block); 
end 

這將已經存儲了塊變量到根圖(即主MATLAB窗口,由0表示),這確實是不該做任何事情都可能改變它,以及一件好事。相反,您應該嘗試將其存儲到一些處理圖形對象,這些對象將在兩個回調中都可見,例如GUI圖形。但是,您的問題中沒有足夠的信息來推斷您可以使用哪些內容,因此我使用根數作爲說明。

如果您設置了GUI對象的標籤屬性,則可以根據該對象查找它們的手柄。使用h = findobj('Tag','my_tag')將給你帶有標籤'my_tag'的圖形對象的句柄,然後你可以通過setappdata(h, 'var_name', var);設置appdata。我會建議使用這個而不是根圖處理,就像你沒有封裝的根圖一樣。

雖這麼說,那麼在你的START_Callback功能,而不是採取block作爲輸入參數,你會使用block = getappdata(0, 'block');讓你在你的blockset回調函數設置root人物的塊變量。所以,你的按鈕聲明將成爲

uicontrol(mainscreen, 'Style', 'pushbutton',... 
    'Position',[855 300 150 50],... 
    'String', 'START',... 
    'FontSize',10,'FontWeight','bold',... 
    'BackgroundColor', [.9 .9 .9],... 
    'CallBack', @START_Callback); 

和內部START_Callback:

function START_Callback(hObj,evnt) 
    block = getappdata(0, 'block'); 
    %... other stuff 
end