2009-12-24 5 views
9

Je manipule les données sur un terrain en utilisant la poignée:Comment puis-je vérifier si une poignée MATLAB est valide?

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

Cependant, si le chiffre se ferme avant que le script se termine, en faisant quelque chose comme ça renvoie une erreur.

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

Yat-il un moyen de vérifier si h1 est une poignée valide avant de faire des manipulations avec elle?

+0

Une alternative à la vérification d'une poignée, qui peut être utile dans certains cas, est 'set (h1, « DeleteFcn ', @delete_fcn_callback) ', où' function delete_fcn_callback (hObj, event) 'est quelque chose que vous définissez et il sera appelé lors de la suppression de la figure. –

Répondre

13

Vous pouvez utiliser la fonction ishandle pour vérifier d'abord si une poignée de graphiques est valide:

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

MISE À JOUR:

Pour les versions plus récentes d'objets Matlab, manipuler des objets réels, et pas seulement numériques valeurs. La meilleure option est d'utiliser la méthode isvalid pour les objets de poignée:

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

Si vous connaissez le type d'objet que vous recherchez, vous pouvez le tester explicitement. Remplacez si la poignée (h1) avec par ex. si ishandle (h1) && strcmp (get (h1, 'type'), 'ligne') – Jonas

+0

a = 0. ishandle (a) renvoie vrai. Mais a n'est pas une figure, donc: réponse incomplète. – Pedro77

+0

@ Pedro77: Incorrect. Si vous stockez des handles, comme dans l'exemple, et que vous les vérifiez plus tard avec 'ishandle' pour vous assurer qu'ils sont toujours valides, alors vous n'obtiendrez jamais une situation où le handle est 0. Seul l'objet root peut être zéro; les poignées graphiques ne le seront jamais. – gnovice

4

Notez que ishandle a un inconvénient en ce qu'elle accepte également des valeurs numériques communes comme 0 (= poignée de bureau) et 1 (= la première figure ouverte par par défaut) qui sont souvent aussi des handles valides bien que peut-être pas le attendu handle. Vous verrez toujours une erreur si vous essayez de définir une propriété inexistante.

Pour traiter de tels cas, il suffit de placer votre code dans un bloc gestion des exceptions:

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

Un bloc try/catch est une bonne solution. Cependant, le handle '0' est toujours réservé à l'objet racine et les objets plot ou uicontrols ont toujours des handles à virgule flottante. Les figures ont des poignées entières par défaut, mais vous pouvez forcer MATLAB à utiliser un handle à virgule flottante pour les figures en créant la figure avec la propriété 'IntegerHandle' définie sur' off '. Cela évitera la création d'une figure, la saisie du nombre entier, puis la suppression de la figure et la création d'une nouvelle figure avec le même nombre entier (c'est donc un chiffre différent de celui auquel fait référence le premier handle). – gnovice