2009-12-24 36 views
9

que manipular datos en una parcela utilizando el asa:¿Cómo puedo verificar si un identificador de MATLAB es válido?

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

Sin embargo, si la figura se cierra antes del script en realidad termina, haciendo algo como esto devuelve un error.

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

¿Hay una manera de comprobar si h1 es un identificador válido antes de hacer cualquier manipulación con ella?

+0

Una alternativa a la comprobación de un mango, que puede ser útil para algunos casos, es 'set (h1, 'DeleteFcn ', @delete_fcn_callback) ', donde' function delete_fcn_callback (hObj, event) 'es algo que usted define y se llamará cuando se borre la figura. –

Respuesta

13

Usted puede utilizar la función ishandle comprobar primero si un mango de gráficos es válida:

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

ACTUALIZACIÓN:

hay nuevas versiones de MATLAB, manejar objetos son objetos reales, no sólo numéricos valores. La mejor opción es utilizar el método de isvalid para los objetos de la manija:

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

Si sabe qué tipo de objeto está buscando, puede probarlo de manera explícita. Reemplace si ishandle (h1) con, p. if ishandle (h1) && strcmp (get (h1, 'type'), 'line') – Jonas

+0

a = 0. ishandle (a) devuelve verdadero. Pero a no es una figura, entonces: respuesta incompleta. – Pedro77

+0

@ Pedro77: Incorrecto. Si está almacenando identificadores, como en el ejemplo, y revisándolos más adelante con 'ishandle' para asegurarse de que siguen siendo válidos, nunca obtendrá una situación en la que el manejador sea 0. Solo el objeto raíz puede ser cero; los controladores de gráficos nunca lo serán. – gnovice

4

Nota que ishandle tiene el inconveniente de que también acepta valores numéricos comunes como 0 (= mango de escritorio) y 1 (= la primera figura abierto por predeterminado) que a menudo también son identificadores válidos aunque posiblemente no sea el esperado. Seguirá apareciendo un error si intenta establecer una propiedad inexistente.

para manejar estos casos, simplemente coloque su código dentro de un bloque de excepción-Manipulación:

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

Un bloque try/catch es una buena solución. Sin embargo, el identificador '0' siempre está reservado para el objeto raíz y los objetos de trazado o uicontrols siempre tienen identificadores de coma flotante. Las figuras tienen identificadores enteros por defecto, pero puede forzar a MATLAB a utilizar un identificador de coma flotante para las figuras creando la figura con la propiedad 'IntegerHandle' establecida en 'off'. Esto evitará la situación en la que se crea una figura, se almacena el identificador entero, y luego se elimina la figura y se crea una nueva figura con el mismo identificador entero (por lo que es una figura diferente a la que se refiere a la primera). – gnovice

Cuestiones relacionadas