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

Améliorer un code en passant par une structure de fenêtre


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Améliorer un code en passant par une structure de fenêtre
    Bonjour tout le monde,

    Je lance un nouveau sujet car j'ai bientôt "fini" les fonctionnalités de mon projet d'algo que j'ai à réaliser et mon but est d'améliorer mon code, le rendre plus concis, et qu'il ne prenne pas 12000 lignes comme je le fais actuellement.

    Je résume la situation,je dois gérer les mémos et rendez-vous d'un calendrier représenté par des boutons, j'ai une fenêtre avec dedans 28 boutons, chaque bouton me renvoi vers une autre fenêtre qui me permet de choisir parmis 7 actions(ajouter modifier supprimer mémo et RDV et un affichage général de la journée) . Ces 7 actions nécessitent que je sache où est-ce que j'ai appuyé, donc pour chaque bouton, il y a une fonction créant la fenêtre avec les 7 choix, soit 28 fonctions identiques avec juste un détail qui change, de même pour les 7 boutons. Je vous fais pas un dessin, 28 boutons, avec pour chaque bouton entre 7 et 9 fonctions associées, ça fait un paquet de ligne.

    J'ai créé une structure qui comprends toute ma fenêtre mère, je souhaite transmettre l'information du bouton activé lors du click, à la seconde fenêtre fille, qui doit savoir quel bouton est sélectionné , pour savoir dans quel fichier texte écrire.

    Je veux donc passer de 28 boutons avec 7 ou 9 fonctions par bouton, à 28 boutons, et 7 ou 9 fonctions pour le tout,j'espère bien m'exprimer.

    Mes boutons sont dans un tableau, l'idéal serait de savoir quelle case du tableau de bouton a été activée pour que la saisie se fasse dans le bon fichier.

    Voila tout, j'ai essayé de regarder les gpointer data dans les callback mais je ne les comprends pas du tout, donc je n'arrive pas à les utiliser correctement et c'est surtout que je ne sais pas comment récupérer le bouton activé sur la fenêtre principale en sachant que je m'en sers dans la 2 ème fenêtre fille .

    Merci beaucoup à tous ceux qui m'aideront ou essaierons.

    Bonne journée à tous !

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Il y a une raison pour ne pas avoir utilisé GtkCalendar pour créer ton calendrier ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par liberforce Voir le message
    Il y a une raison pour ne pas avoir utilisé GtkCalendar pour créer ton calendrier ?
    Hum je ne sais pas du tout ce que c'est, on m'avait dit de regarder time.h, donc voila Apparemment cette partie m'aurais permis de faire un calendrier aussi, mais vu que je dois y mettre des rendez-vous, celui que j'ai déjà codé me permet de mettre les images que je veux Merci quand même

    Liberforce, le coup du int déguisé en pointer est exactement ce qu'il me faut, mais je n'arrive pas à comprendre comment ça marche, pourrais tu me donner un exemple ? Je ne vois pas comment récupérer le data, et encore moins l'histoire du déguisement d'int

    Mais c'est exactement ce dont j'ai besoin !

    Merci à vous deux . J'ai une autre question: pour l'affichage de mes rendez-vous, j'ai besoin de créer un nombre de checkbutton égal au nombre de rendez-vous, mais je n'arrive pas à faire un malloc avec le nombre dont j'ai besoin, pourriez vous m'aider?

    J'ai codé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pToggleBtn=(*pToggleBtn)malloc(2*sizeof(pToggleBtn));
    L'erreur sortie est :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur	1517	error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'malloc'	c:\users\j.maurice\desktop\projet algo\projet gtk+\projet gtk+\main.c	17243	projet gtk+

    Merci encore !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je viens de trouver un exemple , et j'ai testé, tout fonctionne ! Maintenant me reste plus qu'à voir si je peux passer plusieurs user-data dans un gsignal connect, comme ça je pourrais réduire la taille de mon code ( qui plafonne à 17000 lignes, et là je viens d'en enlever 1500...)

    Est-ce possible, de faire de même mais avec par exemple :

    Jour1 où j'initialise mon guint, une sous fonction supprRDV1, et la dernière où j'utilise le guint , supprRDV1complet?

    Parce que pour supprimer faut que je demande le nom d'abord, donc du coup je devrais le passer en paramètre dans deux fonctions avant de l'utiliser :S En sachant que je récupère avec le g_signal_connect, déjà par un user-data, le nom saisi dans le GTK entry .


    En tout cas merci beaucoup !
    Dernière modification par Invité ; 10/03/2012 à 15h16.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir ,

    Je met à votre disposition le code que j'ai réalisé, j'ai voulu essayer en passant par structure la fenêtre de saisie du nom à supprimer :

    fichier main.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
    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
    void SupprRDV1(GtkWidget *pButton, gpointer iContextId)
    {
    	Essai* essai;
    	essai=(Essai*)malloc(sizeof(Essai));
     
    	essai->iContextId1=iContextId;
        essai->pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(essai->pWindow), "Suppression d'un rendez-vous");
        gtk_window_set_default_size(GTK_WINDOW(essai->pWindow), 320, 200);
        g_signal_connect(G_OBJECT(pWindow), "leave", G_CALLBACK(gtk_main_quit), NULL);
     
    	essai->pVBox= gtk_vbox_new(TRUE, 0);
    	gtk_container_add(GTK_CONTAINER(essai->pWindow),essai->pVBox);
     
        /* Creation du GtkEntry */
        essai->pEntry = gtk_entry_new();
        /* Insertion du GtkEntry dans la GtkVBox */
        gtk_box_pack_start(GTK_BOX(essai->pVBox), essai->pEntry, TRUE, FALSE, 0);
     
        essai->pButton = gtk_button_new_with_label("Supprimer");
        gtk_box_pack_start(GTK_BOX(essai->pVBox), essai->pButton, TRUE, FALSE, 0);
     
        essai->pLabel = gtk_label_new("Saisir le nom du client (format: MAURICE J):");
        gtk_box_pack_start(GTK_BOX(essai->pButton), essai->pLabel, TRUE, FALSE, 0);
     
     
     
        /* Connexion du signal "clicked" du GtkButton */
        /* La donnee supplementaire est la GtkVBox pVBox */
        g_signal_connect(G_OBJECT(essai->pButton), "clicked", G_CALLBACK(SupprRDV1Confirme),(gpointer)essai);
     
        gtk_widget_show_all(essai->pWindow);
     
    }
    void SupprRDV1Confirme(GtkWidget *pButton, gpointer data)
    {
    	GtkWidget *pWindow;
    	GtkWidget *pVBox;
    	GtkWidget *pLabel1;
    	GtkWidget *pTempEntry;
        GtkWidget *pTempLabel;
    	GList *pList;
    	ELEVEUR eleveur;
    	const gchar* sText;
    	int fait=0,jour=date();
    	char nomFichier[20];
    	Essai* essai;
    	essai=(Essai*)malloc(sizeof(Essai));
    	essai=data;
     
    	sprintf(nomFichier,"RDV%d.txt",jourRDV(GPOINTER_TO_INT(essai->iContextId1),date()));
     
        /* Recuperation de la liste des elements que contient la GtkVBox */
    	pList = gtk_container_get_children(GTK_CONTAINER(essai->pVBox));
     
        /* Le premier element est le GtkEntry */
        pTempEntry = GTK_WIDGET(pList->data);
     
        /* Passage a l element suivant : le GtkButton */
        pList = g_list_next(pList);
     
        /* Passage a l element suivant : le GtkLabel */
        pList = g_list_next(pList);
     
        /* Cet element est le GtkLabel */
        pTempLabel = GTK_WIDGET(pList->data);
     
        /* Recuperation du texte contenu dans le GtkEntry */
        sText = gtk_entry_get_text(GTK_ENTRY(pTempEntry));
    	strcat(sText,"\n");
    	supprimer(sText,4,nomFichier,&fait);
     
    	// Creation de la fenêtre 
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Suppression RDV");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
    	g_signal_connect(G_OBJECT(pWindow), "leave", G_CALLBACK(gtk_main_quit), NULL);
     
    	// Creation de la GtkBox verticale 
        pVBox = gtk_vbox_new(TRUE, 0);
        // Ajout de la GtkVBox dans la fenetre 
        gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
     
    	if(fait==1)
    	{
    		pLabel1=gtk_label_new("Suppression effectuee");
    	}
    	else
    	{
    		pLabel1=gtk_label_new("Suppression impossible, le client ne doit pas exister, ou alors il a mal ete orthographie");
    	}
    	/* On ajoute le label a l'interieur de la fenetre */
    	gtk_box_pack_start(GTK_BOX(pVBox), pLabel1, TRUE, FALSE, 0);
     
    	 gtk_widget_show_all(pWindow);
     
        /* Liberation de la memoire utilisee par la liste */
        g_list_free(pList);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct
    {
    	 GtkWidget* pVBox;
    	 GtkWidget* pButton;
    	 GtkWidget* pEntry;
    	 GtkWidget *pLabel;
    	 GtkWidget *pWindow;
    	 guint iContextId1;
    }Essai;
    Mon problème est que je ne sais pas dans quel ordre je récupère les élements dans la liste. Du coup j'ai une erreur qui s'affiche et me dit que je tape dans le mauvais endroit niveau mémoire, ce qui est assez gênant.

    Auriez vous une idée du problème?

    Merci à tous.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Problème résolu, j'ai compris comment ça fonctionne

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par bobi42 Voir le message
    [...] je ne sais pas comment récupérer le bouton activé sur la fenêtre principale en sachant que je m'en sers dans la 2 ème fenêtre fille .
    Le bouton sur lequel tu as cliqué est le premier argument (button) de la callback du signal GtkButton::clicked.

    Tu peux alors utiliser gtk_button_get_label pour retrouver sur quel jour tu as cliqué en transformant la chaîne qui apparaît dans le bouton en nombre entier.

    Mais la manière la plus efficace de récupérer le n° du jour sera de passer à g_signal_connect, dans l'argument user_data, ce numéro de jour, quand tu te connectes au signal "clicked" du GtkButton. Normalement, user_data doit être un pointeur, mais tu peux utiliser GINT_TO_POINTER pour déguiser un entier (le n° de jour) en pointeur. Ensuite, dans ta callback, tu fais l'opération inverse, et tu récupères la valeur de user_data avec GPOINTER_TO_INT qui lui enlèvera son déguisement... Tu n'as alors besoin que d'une unique callback pour tous les jours.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 01/05/2007, 21h46
  2. Réponses: 2
    Dernier message: 30/03/2007, 14h42
  3. Réponses: 3
    Dernier message: 30/03/2007, 10h38
  4. [Oracle] Insertion d'un blob en passant par une procédure stockée
    Par choubiroute dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 18h34
  5. Réponses: 12
    Dernier message: 21/10/2005, 14h35

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