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 :

Récuperation widgets d'un contenaire(suite)


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 55
    Par défaut Récuperation widgets d'un contenaire(suite)
    Salut chers amis,
    Excusez-moi de vous déranger à nouveau. J'ai parcouru le forum mais je n'ai toujours pas trouver de solution à mon probleme. J'ai essayer de tripoter mon code mais sans succes.
    En enlevant certains HBox de mon VBox je n'avais fait que repouser le probleme principale mais au moins j'ai pu resoudre les secondaires.

    Je peux recuperes les widgets contenus dans un HBox notamment les GtkEntry
    g_signal_connect(G_OBJECT(Bouton), "clicked", G_CALLBACK(Action), (GtkWidget*) HBoxn);. Avec un Glist je recuperer ce que je veux.

    Avec ce code :g_signal_connect(G_OBJECT(Bouton), "clicked", G_CALLBACK(Action), (GtkWidget*) HBoxn); je recupere uniquement les HBox du VBox, pas directement leurs contenu.

    J'ai essaye de dans la fonction callback de recuperer par exemple le premier HBox (HBoxn) puis a partir de ce dernier recuperer les widgets contenu mais ca ne marche pas. Voici ce ke j'ai fais

    Dans main :
    g_signal_connect(G_OBJECT(Bouton), "clicked", G_CALLBACK(Action), (GtkWidget*) VBox);

    Dans la fonction callback
    /* Recuperation de la liste des elements que contient la GtkVBox VBox */
    pListp = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)data));

    boxn = GTK_WIDGET(pListp->data);
    pListp = g_list_next(pListp);

    /* Recuperation de la liste des elements que contient la GtkHBox HBoxn */
    pListn = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)boxn);

    /* Premier element labeln*/
    nom = GTK_WIDGET(pListn->data);
    //prenom = GTK_WIDGET(pListp->data);
    .
    .
    .
    A la compilation je recois cette erreur
    gtk7.c: In function «Action":
    gtk7.c:132: erreur: expected «)" before «;" token
    gtk7.c:182: erreur: expected «;" before «}" token
    Apparemment ce n'est pas possible d'ecrire celà.

    Des idees?

  2. #2
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 35
    Par défaut
    Bon rapidement tu ne nous indique pas les lignes donc on peut pas se servir des erreurs données. Mais déjà la première erreur c'est juste qu'il manque une parenthèse fermante sur la ligne :

    pListn = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)boxn);

  3. #3
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 55
    Par défaut
    Desole j'ai copie la mauvaise erreur. J'avai fais une copie du code que je modifie au cas ou je me perdais. Sinon l'erreur meme est : Erreur de segmentation (core dumped). Dans le forum quelqu'un disait qu'une erreur de segmentation vient toujours d'un accès mémoire à un endroit non alloué.Mais là je ne sais pas d'ou ca viens.

    Voici une description de mon interface.
    - J'ai un VBox, dans ce dernier 3 HBox qui contiennent respectivement chacun:
    * Un label(nom),un gtkentry puis un autre label (vide pour recevoir le premier)
    * Un label (prenom) et un gtkentry.
    * Un bouton
    (dans le code final il y a d'autres HBox , si on fait pour 2 on peut faire pour 1000)

    Si j'ecris ceci dans la fonction main()
    *g_signal_connect(G_OBJECT(Bouton), "clicked", G_CALLBACK(Action), (GtkWidget*) VBox);, je recupere dans la fonction callback que les HBox sans leurs widgets.
    * Si j'ecris ca : g_signal_connect(G_OBJECT(Bouton), "clicked", G_CALLBACK(Action), (GtkWidget*) HBoxp);, je recupere les widgets du HBox correspondant. Le probleme est que je ne peux pas le faire plusieurs fois pour tous les HBox.

    Donc ce que je vais, je passe le VBox en parametre dans main()
    g_signal_connect(G_OBJECT(Bouton), "clicked", G_CALLBACK(Action), (GtkWidget*) VBox);
    Puis dans la fonction callback, lorsque je recupere un Hbox j'utilise une nouvelle vois la fonction g_signal_connect() en lui indiquant comme parametre le HBox recupere come ceci: g_signal_connect(G_OBJECT(Bouton), "clicked", G_CALLBACK(Action), (GtkWidget*) HBoxp);. Puis je recupere avec la fonction gtk_container_get_children les widgets.

    Seulement je ne sais pas si c'est vraiment faisable, et plus je recois la fameuse erreur: Erreur de segmentation (core dumped)

    J'espèere que c'est assez claire. Le code
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
     
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <mysql/mysql.h>
    #include <sql.h>
     
    void Action(GtkWidget *Bouton, gpointer data);
    void on_activate_entry(GtkWidget *Entryn, gpointer data);
     
    int main(int argc, char **argv)
    {
        GtkWidget *Window;
        GtkWidget *ComboBox,*ComboBoxcanal;
        GtkWidget *HBoxp,*HBoxn,*VBox,*HBoxtitre,*HBoxadresse,*HBoxtel,*HBoxrv,*HBoxhd,*HBoxdate,*HBoxheure,*HBoxdh,*HBoxj,*HBoxm,*HBoxa,*HBoxh,*HBoxmin,
                   *HBox1,*HBox2,*HBox3,*HBox4,*HBoxvide,*HBoxcanal,*HBoxbouton;
        GtkWidget *Bouton;
        GtkWidget *Labeltitre,*Labelp,*Labeladresse,*Labeltel,*Labeln,*Labelrv,*Labeldate,*Labelj,*Labelm,*Labela,*Labelheure,*Labelh,
                  *Labelmin,*Labelcanal,*Labelc,*Labelln;
        GtkWidget *Entryn,*Entryp,*Entryadresse,*Entrytel,*Entryj,*Entrym,*Entrya,*Entryh,*Entrymin;
        GtkWidget *Label;
     
        const gchar *Textnom;
     
     
        gtk_init(&argc,&argv);
     
        Window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(Window), "CALLBACK");
        gtk_window_set_default_size(GTK_WINDOW(Window), 500, 400);
        gtk_window_set_position(GTK_WINDOW(Window), GTK_WIN_POS_CENTER);
        g_signal_connect(G_OBJECT(Window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
        /* Creation de la GtkBox verticale  */
        VBox = gtk_vbox_new(FALSE, 10);
     
        /* Ajout de la GtkVBox dans la fenetre */
        gtk_container_add(GTK_CONTAINER(Window), VBox);
     
         /* Creation des box horizontaux */
        HBoxtitre = gtk_hbox_new(TRUE, 0);     
        HBoxn = gtk_hbox_new(TRUE, 0);         
        HBoxp = gtk_hbox_new(TRUE, 0);        
        HBoxbouton = gtk_hbox_new(TRUE, 0);
     
        /* Ajout des GtkHBox dans la GtkVBox */
        gtk_box_pack_start(GTK_BOX(VBox), HBoxtitre, FALSE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(VBox), HBoxn, FALSE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(VBox), HBoxp, FALSE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(VBox), HBoxbouton, FALSE, TRUE, 0);
     
         /* Creation du label */
        Labeln=gtk_label_new("Nom :");                              
        Labelp=gtk_label_new("Prenom :");                                                   
        Labeltitre=gtk_label_new("COORDONNEES DU CLIENT");           
        Label = gtk_label_new(NULL); 
        Labelln = gtk_label_new(NULL);              
     
         /* Creation des GtkEntry */
        Entryn = gtk_entry_new();         
        Entryp = gtk_entry_new();         
     
        /* On ajoute des labels aux box horizontaux */
        gtk_box_pack_start(GTK_BOX(HBoxtitre), Labeltitre, TRUE, TRUE, 0);       
        gtk_box_pack_start(GTK_BOX(HBoxn), Labeln, TRUE, TRUE, 0);               
        gtk_box_pack_start(GTK_BOX(HBoxp), Labelp, TRUE, TRUE, 0); 
     
        gtk_box_pack_start(GTK_BOX(VBox), Label, TRUE, FALSE, 0);
     
        /* On ajoute des zones de saisie aux box horizontaux */
        gtk_box_pack_start(GTK_BOX(HBoxn), Entryn, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(HBoxp), Entryp, TRUE, TRUE, 0); 
     
        gtk_box_pack_start(GTK_BOX(HBoxn), Labelln, TRUE, TRUE, 0); 
     
        /* Initialisation du bouton Valider */
         Bouton = gtk_button_new_with_label("Valider"); 
     
        /* Ajout de Bouton dans la GtkHBox */
        gtk_box_pack_start(GTK_BOX(HBoxbouton), Bouton, TRUE, FALSE, 0);  
     
        /* Connexion du signal "clicked" du bouton */
        g_signal_connect(G_OBJECT(Bouton), "clicked", G_CALLBACK(Action), (GtkWidget*) VBox);
        //g_signal_connect(G_OBJECT(Bouton), "clicked", G_CALLBACK(Action), (GtkWidget*) HBoxp);
     
        /* Connexion du signal "activate" du GtkEntry */
        //g_signal_connect(G_OBJECT(Entryn), "activate", G_CALLBACK(on_activate_entry), (GtkWidget*) Label);
     
        //gtk_container_foreach(GTK_CONTAINER(Window),(GtkCallback)Action,""); 
     
     
        gtk_widget_show_all(Window);
     
        gtk_main();
        return EXIT_SUCCESS;
    }
     
     
    void Action(GtkWidget *Bouton, gpointer data)
    {
        GtkWidget *Tempn;
        GtkWidget *nom,*entryn,*prenom,*entryp,*boxn,*boxp,*boxb;
        GtkWidget *Label; 
        GList *pListp=NULL;
        GList *pListn=NULL;
        const gchar *Textnom,*Textprenom;
        const gchar *Txtnom,*Txtprenom;
        FILE *fichier; 
     
        MYSQL *mysql;
        MYSQL *conn;                     
     
        char *query;
        int t,r;
     
        /* Recuperation de la liste des elements que contient la GtkVBox VBox */
        pListp = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)data));
     
        /*premier element:HBoxn contient le label nom , le Gtkentry et un 2eme label
         vide dans lequel j'affiche le contenu du gtkentry afin de s'assurer que la recuperation a ete bien faite  */
        boxn = GTK_WIDGET(pListp->data);
        /* Element suivant le HBOxp: contient le label prenom et le Gtkentry*/ 
        pListp = g_list_next(pListp);
        boxp = GTK_WIDGET(pListp->data); 
        /*Element suivant le HBoxbouton: contient le bouton */
        pListp = g_list_next(pListp);
        boxb = GTK_WIDGET(pListp->data); 
     
        /* Recuperation de la liste des elements que contient la GtkHBox HBoxn */
        pListn = gtk_container_get_children(GTK_CONTAINER((GtkWidget*)boxn));
     
        /* Premier element labeln*/
        nom = GTK_WIDGET(pListn->data);
        pListn = g_list_next(pListn);
        /* Passage a l element suivant le gtkentry*/
        entryn = GTK_WIDGET(pListn->data);
     
        /* Passage a l element suivant le label*/
        pListn = g_list_next(pListn);
        Label = GTK_WIDGET(pListn->data);
     
        /* Recuperation du texte contenu dans les GtkEntry  */
        Textnom = gtk_entry_get_text(GTK_ENTRY(entryn));
        //Textprenom = gtk_entry_get_text(GTK_ENTRY(entryp));
     
         /* Modification du texte contenu dans le GtkLabel */
        gtk_label_set_text(GTK_LABEL(Label), Textnom);
     
        /* Liberation de la memoire utilisee par la liste */
        //g_list_free(pList); 
     
         // initialisation
        if((conn = mysql_init(NULL)) == NULL)
         {
          printf("Erreur d'initialisation\n");
         } 
     
        // connexion au serveur (ici, en local)
        if(mysql_real_connect(conn,"localhost","root","passer","stage",0,NULL,0)==NULL)
         {
          printf("Erreur de connexion\n");
         } 
     
         char *to_insert = g_strdup_printf ("insert into clients (nom) values ('%s')", gtk_entry_get_text(GTK_ENTRY(entryn)));
         mysql_query(conn,to_insert);
         g_free (to_insert);  
     
        //Requête qui sélectionne tout dans ma table scores
     
        //mysql_query(conn,"insert into clients (nom) values ('Textnom')");
     
        //On met le jeu de résultat dans le pointeur result
        //res = mysql_use_result(mysql);
     
        mysql_close(conn); 
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    Alors de 2 choses l'une :
    Utilise les balises [CODE], si tu veux qu'on puisse te relire...
    Ensuite, évite toujours de manipuler directement les champs d'une GList.
    Utilise plutot g_list_nth_data si tu veux avoir un élément d'une liste se trouvant à une position donnée.
    L'élément pointé par ton GList* doit toujours être la tête de la liste, sinon c'est le bordel...

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Citation Envoyé par Kicker Voir le message
    Ensuite, évite toujours de manipuler directement les champs d'une GList.
    Utilise plutot g_list_nth_data si tu veux avoir un élément d'une liste se trouvant à une position donnée.
    Oula non, il vaut mieux parcourir une liste séquentiellement en utilisant le pointeur next plutot que d'utiliser sans cesse g_list_nth_data. Cette fonction n'est à utiliser que si on n'a vraiment pas le choix et le fait de l'utiliser indique en général qu'une liste n'est pas une structure adaptée à ce qu'on veut faire.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    C'est chelou dans ce cas... Si tu savais le nombre de bugs que j'ai eus parceque j'manipulais directement le champs next...
    les fonctions g_list_*, au moins, elles sont stables ^^

Discussions similaires

  1. Récuperer l'espace dans tablespace suite à un delete
    Par krilas dans le forum Administration
    Réponses: 7
    Dernier message: 28/07/2010, 12h52
  2. Plusieurs Widgets a afficher à la suite
    Par AuraHxC dans le forum Qt
    Réponses: 2
    Dernier message: 24/11/2009, 20h35
  3. [MySQL] Afficher valeur à récuperer à la suite des autres
    Par nico26 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 20/02/2007, 15h48
  4. Récuperer une valeur suite à une requete
    Par Micke7 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/09/2006, 18h55
  5. Réponses: 13
    Dernier message: 28/07/2005, 13h11

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