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 :

Problèmes ... listes, index, ....


Sujet :

GTK+ avec C & C++

  1. #1
    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 Problèmes ... listes, index, ....
    Bonjour,


    Je m'amuse un peu avec GTK+ histoire de passer le temps et pour ca je me fait mon notepad perso mais avec affichage en onglets des fichiers ouverts !

    J'ai un problème lors de la suppression d'onglet, ou de suppression des informations des onglets que je stock dans une GList, chaque onglet a donc une petite structure allouée dynamiquement lors de la creation de l'onglet.

    Voici la fonction de suppression d'onglets:

    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 gui_remove_current_tab (GtkWidget * p_notebook)
    {
       struct   file_tab    *  p_tab   = NULL;
       gint                    i_index = -1;
       gboolean                b_ret   = FALSE;
     
     
       /*
        * On recupere l'index de l'onglet courant.
        */
       i_index = gui_get_current_tab_index (p_notebook);
     
       if (i_index >= 0)
       {
          /*
           * On verifie si le fichier a ete change ou pas.
           */
          b_ret = gui_get_file_modified (i_index);
     
          if (b_ret)
          {
             /*
              * Afficher un message indiquant que le fichier a ete modifie
              * et demande s'il doit etre enregistre.
              */
          }
     
     
          /*
           * Suppression de la structure dans la liste.
           */
          p_tab = (struct file_tab *) g_list_nth_data (p_tab_list, i_index);
          g_free (p_tab);
          g_list_remove_link (p_tab_list, g_list_nth (p_tab_list, i_index));
     
     
    printf ("Nombre d'elements dans la liste: %d\n", g_list_length (p_tab_list));
    printf ("Nombre d'onglets ouverts: %d\n", gtk_notebook_get_n_pages (GTK_NOTEBOOK (p_notebook)));
     
     
          /*
           * Suppression de l'onglet.
           */
          gtk_notebook_remove_page (GTK_NOTEBOOK (p_notebook), i_index);
       }
    }
    et voici un ptit test pendant la suppression d'onglets, vous pouvez voir deja un decallage des chiffres, je ne sais pas d'où ca viens mais le plus important reside dans le fait que certaines infos sont erronées au bout d'un moment comme là, dans le nombre d'éléments dans la liste:

    Nombre d'elements dans la liste: 7
    Nombre d'onglets ouverts: 8
    Nombre d'elements dans la liste: 6
    Nombre d'onglets ouverts: 7
    Nombre d'elements dans la liste: 5
    Nombre d'onglets ouverts: 6
    Nombre d'elements dans la liste: 4
    Nombre d'onglets ouverts: 5
    Nombre d'elements dans la liste: 3
    Nombre d'onglets ouverts: 4
    Nombre d'elements dans la liste: 71
    Nombre d'onglets ouverts: 3
    Nombre d'elements dans la liste: 2
    Nombre d'onglets ouverts: 2
    Je ne sais pas d'où ca viens, lorsque cela arrive, la suppression du prochain onglet entraine l'arret immédiat du programme, je suis un peu perdu j'dois dire !
    J'ai pû remarquer que cela arrive surtout lorsque je supprime le premier onglet donc egalement le premier élément de la GList !


    Merci pour vos lumières

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par CSoldier
    Je m'amuse un peu avec GTK+ histoire de passer le temps et pour ca je me fait mon notepad perso mais avec affichage en onglets des fichiers ouverts !
    Je vois que l'on a les mêmes idées, sauf que le mien fonctionne

    Pour te simplifier la vie, tu peux garder un pointeur sur la strucuture correspondante au fichier dont l'onglet est actif (ou NULL si aucun document est ouvert)

    Citation Envoyé par CSoldier
    vous pouvez voir deja un decallage des chiffres,
    Normal, tu supprime un élément de la liste, tu affiche le message et seulement après tu supprime l'onglet !

    Tu semble avoir un beau comportement indéfini S'il n'y a pas trop de code, join les fichiers, sinon je peux te passer le code de mon éditeur ou un gestionnaire de mémoire, pénible à mettre en place en plein milieu du projet mais qui vérifie les allocations/désalocations et les débordements (le log est très long)

  3. #3
    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 gege2061
    Normal, tu supprime un élément de la liste, tu affiche le message et seulement après tu supprime l'onglet !

    Tu semble avoir un beau comportement indéfini S'il n'y a pas trop de code, join les fichiers, sinon je peux te passer le code de mon éditeur ou un gestionnaire de mémoire, pénible à mettre en place en plein milieu du projet mais qui vérifie les allocations/désalocations et les débordements (le log est très long)
    Ah erf, j'avais pas vu que j'affichais les message entre deux opérations
    Bon passons, en fait c'est juste pour un amusement personnel puis pour garder un peu la main sur GTK+.
    Te remercies pour la proposition mais je prefere tout faire moi même
    Pour la quantité de code, ca commence à devenir un peu gros tout de même, je te join la fonction de création d'un onglet, peut-être que l'erreur se situe là mais je vois pas où alors:

    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
    gboolean gui_create_file_tab (GtkWidget * p_notebook,
                                  gchar * s_filename,
                                  gchar * s_buffer)
    {
       struct file_tab   *  p_file_tab     = NULL;
       gchar             *  s_title        = NULL;
       GtkTextBuffer     *  p_text_buffer;
       GtkTextIter          iter_start;
     
     
       /*
        * Allocation de la structure.
        */
       p_file_tab = g_malloc (sizeof (* p_file_tab));
     
       if (! p_file_tab)
       {
          ERROR_MSG ("Impossible d'allouer l'espace pour un nouvel onglet !");
          return FALSE;
       }
     
     
       /*
        * Creation des barre de defilement.
        */
       p_file_tab->p_scrolled = gtk_scrolled_window_new (NULL, NULL);
       gtk_widget_show (p_file_tab->p_scrolled);
     
       gtk_scrolled_window_set_policy (
          GTK_SCROLLED_WINDOW (p_file_tab->p_scrolled),
          GTK_POLICY_AUTOMATIC,
          GTK_POLICY_AUTOMATIC);
     
     
       /*
        * Creation et mise en place de la zone de texte.
        */
       p_file_tab->p_text_view = gtk_text_view_new ();
       gtk_widget_show (p_file_tab->p_text_view);
     
       gtk_scrolled_window_add_with_viewport (
          GTK_SCROLLED_WINDOW (p_file_tab->p_scrolled),
          p_file_tab->p_text_view);
     
     
       /*
        * Creation du label pour l'onglet.
        */
       p_file_tab->p_label = gtk_label_new (NULL);
       gtk_widget_show (p_file_tab->p_label);
     
     
       /*
        * Remplissagle du label.
        */
       if (s_filename)
       {
          /*
           * Affichage du nom du fichier dans l'onglet.
           */
          s_title = strrchr (s_filename, G_DIR_SEPARATOR);
          s_title [0] = ' ';
          gtk_label_set_text (GTK_LABEL (p_file_tab->p_label), s_title);
     
     
          /*
           * Insertion du buffer dans la zone de texte.
           */
          p_text_buffer = gtk_text_view_get_buffer (
             GTK_TEXT_VIEW (p_file_tab->p_text_view));
     
          gtk_text_buffer_get_start_iter (
             GTK_TEXT_BUFFER (p_text_buffer),
             &iter_start);
     
          gtk_text_buffer_insert (
             p_text_buffer,
             &iter_start,
             s_buffer,
             -1);
       }
       else
       {
          i_new_file++;
     
          s_title = g_strdup_printf ("Sans titre - %d", i_new_file);
          gtk_label_set_text (GTK_LABEL (p_file_tab->p_label), s_title);
          p_file_tab->s_filename = NULL;
     
          g_free (s_title);
       }
     
     
       /*
        * Remplissage du reste de la structure.
        */
       p_file_tab->s_filename = s_filename;
       p_file_tab->b_modified = FALSE;
     
     
       /*
        * Ajout de l'onglet.
        */
       gtk_notebook_append_page (GTK_NOTEBOOK (p_notebook),
                                 p_file_tab->p_scrolled,
                                 p_file_tab->p_label);
     
     
       /*
        * Ajout de la structure dans la liste chainee.
        */
       p_tab_list = g_list_append (p_tab_list, (struct file_tab *)p_file_tab);
     
     
       return TRUE;
    }

  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
    Bon, après quelques tests, je viens de remarquer que le problème viens lors de la suppression du 1° onglet et de ce fait du 1° élement de la liste alors qu'il y'a plus d'un onglet d'ouvert, quand c'est le seul qui reste, cela fonctionne sans le moindre problème, voici la fonction de suppression un peu modifiée, ca progresse tout doucement, apparement c'est la seule erreur résidente

    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
    void gui_remove_current_tab (GtkWidget * p_notebook)
    {
       struct   file_tab    *  p_tab   = NULL;
       gint                    i_index = -1;
       gboolean                b_ret   = FALSE;
     
     
       /*
        * On recupere l'index de l'onglet courant.
        */
       i_index = gui_get_current_tab_index (p_notebook);
     
       if (i_index >= 0)
       {
          /*
           * On verifie si le fichier a ete change ou pas.
           */
          b_ret = gui_get_file_modified (i_index);
     
          if (b_ret)
          {
             /*
              * Afficher un message indiquant que le fichier a ete modifie
              * et demande s'il doit etre enregistre.
              */
          }
     
     
          /*
           * Suppression de la structure dans la liste.
           */
          p_tab = (struct file_tab *) g_list_nth_data (p_tab_list, i_index);
          g_free (p_tab);
     
          if (g_list_length (p_tab_list) > 1)
          {
             g_list_remove_link (p_tab_list, g_list_nth (p_tab_list, i_index));
          }
          else
          {
             g_list_free (p_tab_list);
             p_tab_list = NULL;
          }
     
     
          /*
           * Suppression de l'onglet.
           */
          gtk_notebook_remove_page (GTK_NOTEBOOK (p_notebook), i_index);
     
     
    printf ("Nombre d'elements dans la liste: %d\n", g_list_length (p_tab_list));
    printf ("Nombre d'onglets ouverts: %d\n", gtk_notebook_get_n_pages (GTK_NOTEBOOK (p_notebook)));
       }
    }

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par CSoldier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       /*
        * Allocation de la structure.
        */
       p_file_tab = g_malloc (sizeof (* p_file_tab));
     
       if (! p_file_tab)
       {
          ERROR_MSG ("Impossible d'allouer l'espace pour un nouvel onglet !");
          return FALSE;
       }
    Inutile, g_malloc met fin au programme si l'allocation échoue, elle renvoi NULL que si la taille demandée vaut 0.


    Citation Envoyé par CSoldier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       gtk_widget_show (p_file_tab->p_scrolled);
    Fait plutôt un gtk_widget_show_all à la fin de la fonction

    Citation Envoyé par CSoldier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       gtk_scrolled_window_add_with_viewport (
          GTK_SCROLLED_WINDOW (p_file_tab->p_scrolled),
          p_file_tab->p_text_view);
    Inutile de faire un ajout avec viewport, les GtkTextView supportent les barres de défilement de façon native, suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       gtk_container_add (
          GTK_CONTAINER (p_file_tab->p_scrolled),
          p_file_tab->p_text_view);
    Citation Envoyé par CSoldier
    [code] s_title = strrchr (s_filename, G_DIR_SEPARATOR);
    s_title [0] = ' ';
    gtk_label_set_text (GTK_LABEL (p_file_tab->p_label), s_title);
    Regarde du côté de la glib : g_base_name !


    Citation Envoyé par CSoldier
    [code]g_list_remove_link
    Pourquoi pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GList*      g_list_remove                   (GList *list,
                                                 gconstpointer data);
    Mais rien de très grave

  6. #6
    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 gege2061
    Pourquoi pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GList*      g_list_remove                   (GList *list,
                                                 gconstpointer data);
    Mais rien de très grave
    En fait ca marche mieux avec g_list_remove_link car ca me permet de supprimer un élément d'après son index et non pas par rapport au type de la donnée qu'il contient (g_list_remove) !

    Merci pour les autres ptites infos

  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
    Où as-tu vus g_base_name, j'arrive pas à mettre la main dessus

  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 : 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
    Problème résolu, en fait dans ma suppression:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_list_remove_link (p_tab_list, g_list_nth (p_tab_list, i_index));
    j'avais pas mis le pointeur de la liste en affectation comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p_tab_list = g_list_remove_link (p_tab_list, g_list_nth (p_tab_list, i_index));
    Halala des fois, mieux vaut rester au lit ... mais je ne trouve toujours pas ta fonction g_base_name, même en recherche sur Google ca ne rien de rien ... si tu pouvais m'indiquer où tu l'as vu se serais sympa

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par CSoldier
    Où as-tu vus g_base_name, j'arrive pas à mettre la main dessus
    C'était g_basename mais elle est obsolète, il faut utiliser g_path_get_basename.

    Citation Envoyé par CSoldier
    En fait ca marche mieux avec g_list_remove_link car ca me permet de supprimer un élément d'après son index et non pas par rapport au type de la donnée qu'il contient (g_list_remove) !
    C'est pratique lorsque tu as un pointeur sur le document courrant, suffit de lui passer ce pointeur (pas besoin de recalculer l'index de la page) !

  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 : 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 gege2061
    C'est pratique lorsque tu as un pointeur sur le document courrant, suffit de lui passer ce pointeur (pas besoin de recalculer l'index de la page) !
    Oui c'est sûr, j'avais pas vu ca comme ca, je verais ca plus tard

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. zone de liste index ?
    Par samtheh dans le forum VBA Access
    Réponses: 4
    Dernier message: 25/06/2007, 11h06
  2. Rafraichir mes listes déroulante
    Par Trosky dans le forum IHM
    Réponses: 1
    Dernier message: 07/05/2007, 11h37
  3. list index out of range
    Par watcha2020 dans le forum Général Python
    Réponses: 2
    Dernier message: 29/06/2006, 09h59
  4. [CSS] Améliorer mes listes ul li
    Par barthoose dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 13/09/2005, 23h14

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