IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Discussion :

Simplification des fonctions de callback


Sujet :

Interfaces Graphiques

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Par défaut Simplification des fonctions de callback
    Bonjour,

    Je me pose une question depuis quelque temps sur Matlab. J'ai tenté de trouver sur internet une réponse, mais je sais à peine quels mots utiliser pour une recherche sur Google.

    Voilà ma question : d'habitude quand j'utilise par exemple un bouton ou un menu, que je fais un CallBack, je me crée dans le programme quelque chose qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    [...]
    a = 0;
     
    unboutoninutile = uicontrol('Parent',hpanelbutton, ...
          'Style','pushbutton', ...
          'String','Donnez à ''a'' la valeur 1 !',...
          'Callback',{@monbouton});
     
     
    function monbouton(src,evnt)
    a = 1;
    end
    Ca fonctionne sans problème, et cela me permet d'extraire des valeurs. Mais quand on a plein de boutons, plein de menus, ça devient vite lourd. Ce que j'aimerais faire, c'est de placer ces petites fonctions dans des fichiers séparés, afin de rendre l'ensemble plus lisible.

    J'ai fait ceci, me recréer un fichier à coté, et y mettre ma fonction monbouton. Mais malheureusement, sur ce fichier, je n'ai plus aucun moyen de faire sortir facilement la valeur de a. J'ai tenté par exemple d'écrire :

    et sur un fichier "monbouton.m" d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function monbouton(src,evnt)
    a = 1;
    end
    Mais ça ne marche pas (et on dit partout que les variables globales c'est le mal !). Comment faire alors pour arriver au résultat précédent le plus simplement possible, sans avoir à créer la moindre fonction fille dans ma fonction principale, mais toujours en plaçant toutes mes fonctions dans des fichiers séparés ?

    (J'espère avoir été compréhensible)

    Merci !

    Gouhouf

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Bonjour,

    Une solution pour passer des variables entre les fonctions est d'utiliser GETAPPDATA/SETAPPDATA mais j'ai du mal à comprendre l'intérêt de ce que tu veux faire

    Bonne apm,
    Duf

  3. #3
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Comme Duf, je ne vois pas très bien.
    C'est très rare de sortir les fonctions de callback de la fonction principale ou alors c'est pour lancer un traitement lourd qui sera utilisé par ailleurs dans d'autres fonctions.
    En quoi trouves-tu ça lourd ?

    Sinon plutôt que GET/SETAPPDATA (que Duf adore apparemment ), tu peux aussi mettre les variables qui t'intéressent en argument de sortie de ta fonction.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Par défaut
    Coucou duf,

    Et merci pour le changement de répertoire pour la question, j'avais pas vu qu'il y avait un répertoire "GUI".

    Bah voilà un exemple concret de ce que je veux faire (j'en ai des dizaines comme ça), j'ai une "matrice cubique" qui représente une image 3D, je n'affiche évidemment qu'une image donc 2D. J'ai un petit bouton qui me permet de changer l'orientation de la caméra, avec 3 orientations possibles, x, y et z (je n'ai pas besoin de plus compliqué que ça).

    DOnc j'ai crée un keypress "changecam" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function changecam(src,evnt)
            if strcmp(evnt.Key,'space')
                campos = mod(campos,3)+1;
            end
            if campos == 1
                    set(hpanelplot,'Title',[get(hpanelplot,'Title') ' Axe X.']);
            elseif campos == 2
                    set(hpanelplot,'Title',[get(hpanelplot,'Title') ' Axe Y.']);
            elseif campos == 3
                    set(hpanelplot,'Title',[get(hpanelplot,'Title') ' Axe Z.']);
            end
            draw();
            axis equal;
            axis tight;
        end
    Et en dessous j'ai une petite fonction draw pour tout redessinner. On voit en particulier que la variable campos vient du programme lui-même (ainsi que hpanelplot). Si je place ça dans un fichier séparé, ça ne marche pas.

    Bon si je n'avais qu'une fonction comme ça, ça ne poserait pas de problème, mais j'en ai des dizaines, et là ça commence à être un peu lourd (même si ça n'a rien d'impossible).

    Peut-être comprends-tu mieux mon problème.

    Bonne soirée !

    Gouhouf

  5. #5
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Ma réponse ne sert à rien

    Comme je le disais passe tes variables en argument.
    Bon je n'ai parlé que des arguments de sortie mais tu peux aussi mettre des arguments d'entrée.
    L'entête de ta fonction serait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function campos=changecam(src,evnt,hpanelplot)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Par défaut
    Excuse-moi Caroline,

    j'ai répondu au même moment que tu envoyais ton poste.

    Si je fais comme tu le décris, que dois-je mettre dans mon keypress ? ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {campos = @(evnt,src)changecam(evnt,src,hpanelplot,campos)}
    ?

    En tout cas, merci pour vos réponses si rapides
    Il faudrait peut-être que je ne fasse pas que poser des questions, pour ma part, et que je réponde de temps en temps à celles des autres

    Gouhouf

  7. #7
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Citation Envoyé par Gouhouf Voir le message
    Si je fais comme tu le décris, que dois-je mettre dans mon keypress ? ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {campos = @(evnt,src)changecam(evnt,src,hpanelplot,campos)}
    ?
    Argh !! Ah oui je n'avais pas pensé à ça...
    On ne peut pas mettre d'argument de sortie (enfin je n'ai jamais essayé).
    Et ce serai embêtant d'avoir quand même la sous-fonction mais juste avec une ligne qui appellerait la fonction externe ?

    Sinon je ne comprends toujours pas pourquoi tu veux externaliser cette fonction : tu ne vas pas l'utiliser ailleurs, si ? Parce qu'elle a l'air quand même spécifique à ton GUI.


    HS :
    Citation Envoyé par Gouhouf Voir le message
    Il faudrait peut-être que je ne fasse pas que poser des questions, pour ma part, et que je réponde de temps en temps à celles des autres
    Pas de problèmes, tout le monde commence comme ça.
    Ne réponds que si tu es sur

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Par défaut
    Coucou,

    Bah je voulais externaliser, juste pour que ce soit un peu plus lisible. Sinon, je vais me contenter de ne "réduire" mes fonctions avec le petit - ou le petit + qui apparaît à coté de chaque fonction.

    Merci,

    Gouhouf

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Paramètres des fonctions callback
    Par troumad dans le forum GTK+ avec C & C++
    Réponses: 13
    Dernier message: 31/03/2015, 14h55
  2. Arguments des fonctions de callback avec GTKUIManager
    Par mathedit dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 10/05/2009, 23h26
  3. Réponses: 4
    Dernier message: 01/10/2008, 11h37
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo