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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    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 : 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
    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
    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 averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    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 : 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
    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
    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 !

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    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 averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    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

  8. #8
    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 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
    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 !

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    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

  10. #10
    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 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



    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 !

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    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

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