2010-12-05 14 views
5

我有這行代碼:如何在MATLAB中創建動態回調?

delete_btn = uicontrol(rr_ops, 'Style', 'pushbutton', 'String', 'Delete Graphic', 'Position', [13 135 98 20], ... 
'Callback', 'delete_graphic'); 

和一點點上這個功能:

function delete_graphic 
global rr_list 
selected = get(rr_list, 'Value'); 
selected 
return; 

爲什麼這個代碼不工作?我真的不明白...

我需要什麼?我創建一個按鈕和一個列表框,單擊按鈕 - 從列表框中刪除選定的元素。

Thx尋求幫助。

PS 總是收到此錯誤:

??? Undefined function or variable 'delete_graphic'. 
??? Error while evaluating uicontrol Callback 

這裏是我的所有代碼:http://paste.ubuntu.com/540094/(線185)

回答

10

的一般首選途徑define a callback function是使用function handle而不是一個字符串。當您使用字符串時,字符串中的代碼將在基本工作區中評估。這意味着在計算回調時,字符串中使用的所有變量和函數都必須存在於基工作區中。這會導致糟糕的GUI設計,因爲您不希望GUI的操作依賴於基本工作空間(用戶可以輕鬆修改,因此可能會破壞GUI)。

這也解釋了你所得到的錯誤。功能delete_graphic在您的文件rr_intervals.m中定義爲subfunction。子函數只能由在同一個m文件中定義的其他函數調用,因此delete_graphic在基本工作空間(您的字符串回調被計算的地方)中不可見。使用函數句柄回調是一個更好的選擇。這裏是你會怎麼做:

  • 更改您的按鈕(線216)從'delete_graphic'回調@delete_graphic
  • 變化delete_graphic(線185)的函數定義:

    function delete_graphic(hObject,eventdata) 
    

    其中hObject是發出回調對象的句柄並eventdata是在發出回呼時提供可選的數據。

編輯:

如果你想其他參數傳遞給delete_graphic,您可以執行以下步驟:

  • 添加額外的輸入參數的函數結束定義。例如:當您設置回調您的按鈕,其中第一個單元格中包含的功能手柄和隨後的單元

    function delete_graphic(hObject,eventdata,argA,argB) 
    
  • 使用單元陣列,每個都包含一個輸入參數。例如:

    set(delete_btn,'Callback',{@delete_graphic,A,B}); 
    

    有一點需要注意這一點,這是存儲單元陣列中的值AB固定在它們是什麼,當你設置回調。如果在您的代碼中更改了AB,那麼將不會更改存儲在單元格數組回調中的值

如果您無法使用上述溶液(即如果AB需要修改的值),也有一些其他的選項你怎麼能share data among a GUI's callbacks

+0

謝謝。它的工作,但我怎樣才能將其他參數傳遞給delete_graphic函數? – AndrewShmig 2010-12-06 07:03:59