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 :

2 questions sur le tuto des zones de texte


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
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut 2 questions sur le tuto des zones de texte
    Bonjour,
    J'ai quelques questions à propos du tuto sur les zones de texte ():

    L'auteur écrit... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //On recupere le buffer
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
    ...dans le premier exemple de programme (début du code de la fonction "saisie"):
    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
    #include <gtk\gtk.h>
     
    gboolean fin(GtkWidget *widget, GdkEvent *event, gpointer user_data);
    void saisie(GtkButton *button, GtkWidget *view);
     
    int main(int argc, char* argv[])
    {
    GtkWidget* window;
    GtkWidget* box;
    GtkWidget* text_view;
    GtkWidget* button;
     
    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 320, 200);
    gtk_window_set_title(GTK_WINDOW(window), "XIII. Les zones de texte.");
    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),0);
     
    box=gtk_vbox_new(FALSE,5);
    gtk_container_add(GTK_CONTAINER(window),box);
     
    text_view=gtk_text_view_new();
    gtk_box_pack_start(GTK_BOX(box),text_view,TRUE,TRUE,0);
     
    button=gtk_button_new_with_label("Afficher");
    gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0);
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(saisie),text_view);
     
    gtk_widget_show_all(window);
     
    gtk_main();
     
    return 0;
    }
     
    gboolean fin(GtkWidget *widget, GdkEvent *event, gpointer user_data)
    {
    gtk_widget_destroy(widget);
    gtk_main_quit();
     
    return 0;
    }
     
    void saisie(GtkButton *button, GtkWidget *view)
    {
    GtkWidget *dialog;
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    gchar* buf=0;
     
    //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 copie le contenu du buffer dans une variable
    buf=gtk_text_buffer_get_text(text_buffer,&start, &end,TRUE);
     
    //On affiche le texte dans une boite de dialogue.
    dialog = gtk_message_dialog_new(NULL,
    GTK_DIALOG_MODAL,
    GTK_MESSAGE_INFO,
    GTK_BUTTONS_OK,
    "Votre texte :\n%s", buf);
     
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
     
    //On libere la memoire
    g_free(buf);
    }
    Est-ce que ce n'est pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
    D'ailleurs l'auteur l'écrit comme ça dans le second exemple de programme. Est-ce que ça change quelque chose ?

    Sinon pour le second exemple on a:
    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
    void ouvrir_fichier(GtkWidget *bouton, GtkWidget *file_selection)
    {
    GtkTextBuffer *buffer;
    GtkTextIter start;
    GtkTextIter end;
    FILE *fichier;
    const gchar *chemin;
    gchar lecture[1024];
     
    buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
     
    chemin = gtk_file_selection_get_filename(GTK_FILE_SELECTION (file_selection));
    fichier = fopen(chemin,"rt");
     
    if(fichier == NULL)
    {
    GtkWidget *dialog;
     
    dialog = gtk_message_dialog_new(GTK_WINDOW(file_selection), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Impossible d'ouvrir le fichier : \n%s", g_locale_to_utf8(chemin, -1, NULL, NULL, NULL));
    gtk_dialog_run(GTK_DIALOG(dialog));
    gtk_widget_destroy(dialog);
    gtk_widget_destroy(file_selection);
     
    return;
    }
     
    gtk_widget_destroy(file_selection);
     
    gtk_text_buffer_get_start_iter(buffer,&start);
    gtk_text_buffer_get_end_iter(buffer,&end);
    gtk_text_buffer_delete(buffer, &start, &end);
     
    while(fgets(lecture, 1024, fichier))
    {
    gtk_text_buffer_get_end_iter(buffer,&end);
    gtk_text_buffer_insert(buffer, &end, g_locale_to_utf8(lecture, -1, NULL, NULL, NULL), -1);
    }
     
    fclose(fichier);
    }
    Pourquoi vider le contenu du buffer avant d'y ajouter le contenu du fichier qu'on a lu ? S'il contenait quelque chose ok, mais là il est vide...
    Merci d'avance pour vos éclaircissements !

  2. #2
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Je fais juste un up...

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Non.

    Ton problème de lecture vient des variables déclarées en locales.

    text_view n'existe que dans le main(). Il est transmis à la fonction saisie(); via la variable view de cette même fonction.

    Pour faire plus simple, dans le main(); text_view est transmis en donnée utilisateur à la fonction saisie grâce à la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(saisie),text_view);
    Ensuite la fonction saisie est déclarée comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void saisie(GtkButton *button, GtkWidget *view);
    La donnée utilisateur est récupérée ici dans la variable view.

  4. #4
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Hello !
    text_view n'existe que dans le main(). Il est transmis à la fonction saisie(); via la variable view de cette même fonction.
    Ok, merci, c'est plus clair !

    Mais pour le buffer dans le second programme je n'ai pas compris pourquoi on le vide initialement, avant d'afficher le contenu du fichier...

    Encore merci pour votre aide !

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Après une lecture rapide du deuxième tuto, la vidange du buffer s'avère nécessaire.
    Le programme ne tenant pas compte d'une ouverture précédente d'un fichier, on libère la mémoire éventuellement allouée avant de charger le nouveau fichier sélectionné.

  6. #6
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Par défaut
    Merci beaucoup !

Discussions similaires

  1. [FLASH 8] Question sur la portée des objets.
    Par i_shinji dans le forum Flash
    Réponses: 1
    Dernier message: 02/11/2005, 17h18
  2. Question sur la gestion des fenetres MDI
    Par RémiONERA dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/07/2005, 07h58
  3. question sur le rafraichissement des données dans la base
    Par vbcasimir dans le forum Bases de données
    Réponses: 8
    Dernier message: 06/06/2005, 12h44
  4. question sur le comportement des threads
    Par rose-bonbon dans le forum CORBA
    Réponses: 4
    Dernier message: 27/10/2004, 18h00
  5. question sur le format des images ..
    Par vbcasimir dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 28/08/2003, 12h08

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