2009-12-24 58 views
9

我操作上使用它的手柄曲線數據:如何檢查MATLAB句柄是否有效?

x = 1:10; y = sin(x); 
h1 = line(x,y); 

但是,如果腳本實際終止之前,做這樣的事情會返回一個錯誤的數字被關閉。

>>set(h1,'Color','green') % line is green 
??? Error using ==> set 
Invalid handle object. 

有沒有一種方法,以檢查是否h1是做任何操作與前一個有效的處理?

+0

到檢查的把手,其可用於某些情況下有用的替代方案中,是將'設置(H1,「DeleteFcn ',@delete_fcn_callback)',其中函數delete_fcn_callback(hObj,event)是你定義的東西,當數字被刪除時它會被調用。 – 2013-05-10 11:57:44

回答

13

可以使用ishandle功能首先檢查是否圖形處理是有效的:

if ishandle(h1) 
    set(h1, 'Color', 'green'); 
end 

UPDATE:

對於MATLAB的更新版本,處理的對象是實際的對象,不只是數字值。更好的選擇是使用用於句柄對象isvalid方法:

if isvalid(h1) 
    set(h1, 'Color', 'green'); 
end 
+3

如果你知道你要找什麼類型的對象,你可以明確地測試它。如果是手柄(h1) ,則將其替換爲 。 (h1)&& strcmp(get(h1,'type'),'line') – Jonas 2009-12-24 18:52:57

+0

a = 0。 ishandle(a)返回true。但一個不是一個數字,所以:不完整的答案。 – Pedro77 2017-04-04 20:46:33

+0

@ Pedro77:錯誤。如果您正在存儲句柄(如示例中所示),稍後使用'ishandle'檢查它們以確保它們仍然有效,那麼您將永遠不會得到句柄爲0的情況。只有根對象可以爲零;圖形句柄永遠不會。 – gnovice 2017-04-04 20:57:54

4

注意ishandle具有在於其還接受像0(=桌面手柄)共同數字值和1(一個缺點=第一開口圖默認),這通常也是有效的句柄,儘管可能不是預期的句柄。如果您嘗試設置不存在的屬性,您仍然會看到一個錯誤。

爲了處理這種情況下,只需將一個異常處理塊內的代碼:

try 
    set(myHandle,propName,propValue); 
catch 
    % do something useful... (recreate the GUI?) 
end 
+2

try/catch塊是一個很好的解決方案。但是,句柄'0'始終爲根對象保留,繪圖對象或uicontrol始終具有浮點句柄。數字在默認情況下具有整數句柄,但您可以通過創建具有'IntegerHandle'屬性的數字來強制MATLAB使用浮點句柄來處理數字。這將避免創建圖形,存儲整數句柄,然後刪除圖形和使用相同的整數句柄創建的新圖形(因此它實際上是與第一個句柄不同的數字)。 – gnovice 2009-12-24 18:50:38