2013-04-14 66 views
0

我創建了一個GUI名爲SCADA和我增加了一個叫做StatusData一個布爾變量,它是一個標誌,它被設置爲false時,GUI啓動從MATLAB腳本讀取GUI數據文件

handles.StatusData=false; 
guidata(handles.output,handles); 

我按一個按鈕,然後調用連續執行的函數(該函數具有無限循環)。一段時間後,我按另一個按鈕,將StatusData設置爲true。

handles.StatusData=true; 
guidata(handles.output,handles); 

現在,我需要從回調函數(同樣的功能我上面提到的)訪問StatusData,爲了acheieve這個我送手柄作爲參數,當我打電話給那個函數。現在,當按下更改StatusData的按鈕時,實際句柄中的數據會發生變化,但由於該函數已被調用,因此無法訪問更新的StatusData。

如何訪問GUI的更新句柄而不將其作爲參數發送。

感謝

+0

您的描述有點令人困惑..當在MATLAB GUIDE中設計GUI時,所有的回調函數都會收到'handles'結構。您可以從中檢索值以及設置值(請記住調用'guidata'來更新它們,因爲'handles'是按值傳遞的,而不是作爲引用對象傳遞的) – Amro

回答

0

你可以只通過在hObject參數的函數來代替,而當它使用guidata需要檢索你的價值;即

function some_callback(hObject, handles, ...) 
    myLoopingFunction(hObject, ...); 

function myLoopingFunction(hObject, ...) 
    for someVar = something 
     % Update handles structure 
     handles = guidata(hObject); 
    end 

或者,你可以創建一個句柄對象,並把它放在句柄結構中;例如,

% In a separate file: 
classdef uiState < handle 
    % Probably should give this class a less general name... 
    properties 
     StatusData 
    end 
end 

% In your UI file: 
function some_callback(hObject, handles, ...) 
    handles.state = uiState(); 
    handles.state.StatusData = false; 
    % Now, when you modify handles.StatusData, the version used by 
    % myLoopingFunction will also be updated, because they point to 
    % the same object! 
    myLoopingFunction(handles.state); 

function myLoopingFunction(state, ...) 
    for someVar = something 
     % Now you just have to check state.StatusData 
    end 

對於簡單的情況,我會使用第一種方法。對於更復雜的情況,需要跟蹤幾個參數並以複雜的方式進行交互,我將使用第二個參數。如果你在一些變量中有大量的數據並且想阻止它被複制到對UI的每次調用中,第二種方法也很有用。

就個人而言,對於複雜的用戶界面,我通常會創建一些跟蹤用戶界面的應用程序類(併爲其提供命令行界面),並確保始終可用於我的用戶界面,但這是一個有點像使用大錘在這種簡單的情況下打開果醬罐。