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 :

Lier un widget (GtkEntry) à un enregistrement d'une bdd (Sqlite3)


Sujet :

GTK+ avec C & C++

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut Lier un widget (GtkEntry) à un enregistrement d'une bdd (Sqlite3)
    Bonjour,

    Je cherche une solution pour lier un widget GtkEntry à un enregistrement d'une base de donnée (Sqlite3).
    Mon programme est codé en C.

    Prenons un exemple.

    -J'ai une bdd avec une seule table "t_fruits" qui est composée de deux champs "id" et "designation".
    -Une fonction de mon programme rempli un tableau de caractères à trois colonnes avec en première colonne les indices du tableau (1,2,3,4,...) et ensuite le contenu de ma table "t_fruits".
    -Une autre fonction affiche le contenu du tableau dans différents champs texte (GtkEntry) dans la fenêtre de mon programme :

    Indice tab | Id | Designation
    ----------------------------------------------------
    1 | 1 | Pomme
    2 | 2 | Banane
    3 | 8 | Poire
    4 | 23 | Framboise

    Si je double clique dans le champs texte où est écrit "Poire", je voudrais que mon programme sache que ce champ texte correspond à la ligne d'indice 3 de mon tableau de caractère. Je pourrai donc ensuite récupérer l'Id de mon enregistrement (c'est-à-dire 8) pour travailler dessus.

    Si cela peut aider quelqu'un, sous Ms Access, chaque champ texte a un identifiant unique qui nous permet d'appeler ce champ dans le code VBA.
    Je cherche quelque chose du même type.

    Je ne sais absolument pas vers quoi me diriger.

    Avez-vous une piste à me conseiller ? Une fonction ? Mon raisonnement est-il mauvais ?

    J'espère que mon post est assez compréhensible. N'hésitez pas à demander plus d'informations si besoin.

    Merci d'avance.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Un GtkEntry hérite d'un GtkWidget. Un GtkWidget hérite d'un GObject.

    Il existe une possibilité avec les GObject rarement utilisée. Il disposent d'un tableau associatif libre dans lequel on ajoute des données personnelles. Ce tableau est accessible via les fonctions g_object_set_data (); (ou sa variante g_object_set_data_full();) et g_object_get_data();.

    Tu peux donc ajouter tes indices à chaque GtkEntry et ainsi connaître à tout moment leur position dans table.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    Bonjour,

    Je vais me pencher sur votre solution mais si d'après vous c'est rarement utilisé, quelle est donc la manière de faire "générale" pour afficher le contenu d'une table d'une bdd (sqlite3 ou autre) dans une fenêtre de mon programme tout en permettant par double clique sur un champ de remonter au bon enregistrement ?

    Imaginons une liste de fruits avec leur taille , poids, couleur, ... affichée à partir d'une bdd.
    Si je double clique sur "jaune" sur la ligne de "banane" pour pouvoir modifier l'enregistrement dans ma bdd, quel est donc le "shéma" le plus courant pour faire ça ?

    Exécuter la requête pour modifier le champ ne me pose pas de problème. Savoir quel est l'identifiant de l'enregistrement sur lequel je viens de double cliquer est mon problème.

    En espérant que je vous me compreniez...

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    En général on utilise un GtkTreeView avec un GtkListore. Il est possible de créer une (ou plusieurs) colonne invisible à l'utilisateur qui contiennent l'information que tu veux.

    Mais ce n'est pas parce que les userdata des GObject ne sont pas couramment utilisés (surtout par les lecteurs de ce forum) qu'ils sont à proscrire. La difficulté inhérente à leur utilisation est que le code source est difficile à comprendre pour un tiers.

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    Je vais étudier les deux pistes avant de prendre ma décision.

    Cependant, je me pose une question à propos des GtkTreeView.

    Je viens de survoler la doc et je vois qu'ils héritent de GtkContainer puis de GtkWidget.
    Les GtkEntry quant à eux héritent directement de GtkWidget.
    Cela implique-t-il donc qu'on ne peut pas placer un GtkEntry dans un GtkTreeView ?

    Je demande cela car j'ai l'impression qu'avec un GtkTreeView on est obligé d'avoir un affichage du style d'une "grille" ou d'un "tableur", comme ceci :

    Pièce jointe 143602

    Je voudrai plutôt quelque chose comme une grille de champs textes espacés les uns des autres, de ce style là :

    Pièce jointe 143600



    Est-ce possible avec un GtkTreeView sans être trop lourd à mettre en place ?

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Je prendrais un GtkGrid avec des GtkEntry pour obtenir ce que tu cherches. Mais ce n'est que mon avis...

  7. #7
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut
    Bonjour,

    Je crois qu'il ne faut pas se tromper sur le sens qu'il faut donner au mot "hiérarchie": dans la documentation, il s'agit de l'héritage des propriétés.
    En clair, quand tu crée une GtkEntry ou un GtkTreeView, comme tous les deux des héritent de GtkWidget, tous les deux possèdent les propriétés de GtkWidget (par exemple "visible").

    Le "packing" des objets lui, permet de calculer la position et la taille des objets: il définit une arborescence distincte de la précédente.
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Je prendrais un GtkGrid avec des GtkEntry pour obtenir ce que tu cherches. Mais ce n'est que mon avis...
    C'est exactement ce que je fais actuellement. Quand je lance mon programme, des GtkEntry sont créés dynamiquement dans un GtkGrid en fonction du nombre d'enregistrement dans ma table.

    Mais une fois la grille remplie, je n'ai plus aucun moyen de différencier les GtkEntry. Par conséquent, aucun moyen de remonter à l'identifiant de mon enregistrement si je double clique sur un GtkEntry. Il est donc impossible d'envoyer une requête à la bdd pour modifier un enregistrement ou pour le supprimer.

    Voilà pourquoi je cherche une solution pour "lier" d'une manière ou d'une autre des GtkEntry entre eux pour pouvoir remonter à la première colonne (qui est invisible) de GtkGrid qui contient les identifiants de mes enregistrements.

  9. #9
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut
    Tu cherche à ce que chaque case de la grille se comporte comme un GtkButton: il suffit donc de la définir comme un tableau de GtkButton et de se servir de la propriété suivante:
    The GtkButton widget can hold any valid child widget. That is it can hold most any other standard GtkWidget. The most commonly used child is the GtkLabel.
    Tu dois pouvoir remplacer le GtkLabel par un GtkEntry et utiliser le signal "clicked" du GtkButton.

    P;S. Si seul le numero de ligne t'intéresse, le couple GtkListStore/GtkTreeSelection est sans doute préférable.
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    P;S. Si seul le numero de ligne t'intéresse, le couple GtkListStore/GtkTreeSelection est sans doute préférable.
    Cela me va très bien mais dans ce cas je tiens quand même à savoir si ce que je demandais quelques posts plus haut (numéro 5 exactement) est possible ou non. A savoir afficher un GtkTreeView comme une grille de champs texte et non pas comme un tableur. Je parle uniquement d'affichage ici.

    Après quelques essais, un GtkTreeView à l'air de bien faire ce que je veux. La seule chose qui me dérange, c'est son affichage "tableur".

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    Bon, après avoir survolé les différentes solutions que vous m'avez proposé, j'opte pour un GtkTreeView. Tant pis pour l'affichage. C'est assez pratique à utiliser une fois qu'on a compris le fonctionnement.

    Merci à vous deux.

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

Discussions similaires

  1. [WD10] Récupérer le num d'enregistrement dans une BDD HF
    Par lepirate dans le forum WinDev
    Réponses: 7
    Dernier message: 11/07/2009, 17h59
  2. [WD10] Connaitre le numéro d'enregistrement dans une BDD HF ?
    Par lepirate dans le forum WinDev
    Réponses: 3
    Dernier message: 27/06/2009, 18h33
  3. Incrémenter une lettre pour enregistrement dans une bdd
    Par baggie dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/03/2008, 16h26
  4. Réponses: 2
    Dernier message: 17/04/2007, 11h44
  5. [C#] Supprimer un enregistrement dans une BDD
    Par Filippo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 18/07/2006, 12h02

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