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

GTK+ avec C & C++ Discussion :

Passer plusieurs paramètres dans un callback (débutant!)


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Points : 17
    Points
    17
    Par défaut Passer plusieurs paramètres dans un callback (débutant!)
    Bonjour,

    Je viens de commencer gtk et j'ai une petite question ...
    Comment peux t'on passer des paramètres à une fonction appeller par un callback ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    exemple de ce qui ne fonctionne pas ... : 
     
    g_signal_connect(G_OBJECT(pbutton_integrite), "clicked", G_CALLBACK(fonctiontest(p_TextView,"test1","test2"),0);
     
    Pour appeller :
     
    fonctiontest(GtkWidget *pwidget,char *mot1,char *mot2)
    Comment faire pour que ça marche ?
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut !


    Il est vraiment dans l'urgence que tu lise quelques tutorials sur GTK+, en voici:
    Les meilleurs cours GTK+ de developpez.com

    On ne passe surement pas un callback de cette manière et si tu était un peu expérimenté en C, tu le saurais sans aucun doute !

    Lors du passage d'une fonction en paramètre à une autre, on ne passe que son nom histoire de fournir son adresse à la fonction appelante, le dernier paramètre de g_signal_connect est un pointeur générique qui sera transmis à ton callback.

    Une chose importante à savoir dans GTK+, si tu veut assigner un callback à un widget, tu dois respecter les arguments du callback, on ne passe pas n'importe quel type de fonction en guise de callback !

    Tu peux trouver les signature adéquates sur la ref du langage sur le site officiel et suivant ton widget: GTK+ Reference Manual, il sert à ca également ! Dans chaque lien de widgets, tu trouvera une partie Signals qui te permettra de savoir quels sont les signaux que tel ou tel widget prend en charge. Il va de soi qu'un widget prend également en charge les signaux de ses widgets parent, il faut donc prendre l'habitude de remonter dans la hiérarchie des widgets jusqu'à trouver ce que tu veux.

    Bon passons les explication sinon j'arrête plus


    Pour ton cas, il faut que tu trouve la signature pour le callback par rapport au signal clicked donc pour cela, tu vas sur la page du GtkButton soit: GtkButton puis, tu recherches la section des signaux et Ho ! Miracle, on trouve le signal clicked !

    On peut désormais voir la signature exacte du callback qu'il convient de respecter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void        user_function                  (GtkButton *button,
                                                gpointer   user_data)
    On a tout de même une certaine liberté, tu peux donner le nom que tu veux à la fonction ainsi qu'aux noms de chaque paramètre, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonctiontest (GtkWidget * p_wid, gpointer p_data);
    Mais il convient de respecter le type des arguments !


    Bon dans ton cas, si tu veux passer plusieurs données au pointeur p_data, il te faut passer par une structure qui contiendra tout ce que tu veux lui transmettre, tu pourras ensuite passer son adresse dans le dernier argument de g_signal_connect.

    Exemple:
    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
    16
    /* ... */
     
    typedef struct
    {
       char * mot1;
       char * mot2;
    }
    _st;
    _st st;
     
    /* ... Remplissage de la structure ... */
     
    g_signal_connect (
       G_OBJECT (pbutton_integrite), "clicked",
       G_CALLBACK (fonctiontest), & st
    );
    Petite remarque en passant... On passe NULL au dernier paramètre si on ne veut pas passer de valeur au pointeur p_data et non pas 0 !

    Voilà, il te reste plus qu'à récupérer le contenu de p_data depuis ton callback et zouuu !


    Wouw !! Fini, j'espère que tu as compris quelque chose
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Oui j'ai tout compris et tout marche impec! merci!

Discussions similaires

  1. Passer plusieurs paramètres dans HTA
    Par papyxy dans le forum VBScript
    Réponses: 6
    Dernier message: 20/08/2012, 17h43
  2. Passer plusieurs paramètres dans un window Open
    Par arngrimur dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/01/2012, 15h57
  3. Réponses: 5
    Dernier message: 03/07/2007, 10h31
  4. Passer un paramètre dans le script
    Par ipeteivince dans le forum Windows
    Réponses: 2
    Dernier message: 02/03/2006, 17h00
  5. Réponses: 2
    Dernier message: 12/09/2005, 15h33

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