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 :

enregistrer dans un fichier


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut enregistrer dans un fichier
    bonjour,

    j'ai un petit problème avec une fonction qui consiste à enregistrer. Pour l'instant je ne cherche qu'à enregistrer un titre que rentre l'utilisateur (entry) et un texte toujours saisi par l'utilisateur (buffer). Mon programme exécute et compile par contre il m'enregistre n'importe quoi, les caractères qu'il m'affiche sont des carrés des virgules mais pas des lettres.
    De plus, je dois l'enregistrer sous un fichier.ics mais je ne sais pas ce que sais? est ce que ca marche pareil qu'un .txt et sous quoi l'enregistrer un bloc note?
    je vous mets ma fonction:

    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
     
    void on_button5_clicked(GtkButton *button,GtkWidget *view)
    {
    /*déclaration des variables utiles pour récupérer la note*/
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    GtkWidget *entry;
    GtkWidget* pconfirmation;
    gchar* buffer;
     
    /*déclaration d'un pointeur de fichier mémo*/
    FILE *memo;  
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    entry=lookup_widget(GTK_WIDGET(button),"entry1");
    //On recupere le buffer et on le met dans une variable
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on copie le contenu du buffer dans une variable*/
    buffer = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE);
     
     
     
     
    /*ouverture du fichier memo en écriture */
       memo= fopen("calend.txt","a");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
    fprintf(memo,"BEGIN:VEVENT\n"); 
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entry);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fclose(memo);
     
    //affichage d'une fenetre de confirmation d'enregistrement
    pconfirmation = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO ,GTK_BUTTONS_OK, "Votre memo a bien ete enregistre");
    gtk_dialog_run(GTK_DIALOG(pconfirmation));
    gtk_widget_destroy(pconfirmation);
    }
    et voici l'appelle de ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
     g_signal_connect ((gpointer) button5, "clicked",
                        G_CALLBACK (on_button5_clicked),
                        NULL);
    je pense que c'est dans l'appelle qui peut y avoir un problème, surement dans les paramètres ou peut etre un problème d'initialisation enfin je ne vois pas trop, merci

  2. #2
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Par défaut
    salut,

    ton problème se situe dans le prototype de ta fonction callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void on_button5_clicked(GtkButton *button,GtkWidget *view)
    lorsque tu connectes des signaux à tes widgets, les prototypes à donner à tes fonctions de callback sont rigoureusement spécifiés, ce n'est pas pour rien !

    Ici tu ne peux pas utiliser ce prototype, ce serait plutot quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void on button5_clicked(GtkWidget *widget, gpointer data)
    Maintenant ton souci sera de faire passer les éléments dont tu as besoin dans ta fonction.
    Je te conseille l'utilisation de structures

    EDIT:
    je ne comprends pas ce que tu fais avec cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    entry=lookup_widget(GTK_WIDGET(button),"entry1");

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    void on button5_clicked(GtkWidget *widget, gpointer data)
    je suis d'accord pour ca mais faut bien mettre en parametre ce qu'on va utiliser dans la fonction mettre les variables qu'on utilise dans le programme principale et la fonction. Mon "view" il faut bien que je le récupère de la fonction principale. Dans une de mes fonctions ou je récupère également le buffer c'est comme ca que l'appelle est fait et ca marche.
    Mais là je n'ai surement pas mis assez de parametres enfin je ne vois pas trop.
    En tout cas si je mets que gpointer data, c'est sur ca ne marche pas il ne connait pas le view.
    comme vous le dites, je mets en parametres les elements que j'ai besoin dans ma fonction je ne vois pas pourquoi ce que j'ai mis est faux? Que faut-il mettre sinon?

    je ne comprends pas ce que tu fais avec cette ligne ?

    Code :

    /*On récupére ce que l'utilisateur a rentré*/
    entry=lookup_widget(GTK_WIDGET(button),"entry1");
    en fait dans ma fenetre il ya un gtkentry et l'utilisateur rentre un titre, je veux récupérer le titre qu'il rentre et je le fais par cette ligne de code. J'utilise cette même ligne dans une autre fonction et ca marche , je ne vois pas trop ce qui vous gene? C'est mon prof qui nous dit d'utiliser des lookup_widget.

    merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    puis je avoir un peu d'aide s'il vous plait, je veux juste comprendre pourquoi ma fonction ne marche pas et comment faire, en effet j'ai loin d'avoir terminer avec cette fonction (et je pense avoir encore besoin d'aide un peu plus tard) j'ai encore plein de trucs à rajouter mais tant que ca ne marche pas je ne penses pas que ca sert a quelque chose de continuer car je ne pourrais pas le tester. Je penses que ca doit etre tout bete je ne penses pas qu'il y ait une erreur dans la fonction proprement dit mais je ne vois pas.
    merci

  5. #5
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Tu auras quelques modifications c'est sûr.


    1.- :
    Il faut toujours respecter les prototype des callback pour les signaux, si ton prof te dit de changer, tu le fait venir ici et on va lui donner des cours sur GTK+

    Ta fonction doit donc être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void on_button5_clicked (GtkButton *button, gpointer data)
    Donc en résumé, si tu dois récupérer les contenu de plusieurs widgets bin tu les met dans une structure ou éventuellement un GList que tu passes ensuite en dernier argument de g_signal_connect ce qui les mettra dans l'argument data !

    2.- :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entry=lookup_widget(GTK_WIDGET(button),"entry1");
    Surement spécifique à Glade donc pas bien, le mieux reste encore d'utiliser les fonctions de GTK+, les vraies donc si c'est un GtkEntry: gtk_entry_get_text

    Le reste de ta fonction est à adapter suivant le type de regroupement de widgets que tu vas opter (liste ou structure) !

    3.- :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     g_signal_connect ((gpointer) button5, "clicked",
                        G_CALLBACK (on_button5_clicked),
                        NULL);
    Comme je le répète sans cesse, ceci n'est pas un appel, cela permet de lier une fonction callback à un événement d'un spécifique d'un widget ! De plus l'appel de g_signal_connect n'est pas correct:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     g_signal_connect (G_OBJECT(button5), "clicked",
                        G_CALLBACK (on_button5_clicked),
                        NULL);
    C'est ainsi qu'il faut faire et pas autrement.
    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 !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    plusieurs choses que je ne comprend pas
    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
     
    void on_button4_clicked(GtkButton *button,GtkWidget *view)
    {
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    GtkWidget *entry;
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    entry=lookup_widget(GTK_WIDGET(button),"entry1");
    /*On affiche la chaîne vide*/
    gtk_entry_set_text(GTK_ENTRY(entry)," ");
     
    //On recupere le buffer
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on supprime le contenu du buffer*/
    gtk_text_buffer_delete(text_buffer,&start,&end);
    voici ma fonction et celle la marche, je suis d'accord qu'il faudrait mettre void on_button4_clicked(GtkButton *button,gpointer user_data)
    mon problème c'est qu'après ca ne marche pas et c'est la solution que j'ai trouvé la plus simple car c'est un peu du chinois quand tu me parles de structures ou de le faire passer en glist, comment le changer?


    ensuite pour entry=lookup_widget(GTK_WIDGET(button),"entry1");
    mon prof nous demande de l'utiliser, en effet c'est spécifique à glade, mon problème c'est qu'il marche dans cette fonction mais dans ma fonction enregistrer il ne doit pas marcher car pour celui la il me marque n'importe quoi, je ne vois pas pourquoi?

    voici ma fonction enregistrer
    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
     
    void on_button5_clicked(GtkButton *button,GtkWidget *view, GtkWidget *entry)
     
    {
    /*déclaration des variables utiles pour récupérer la note*/
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    GtkWidget *entrer;
    GtkWidget* pconfirmation;
    gchar* buffer;
     
    /*déclaration d'un pointeur de fichier mémo*/
    FILE *memo;  
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    //entry=lookup_widget(GTK_WIDGET(button),"entry1");
    entrer=gtk_entry_get_text(entry);
    //On recupere le buffer et on le met dans une variable
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on copie le contenu du buffer dans une variable*/
    buffer = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE);
     
     
     
     
    /*ouverture du fichier memo en écriture */
       memo= fopen("calend.txt","a");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
    fprintf(memo,"BEGIN:VEVENT\n"); 
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entry);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fclose(memo);
     
    //affichage d'une fenetre de confirmation d'enregistrement
    pconfirmation = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO ,GTK_BUTTONS_OK, "Votre memo a bien ete enregistre");
    gtk_dialog_run(GTK_DIALOG(pconfirmation));
    gtk_widget_destroy(pconfirmation);
    }
    je sais que le void ne va pas mais on revient au problème d'au dessus, sinon problème avec mon lookup, j'ai du coup essayé ce que tu m'as dit mais il me met type incompatible surement parce que mon void ne va pas je suppose?

    merci

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    j'ai fait un truc je voudrais savoir si c'est bon , car ca marche mais savoir si la syntaxe est correcte:
    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
     
    void on_button4_clicked(GtkButton *button,gpointer user_data)
     
    //void on_button4_clicked(GtkButton *button,GtkWidget *view)
    {
    GtkWidget* textview=user_data;
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    GtkWidget *entry;
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
     
    entry=lookup_widget(GTK_WIDGET(button),"entry1");
    /*On affiche la chaîne vide*/
    gtk_entry_set_text(GTK_ENTRY(entry)," ");
     
     
    //On recupere le buffer
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on supprime le contenu du buffer*/
    gtk_text_buffer_delete(text_buffer,&start,&end); 
     
    }
    voila j'ai bien mis la synytaxe pour le void et en dessous je l'ai mis egale à user data.
    Maintenant que ca marche et en espérant que ce soit bon, j'ai essayer pour ma fonction enregistrer mais là j'ai besoin de plusieurs champs egale à user_data ai-je le droit de mettre ca comme ca:
    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
     
    void on_button5_clicked(GtkButton *button,gpointer user_data)
     
    {
    /*déclaration des variables utiles pour récupérer la note*/
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    GtkEntry *entrer;
    GtkWidget *textview=user_data;
    GtkWidget *entry=user_data;
    GtkWidget* pconfirmation;
    gchar* buffer;
     
    /*déclaration d'un pointeur de fichier mémo*/
    FILE *memo;  
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    //entry=lookup_widget(GTK_WIDGET(button),"entry1");
    entrer=gtk_entry_get_text(GTK_ENTRY(entry));
    //On recupere le buffer et on le met dans une variable
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on copie le contenu du buffer dans une variable*/
    buffer = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE);
     
     
     
     
    /*ouverture du fichier memo en écriture */
       memo= fopen("calend.txt","a");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
    fprintf(memo,"BEGIN:VEVENT\n"); 
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entrer);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fclose(memo);
     
    //affichage d'une fenetre de confirmation d'enregistrement
    pconfirmation = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO ,GTK_BUTTONS_OK, "Votre memo a bien ete enregistre");
    gtk_dialog_run(GTK_DIALOG(pconfirmation));
    gtk_widget_destroy(pconfirmation);
    }
    j'en ai deux egale à user_data, est ce genant sachant que j'ai associé mon boutton de cette manière?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(button4),"clicked",G_CALLBACK(on_button4_clicked),textview1,entry1);
    L'autre problème c'est cette parti là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //entry=lookup_widget(GTK_WIDGET(button),"entry1");
    entrer=gtk_entry_get_text(GTK_ENTRY(entry));
    les deux ne marche pas, que j'utilise l'une ou l'autre ca ne lui va pas et je ne sais pas pourquoi?
    la première avec le lookup compile exécute mais elle enregistrer n'importe quelle lettre dans le fichier
    la deuxième il me met argument non compatible est ce mon entry ou/et mon entrer qui sont mal déclarer
    enfin dans les deux cas je ne vois pas
    merci

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    j'ai régler le problème que j'avais avec l'enregistrement du entry mais le premier problème reste le meme c'est comment mettre le textview et entry en parametre car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(on_button5_clicked),textview1,entry1);
    ca en fait ca ne marche pas
    j'ai donc essayé de définir une structure du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     typedef struct
    {
      GtkWidget *textview1;
       GtkWidget *entry1;
    }
    text_st;
    je l'ai déclarer comme ceci
    text_st st;
    j'ai mis ca dans interface.c du coup j'ai déclarer mon entry et mon textview avec st.textview1
    et j'ai connecté mon bouton de cette facon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(on_button5_clicked),(gpointer) &st);
    le problème c'est dans callback.c
    j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    text_st    * p_st   = user_data;
    et là il me met text_st non déclaré
    j'ai pas dut tout bien comprendre avec les structures
    comment ca marche? Puis je utiliser ca comme ca?
    en fait comment faire?
    je veins bien savoir aussi si le code que j'ai mis au bouton4 dans mon message posté à 21h14 aujourd'hui est correcte ou pas
    merci

  9. #9
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par pepsister
    je l'ai déclarer comme ceci
    text_st st;
    j'ai mis ca dans interface.c du coup j'ai déclarer mon entry et mon textview avec st.textview1
    et j'ai connecté mon bouton de cette facon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(on_button5_clicked),(gpointer) &st);
    le problème c'est dans callback.c
    j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    text_st    * p_st   = user_data;
    et là il me met text_st non déclaré
    Bin je crois que le message est assez explicite non ? Ta la définition de ta structure n'est pas accessible par ton le module callback.c, met donc cette structure dans par exemple callback.h, tout ira mieux ! Le fait de ne pas maîtrisee un minimum le Langage C et la programmation modulaire, c'est pas bien pour passer à GTK+ et encore moins à Glade si on ne maîtrise pas GTK+ ... malgrés que ce soit pour les cours mais il serait bon d'approfondir tes connaissances. On ne programme pas au hasard en C et il existe de nombreux cours complets en ligne pour se perfectionner !
    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 !

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    je suis d'accord qu'il faut que j'approfondisse mais mon projet est a rendre très bientot et il est coef 30 doncj'ai pas trop le choix.
    j'ai un rpoblème à l'exécution il compile et ne me dit rien mais maintenat la fonction enregistrer ne marche plus du tout
    voici mon interface.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     text_st    st;
     st.entry1 = gtk_entry_new ();
      gtk_widget_show (st.entry1);
      gtk_box_pack_start (GTK_BOX (vbox1), st.entry1, FALSE, FALSE, 1);
     st.textview1 = gtk_text_view_new ();
      gtk_widget_show (st.textview1);
      gtk_container_add (GTK_CONTAINER (scrolledwindow1), st.textview1);
      gtk_container_set_border_width (GTK_CONTAINER (st.textview1), 5);
    g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(on_button5_clicked),(gpointer) &st);
    GLADE_HOOKUP_OBJECT (window1, st.entry1, "entry1");
    GLADE_HOOKUP_OBJECT (window1, st.textview1, "textview1");
    je ne mets que ce qui fait référence a la structure
    voici maintenant mon callback.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct
    {
      GtkWidget *textview1;
       GtkWidget *entry1;
    }
    text_st;
    void
    on_button5_clicked (GtkButton       *button,gpointer         user_data);
    et voici mon callback.h
    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
     
    void on_button5_clicked(GtkButton *button,gpointer user_data)
     
    {
    /*déclaration des variables utiles pour récupérer la note*/
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    const gchar *entrer;
    GtkWidget* pconfirmation;
    gchar* buffer;
    text_st    * p_st   = user_data;
     
    /*déclaration d'un pointeur de fichier mémo*/
    FILE *memo;  
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    //entry=lookup_widget(GTK_WIDGET(button),"entry1");
    entrer=gtk_entry_get_text(GTK_ENTRY(p_st->entry1));
    //On recupere le buffer et on le met dans une variable
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(p_st->textview1));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on copie le contenu du buffer dans une variable*/
    buffer = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE);
     
     
     
     
    /*ouverture du fichier memo en écriture */
       memo= fopen("calend.txt","a");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
    fprintf(memo,"BEGIN:VEVENT\n"); 
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entrer);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fclose(memo);
     
    //affichage d'une fenetre de confirmation d'enregistrement
    pconfirmation = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO ,GTK_BUTTONS_OK, "Votre memo a bien ete enregistre");
    gtk_dialog_run(GTK_DIALOG(pconfirmation));
    gtk_widget_destroy(pconfirmation);
    }
    et là je ne vois pas ce qui ne va pas, il ne me met aucun message d'erreur, dès que j'appuie sur enregistrer, il ferme la fenêtre
    comment dois je faire?
    merci encore

  11. #11
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Attention, dans ton interface.c ta déclaration suivante:
    déclare bel et bien une variable du type de ta structure mais cela reste une variable locale, une fois la fonction terminée la variable n'existe plus alors soit tu déclare cette variable à l'intérieur même du main et tu modifies la fonction pour pouvoir passer l'adresse de cette variable (le reste se fait alors par le biais de pointeur).

    Seconde solution, tu déclares un pointeur dans la fonction actuelle mais il faut alors que tu alloues son adresse mémoire pour pouvoir l'utiliser mais il faut garder une trace du pointeur pour pouvoir le libérer ultérieurement !
    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 !

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    Attention, dans ton interface.c ta déclaration suivante:

    Code :
    text_st st;
    déclare bel et bien une variable du type de ta structure mais cela reste une variable locale, une fois la fonction terminée la variable n'existe plus alors soit tu déclare cette variable à l'intérieur même du main et tu modifies la fonction pour pouvoir passer l'adresse de cette variable (le reste se fait alors par le biais de pointeur).
    je ne comprend pas bien, si c'est une variable locale, faut il que je déclare du coup,
    GtkWidget *entry1;
    GtkWidget *textview1;
    dans mon interface.c?
    je pensais que ce n'était pas la peine si on mettait text_st st;
    en fait je passe text_st st; dans le main , dans interface.c je déclare normalement mon entry et textview? je ne vois pas quand tu dis qu'il faut modifier la fonction pour pouvoir passer l'adresse de cette variable

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/11/2005, 18h03
  2. comment ne pas enregistrer dans le fichier log?
    Par trotters213 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 21/03/2005, 14h56
  3. [LG]Enregistrements dans un fichier
    Par ticoude dans le forum Langage
    Réponses: 1
    Dernier message: 26/11/2004, 18h33
  4. [LG]supprimer un enregistrement dans un fichier
    Par Marcus2211 dans le forum Langage
    Réponses: 10
    Dernier message: 17/11/2003, 00h59
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 15h17

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