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 :

Effacer une zone de text par l'intermediaire d'un bouton


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Effacer une zone de text par l'intermediaire d'un bouton
    Bonjour,pourriez-vous m'aiguilller pour une procedure dans laquelle je galère?
    Voila j'ai deux zones de textes : un entry (une ligne de texte) et un buffer (buffer) qui contien le texte ke je tape et s'affiche dans un cadre (view). Le but, c'est d'effacer le contenu de ces deux zones de texte qd j'appuie sur un bouton effacer.
    J'ai donc fait un callback:
    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
    g_signal_connect(G_OBJECT(button_eff), "clicked", G_CALLBACK(OnErase), NULL);
     
    Et cette fonction OnErase est ecrite ainsi:
     
    void OnErase(GtkWidget *p_widget, gpointer ptextzone) {
     
      GtkTextBuffer *pTextBuffer;
      GtkTextIter iStart, iEnd;
      gchar *sFile, *buffer;
     
      /* Recuperation du buffer */
      pTextBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(buffer));
      /* Suppression des données du buffer */
      gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
      gtk_text_buffer_get_end_iter(pTextBuffer, &iEnd);
      gtk_text_buffer_delete(pTextBuffer, &iStart, &iEnd);
    }
    Pourriez-vous me dire pk ou ske j'ai oublie de faire, paske jvois vrt pas

  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 : 47
    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
    Oula une petite erreur là... voyons tout ca !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void OnErase(GtkWidget *p_widget, gpointer ptextzone) {
      
      GtkTextBuffer *pTextBuffer;
      GtkTextIter iStart, iEnd;
      gchar *sFile, *buffer;
     
      /* Recuperation du buffer */
      pTextBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(buffer));
      /* Suppression des données du buffer */
      gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
      gtk_text_buffer_get_end_iter(pTextBuffer, &iEnd);
      gtk_text_buffer_delete(pTextBuffer, &iStart, &iEnd);
    }
    Ici buffer est un pointeur sur char or la fonction attend un GtkTextView nuance !

    Voila j'ai deux zones de textes : un entry (une ligne de texte) et un buffer (buffer) qui contien le texte ke je tape et s'affiche dans un cadre (view). Le but, c'est d'effacer le contenu de ces deux zones de texte qd j'appuie sur un bouton effacer.
    C'est quoi comme widget que tu veux vider ? Des GtkEntry ? Des GtkTextView ? Les deux ?

    Le mieux est de les mettres dans une structure, structure que tu passes ensuite en dernier paramètre de la fonction g_signal_connect (soit le pointeur sur la structure soit l'adresse suivant comment tu vas mettre tout ca en place) puis dans ton callback il te reste ensuite qu'à récupérer un pointeur sur la structure et à partir de là tu aura très simplement accès aux deux widgets que tu veux effacer par le biais de ton callback

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Bon j'ai pas tout compri...
    Je dois effacer mes deux zones GtkEntry ET Gtktextview. Et ma structure, je la declare dans ma sous procedure ou en dehors? Si c'est en dehors, je vais utiliser ces parametres comment pour les mettre dans ma sous procedure?
    Peux-tu 'eclairer stp

  4. #4
    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 : 47
    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
    Ok ....


    On a une structure définie endehors de toutes fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct
    {
       GtkWidget * p_entry;
       GtkWidget * p_textview;
    }
    my_st;
    Dans le main où tu créé ces deux widgets, tu déclares un variable du type de ta structure:
    Ensuite tu créé tes deux widgets comme d'habitude quoi, rien ne change sauf que tu accèdes à ces deux widgets par le biais de la structure maintenant !

    Quand tu enregistres le callback avec la fonction g_signal_connect, tu passes l'adresse de cette variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(button_eff), "clicked", G_CALLBACK(OnErase), (gpojnter) & st);
    Dans ton callback, il faut que tu récupère un pointeur sur cette donnée qui elle, est toujours stockée dans le dernier argument du callback soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void OnErase(GtkWidget *p_widget, gpointer p_data)
    {
       my_st * p_st = data;
     
       /* Ici tu vides alors tes deux widgets. */
    }

    Voilà, j'espère que ca t'ira comme explication, c'est dur de faire mieux

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Bon alors j'ai un pe avance...
    Finalement, au lieu de prendre une strucure j'ai construit un tableau . Voici 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
     /*Declaration des zones de texte*/
      GtkWidget *pEntry_intitule;
      GtkWidget *scrollbar;
      GtkWidget *view = NULL;
      GtkTextBuffer *buffer;
      /*Declaration du tableau des zones de texte*/
      GtkWidget *Tab_entry [2] ;
     
     /*Creation des zones de texte*/
      view = gtk_text_view_new (); 
      buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); 
      pEntry_intitule = gtk_entry_new();
      scrollbar = gtk_scrolled_window_new(NULL, NULL);
      gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbar), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
      gtk_container_add (GTK_CONTAINER(scrollbar), view); //Ajout d'une barre de defilement à la zone de texte
     
    /*Chargement du tableau*/
      Tab_entry[0] = pEntry_intitule;
      Tab_entry[1] = view;
     
      g_signal_connect(G_OBJECT(button_eff), "clicked", G_CALLBACK(OnErase), (gpointer) Tab_entry);
     
    /******************************************************************************/
     
    void OnErase (GtkWidget* Widget, gpointer data [2]) {
     
     /*Declaration des donnees*/
      GtkTextIter iStart, iEnd ;
      GtkTextBuffer *Entry_corps_buffer ;
     
      /*On supprime le contenu de l'entry*/ 
      gtk_entry_set_text (GTK_ENTRY (data[0]) , " " ) ; 
     
      /*On supprime le contenu de TextView*/
      /*On récupère le buffer*/
      Entry_corps_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (data[1]));
      /*On récupère les marqueurs de début et de fin du buffer*/
      gtk_text_buffer_get_start_iter (Entry_corps_buffer, &iStart);
      gtk_text_buffer_get_end_iter (Entry_corps_buffer, &iEnd) ;
      /*On supprime le contenu du buffer*/
      gtk_text_buffer_delete (Entry_corps_buffer, &iStart, &iEnd);
      gtk_text_buffer_get_start_iter (Entry_corps_buffer, &iStart);
      gtk_text_buffer_insert (Entry_corps_buffer, &iStart, " " , -1);
    }
    Le programme compile , mais des que j'appuie sur le bouton 'effacer', GTK m'envoie un message d'erreur et se ferme..
    Pourriez vous m'aider? svp...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Je dois rendre ce projet pour la semaine prochaine...

  7. #7
    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 : 47
    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
    Citation Envoyé par claire_cartier
    Je dois rendre ce projet pour la semaine prochaine...
    Je ne le répèterais jamais assez ....

    Citation Envoyé par Franck.H un jour a dit
    "Il faut respecter les signatures de chaque callback suivant le widget qui le déclenche et le type du signal"
    Chez toi, tu ne le respecte pas, toi tu met un tableau de pointeur en second argument:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void OnErase (GtkWidget* Widget, gpointer data [2])
    alors que la vrai signature du callback du signal "clicked" d'un GtkButton est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void                user_function                      (GtkButton *button,
                                                            gpointer   user_data)
    donc respecte ca pour commencer, il ne faut pas inventer des arguments. Leur type, le nombre et leur ordre est important, il conviens de ne pas modifier ceci sinon la transmission des argument sera dans tous les cas faussée !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Points : 12
    Points
    12
    Par défaut zone de texte
    bonjour je dois aussi effacer une zone de texte avec la première méthode décrite au dessus (pas celle du tableau) et je ne comprend pas ce qu'est p_st et p_data comment doit on les déclarer? de plus mon programme bloque à cette ligne:

    g_signal_connect(G_OBJECT(button_eff), "clicked", G_CALLBACK(OnErase), (gpointer) & st);

    en disant:invalid operands to binary &
    je ne vois pas de quoi il s'agit (j'ai déclaré gpointer en GtkWidget)

    toute aide me serait d'un grand service
    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 : 47
    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
    Citation Envoyé par cassa
    bonjour je dois aussi effacer une zone de texte avec la première méthode décrite au dessus (pas celle du tableau) et je ne comprend pas ce qu'est p_st et p_data comment doit on les déclarer?
    Pourtant si tu as lu ma procédure tu devrais le savoir tout ca, p_st est un pointeur sur la structure my_st et p_data bin je vois rien de compliqué, si tu regardes bien c'est le dernier argument du callback et cet argument est transmis par le biais de la valeur ou variable ou pointeur que tu passes en dernier argument de la fonction g_signal_connect ... Tout cela tu devrais déjà le savoir !

    Citation Envoyé par cassa
    de plus mon programme bloque à cette ligne:

    g_signal_connect(G_OBJECT(button_eff), "clicked", G_CALLBACK(OnErase), (gpointer) & st);

    en disant:invalid operands to binary &
    je ne vois pas de quoi il s'agit (j'ai déclaré gpointer en GtkWidget)

    toute aide me serait d'un grand service
    merci
    Montre ton code, tu as du faire une bétise.. et bienvenue sur les forums de developpez.com

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Points : 12
    Points
    12
    Par défaut enregistrer
    désolé pour tout à l'heure, j'avais pas remarqué que tu voulais pas de messages privés, j'avais pas fait gaff!!
    ca y est mon programme fonctionne a peu près!! merci
    Par contre je ne sais pas comment on fait pour enregistrer (grace à un bouton enregistrer) une zone de texte dans un fichier? tu pourrais m'aider stp!! merci
    cassa

  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 : 47
    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
    Citation Envoyé par cassa
    Par contre je ne sais pas comment on fait pour enregistrer (grace à un bouton enregistrer) une zone de texte dans un fichier? tu pourrais m'aider stp!! merci
    cassa
    Rien de compliqué, il suffit de fouiller un peu dans la ref et de réfléchir

    Les démarches, si tu veux enregistrer d'un coup le contenu de ton GtkTextView, sont:
    1. Dans ton callback, tu récupères le pointeur vers la structure, comme dans ton autre fonction,
    2. Récupères ensuite un pointeur vers le GtkTextBuffer de ton GtkTextView avec la fonction gtk_text_view_get_buffer,
    3. Ensuite il faut récupérer le GtkTextIter de début et de fin avec les fonctions: gtk_text_buffer_get_start_iter et gtk_text_buffer_get_end_iter,
    4. Tu peux maintenant récupérer une chaîne de caractères contenant la totalité du GtkTextBuffer avec la fonction gtk_text_buffer_get_text, ne surtout pas oublier de libérer avec g_free cette chaîne une fois que tu n'en as plus besoin !
    5. Voici la dernière étape, tu enregistres ta chaîne avec la fonction g_file_set_contents




  12. #12
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Points : 54
    Points
    54
    Par défaut Hi
    Bonjour Franck.h,

    J'utilise glade et Gtk, je dois modifier des zones de texte et je dois les passer dans un g_signal_connect, mais ça passe pas. J'ai essayer une structure comme avec gtk (simplement), mais j'ai pas le droit de modifier le fichier interface.h généré par glade.
    Voici mon code:
    interface.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      GtkWidget *tab[2];
      tab[0] = textview_note;
      tab[1] = entry;
     
      g_signal_connect ((gpointer) button_valider, "clicked",
    		    G_CALLBACK (on_button_valider_clicked), tab);
    callbacks.c
    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
     
    void
    on_button_effacer_clicked (GtkWidget *button, gpointer user_data)
    {
         GtkWidget *pTextView = NULL;
         GtkWidget *pEntry = NULL;
         GtkTextBuffer *Buffer = NULL;
         GtkTextIter Buffer_Start;
         GtkTextIter Buffer_End;
     
         pTextView = GTK_WIDGET(user_data[0]);
         pEntry = GTK_WIDGET(user_data[1]);
     
         Buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pTextView));
         gtk_text_buffer_get_start_iter(Buffer, &Buffer_Start);        gtk_text_buffer_get_end_iter(Buffer, &Buffer_End);       gtk_text_buffer_delete(Buffer, &Buffer_Start, &Buffer_End);
          gtk_entry_set_text(GTK_ENTRY(pEntry),"");
     
    }
    erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [Warning] dereferencing `void *' pointer 
    void value not ignored as it ought to be 
    [Build Error]  [../src/callbacks.o] Error 1
    je sais que dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void
    on_button_effacer_clicked (GtkWidget *button, gpointer user_data)
    je ne spécifie pas que je passe un tableau de pointeurs, et que le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         pTextView = GTK_WIDGET(user_data[0]);
         pEntry = GTK_WIDGET(user_data[1]);
    ne marchera donc pas... mais je n'ai pas le droit de modifier la signature de la fonction... Que puis je faire?

    J'ai essayer ça aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    GtkWidget *data[2];
     
    data[0] = (GtkWidget **)user_data;
    pTextView = GTK_WIDGET(user_data[0]);
     
    Buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pTextView));
    gtk_text_buffer_get_start_iter(Buffer, &Buffer_Start);      gtk_text_buffer_get_end_iter(Buffer, &Buffer_End);
    Mais ça passe pas...
    Merci

  13. #13
    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 : 47
    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
    Citation Envoyé par cupidette92
    interface.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      g_signal_connect ((gpointer) button_valider, "clicked",
    		    G_CALLBACK (on_button_valider_clicked), tab);
    Il faut revoir tes cours, on passe un objet par le biais de la macro G_OBJECT soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      g_signal_connect (G_OBJECT (button_valider), "clicked",
    		    G_CALLBACK (on_button_valider_clicked), tab);
    Pourquoi tu n'as pas le droit de modifier le fichier interface.h ? C'est le prof qui vous l'interdit ? C'est plus qu'idiot de sa part je dirait. La structure est le seul moyen correct de passer plusieurs widgets dans le dernier argument des callbacks. A part mettre ces widget en globals ce qui n'est franchement pas recommandable du tout !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pTextView = GTK_WIDGET(user_data[0]);
         pEntry = GTK_WIDGET(user_data[1]);
    Ca c'était même la peine de tester, c'est voué à l'échec, le dernier étant simplement un gpointer soit pour en réalité void* ! Une autre solution aurait été d'utiliser une GList par exemple et de mettre les widgets dedans un par un et donc un pour chaque noeud de la liste l Tu peux dans cette solution mettre ta liste en privée par exemple dans le module de compilation interface.c pour passer le pointeur sur la liste en dernier argument de g_signal_connect puis le récupérer depuis le module callback.c !

  14. #14
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par Franck.H
    Il faut revoir tes cours, on passe un objet par le biais de la macro G_OBJECT soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      g_signal_connect (G_OBJECT (button_valider), "clicked",
    		    G_CALLBACK (on_button_valider_clicked), tab);
    On a pas de cours en GTK, et le g_signal_connect() a été généré directement par glade dans le fichier interface.c

    Pourquoi tu n'as pas le droit de modifier le fichier interface.h ? C'est le prof qui vous l'interdit ? C'est plus qu'idiot de sa part je dirait. La structure est le seul moyen correct de passer plusieurs widgets dans le dernier argument des callbacks. A part mettre ces widget en globals ce qui n'est franchement pas recommandable du tout !
    Quand j'ai crée ma structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct
    {
       GtkWidget *entry;
       GtkWidget *view;
    }st
    dans "interface.c"
    j'ai déclaré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    st pt;
     
    pt.entry = gtk_entry_new....
    g_signal_connect(....,&pt)
    L'application a beuggé pck j'ai modifier le widget généré par glade.
    J'ai déjà crée une interface avec gtk et à l'aide de ce forum, j'ai corrigé pas mal d'erreurs et optimiser mon programme, mais avec glade tout ce que j'ai fais précedement ne fonctione plus ou à moitié. C'est pour cette raison que j'essaye de créer un tableau de pointeurs.

    Merci

  15. #15
    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 : 47
    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
    Surement des choses que tu à mal faites ou certaines que tu as oubliées de changer en conséquence mais cette méthode fonctionne, peu importe à partir de quoi tu travail, à la main, avec glade, etc... Au pire, passe ton code complet sur un zip en pièce jointe ou par mail que je puisse y jeter un oeiln avec bien sûr les modifications que tu a essayé d'apporter car sans avoir toutes les infos sur les modifs et les déclarations/initialisations faites par Glade je ne saurais t'en dire d'avantage !

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Points : 12
    Points
    12
    Par défaut bouton enregistrer
    bonjour!
    pour le bouton enregistrer, je dois surement mal utiliser la fonction g_file_get_contents!! peut on nommer (renommer) le fichier dans lequel on enregistre le texte?
    merci

    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
    const gchar *enregistrement;
    const gchar *contents;
    gssize length;
    GError **error;
     
    length=sizeof (contents);
     
    // Recuperation du buffer 
    pTextBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(st->p_textview));
     
    gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
     
    gtk_text_buffer_get_end_iter(pTextBuffer, &iEnd);
     
    enregistrement= gtk_text_buffer_get_text( pTextBuffer, &iStart, &iEnd,include_hidden_chars=TRUE);
     
    gboolean	g_file_set_contents (enregistrement,contents,length,error);
     
    // On libere la memoire 
    g_free(enregistrement);

  17. #17
    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 : 47
    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
    En fait tu n'as pas bien fait et il y a des erreurs (dont certaines ne devraient pas exister), il faut lire des tutoriels...
    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
    const gchar * contents = NULL;;
    GError * error = NULL;
     
    /*
     * Franck.H - Inutile, le contenu du GtkTextView se termine toujours avec
     *            un zero de fin donc pas la peine d'utiliser cet valeur.
     *            De plus il est mieux d'utiliser strlen pour connaitre la
     *            longueur de la chaine, ce qui est demande d'ailleurs !
     */
    /*length=sizeof (contents);*/
     
     
    pTextBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(st->p_textview));
     
    gtk_text_buffer_get_start_iter(pTextBuffer, &iStart); 
    gtk_text_buffer_get_end_iter(pTextBuffer, &iEnd);
     
    /*
     * Franck.H - Regarde vraiment comment tu as passe le denier argument,
     *            est-ce correct a ton avis ?
     */
    /*enregistrement = gtk_text_buffer_get_text (pTextBuffer, &iStart, &iEnd, include_hidden_chars=TRUE);*/
    contents = gtk_text_buffer_get_text (pTextBuffer, &iStart, &iEnd, TRUE);
     
    /*
     * Franck.H - Ici tu as essaye de faire quoi avec le debut de l'appel ?
     *            On n'utilise pas un type mais une variable d'un certain type (
     *            ici, un type gboolean) pour recuperer la valeur de retour !
     *            De plus, si tu avais correctement lu les infos sur cette fonction
     *            et les divers parametre qu'elle prend en compte, tu aurais su
     *            que son premier argument est le nom du fichier dans lequel elle
     *            dois ecrire !
     */
    /*gboolean	g_file_set_contents (enregistrement,contents,length,error); */
     
    /*
     * Franck.H - Remplace "fichier.txt" par le nom de ton fichier dans lequel
     *            tu souhaite ecrire dedans !
     */
    gboolean ret = g_file_set_contents ("fichier.txt", contents, -1, &error);
     
    if (! ret)
    {
       /* Erreur...*/
       g_error ("%s\n", error->message);
    }
     
    g_free(contents);

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    merci jai fait comme tu m'as conseillé mais il s'arrette à g_free (constents) en disant "passing arg(1) of g_free discards qualifiers from pointer target type"

    est ce bon si j'écris
    g_signal_connect(G_OBJECT(pButton1), "clicked", G_CALLBACK(enregistrer), (gpointer) & st);
    pour appeler:
    void enregistrer(GtkWidget *pWidget, gpointer data) ?

  19. #19
    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 : 47
    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
    Citation Envoyé par cassa
    merci jai fait comme tu m'as conseillé mais il s'arrette à g_free (constents) en disant "passing arg(1) of g_free discards qualifiers from pointer target type"
    Bin vire alors le mot clé const dans la déclaration du pointeur, d'ailleurs la fonction gtk_text_buffer_get_text ne renvoie pas de chaîne constante !

    Citation Envoyé par cassa
    est ce bon si j'écris
    g_signal_connect(G_OBJECT(pButton1), "clicked", G_CALLBACK(enregistrer), (gpointer) & st);
    pour appeler:
    void enregistrer(GtkWidget *pWidget, gpointer data) ?
    Pour lier ton callback au bouton oui ca me semble correct. Attention de na pas confondre, ici ce n'est pas un appel d'une fonction mais une liaison d'un callback à un widget, widget qui lui, va alors appeler cette fonction callback lorsque l'événement clicked est déclenché !

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    lorsque j'essai de compiler mon programme voici ce qu'il me dit "undefined reference to g_file_set_contents" et " [build error] [project1] Error 1 et rien ne se passe. Pour le deuxième message je ne sais pas ce qui s'est passé car avant tout marchait puis maintenant rien ne s'affiche. En ce qui concerne le deuxième je ne sais pas ce que je dois rajouter pour que ca fonctionne. merci

Discussions similaires

  1. [XL-2003] insertion de lien hypertexte dans une zone de texte par un bouton parcourir
    Par csophie49 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 22/02/2012, 17h55
  2. [AC-2003] Nom d'une zone de texte par variable
    Par Chico_Latino dans le forum IHM
    Réponses: 6
    Dernier message: 19/03/2010, 15h59
  3. Réponses: 5
    Dernier message: 23/01/2010, 20h57
  4. Réponses: 3
    Dernier message: 03/08/2007, 17h34
  5. Remplir une zone de texte par rapport à une checkbox
    Par beegees dans le forum Général JavaScript
    Réponses: 43
    Dernier message: 04/09/2006, 17h01

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