2009-11-30 7 views
2

J'ai deux fonctions: une qui crée l'interface utilisateur avec des boutons, et une autre à partir de laquelle je voudrais exécuter la même fonction que l'appui sur le bouton.Comment exécuter une fonction de rappel à partir d'un autre fichier de fonction dans MATLAB?

Quand je creuse dans la figure avec get(gcf,'children') je trouve les boutons, avec une propriété de rappel qui ressemble à ceci:

ans = 
    [function_handle] 
    [    1] 
    [    1] 
    [1x6 double] 

Maintenant, pour autant que je comprends, le premier élément de tableau, je devrais être en mesure pour exécuter la même fonction que celle exécutée lorsque le bouton est pressé à partir de l'interface utilisateur, mais comment faire? J'ai tout essayé, mais rien ne semble fonctionner.

Répondre

3

A partir du résultat que vous avez obtenu le rappel de bouton, il semble que le rappel a été créé de la manière suivante (juste par exemple):

hButton = uicontrol(...,'Callback',{@button_callback,1,1,[1:6]}); 

où la fonction de rappel button_callback est définie comme suit:

function button_callback(hObject,eventdata,a,b,c) 
    ... 
end 

avis qu'il y a two extra arguments in the input argument list pour la fonction de rappel: hObject (la poignée de l'objet en invoquant le rappel) et eventdata (une structure de données d'événement).

Si vous voulez appeler la poignée de fonction avec les 3 arguments supplémentaires qui devraient être transmis à elle (1, 1, et un tableau 1-en-6), vous devez passer aussi des arguments pour les entrées hObject et eventdata . Voici comment appeler la fonction regarderait (en utilisant votre variable ans):

ans{1}(hButton,[],ans{2:end}); 

Vous obtenez d'abord la poignée de fonction de la matrice de cellules (ans{1}) puis call it using parentheses as you would any other function. Pour hObject vous pouvez passer le handle à l'objet uicontrol (ou une valeur vide si elle n'est pas nécessaire), et pour eventdata vous pouvez simplement passer une valeur vide. Les valeurs supplémentaires sont ensuite extraites du tableau de cellules en tant que comma-separated list (ans{2:end}) et chacune est transmise à la fonction en tant qu'argument supplémentaire distinct.

+0

Pas grand-chose à demander après cette réponse. :) Ce qui m'a fait, c'était les tableaux de cellules. Je ne les ai jamais utilisés auparavant, donc je ne me suis pas rendu compte que je devais les lire différemment ({} au lieu de []). – JussiR

1

Vous pouvez l'appeler avec l'opérateur(), ou vous pouvez le transmettre à feval. Vous devrez d'abord l'extraire du réseau de cellules. Si cela ne fonctionne pas, veuillez envoyer un code et un message d'erreur exacts afin que nous puissions voir ce qui ne va pas.

+0

Merci! Excellentes réponses à la fois. – JussiR

Questions connexes