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

wxWidgets Discussion :

Récupérer une valeur à partir de la souris dans un ListCtrl


Sujet :

wxWidgets

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut Récupérer une valeur à partir de la souris dans un ListCtrl
    Bonjour à tous, je suis actuellement en stage pour développer un logiciel utilisant les wxwidgets.
    Voici donc une de mes questions :

    J'ai créé un ListCtrl dans une classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      InsertColumn(0,_("Numéro du puits"),wxLIST_FORMAT_CENTER,150);
      InsertColumn(1,_("Durée de l'analyse"),wxLIST_FORMAT_CENTER,150);
      InsertColumn(2,_("Temps"),wxLIST_FORMAT_CENTER,100);
      InsertColumn(3,_("Valeur"),wxLIST_FORMAT_CENTER,100);
      InsertColumn(4,_("Dérivée première"),wxLIST_FORMAT_CENTER,200);
      InsertColumn(5,_("Dérivée seconde"),wxLIST_FORMAT_CENTER,200);
      InsertColumn(6,_("Température"),wxLIST_FORMAT_CENTER,100);
    L'ouverture d'un onglet va ajouter une ligne dans ma liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          listeStats->InsertItem(0,numeroPuits);
          listeStats->SetItem(donnees,6,temperature);
    Maintenant j'aimerai que lorsque je clique sur une ligne, il m'affiche l'onglet correspondant aux données de la ligne, sur le numéro du puits. Mon premier problème se situe pour récupérer la valeur d'un item, pour le moment j'ai cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void LysisTimerFrame::OnSelectionListe(wxListEvent& event)
    {
      wxString contenuCellule;
      obtenirDonnees(1,0,contenuCellule);
      wxMessageBox(_("Numéro du puits sélectionné :") +contenuCellule);
    }
    Avec pour la méthode obtenirDonnees( numéro de ligne, numéro de colonne, et les données). Seulement là,j'aurai à chaque double clic sur la liste, l'item correspondant à la 2e ligne. Comment faire, pour changer cette valeur de façon dynamique, avec un évenement souris qui passerait le paramètre de la ligne sélectionnée ?

    Merci d'avance

  2. #2
    Membre chevronné Avatar de wxXav
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Décembre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur amateur

    Informations forums :
    Inscription : Décembre 2008
    Messages : 214
    Par défaut
    Salut.

    Si tu veux gérer le double-clic, il faut passer par l'événement "EVT_LIST_ITEM_ACTIVATED".
    Ça évitera d'avoir a gérer la sélection ou la dé-sélection en même temps.

    Ensuite, il te suffit de récupérer l'index de l'élément concerné avec "wxListEvent::GetIndex()" et le tour est joué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void LysisTimerFrame::OnSelectionListe(wxListEvent& event)
    {
      wxString contenuCellule;
      obtenirDonnees(event.GetIndex(),0,contenuCellule);
      wxMessageBox(_("Numéro du puits sélectionné :") +contenuCellule);
    }
    @+
    Xav'

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut
    C'est bien l'évenement que j'ai utilisé, merci, je ne connaissais pas la fonction GetIndex, et là ca marche nickel

    Du coup, une autre question ( rassure toi, je ne vais pas te demander de faire le projet à ma place, mais au bout de 2 jours de recherches, je laisse un peu tomber), j'ai donc mes onglets qui sont ouverts et en cliquant sur une ligne, je voudrai que l'onglet correspondant au numéro du puits s'affiche. J'ai déjà codé en gros ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void LysisTimerFrame::CreationOnglet()
    {
        onglet *creationOnglet = new onglet(this);
        creationOnglet->nomPage.Append(_(",puits: "));
        creationOnglet->nomPage.Append(numeroPuits);
        premierePage->AddPage(creationOnglet,creationOnglet->nomPage,true);
    }
    et dans ma classe d'onglet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void onglet::createControls()
    {
      static int numeroPage = 1;
      wxString numPage = wxString::Format(wxT("%i"),(int)numeroPage);
      nomPage = _("Fichier ");
      nomPage.Append(numPage);
     
      numeroPage += 1;
     
    }
    Mais dans tout ca, je ne pense pas avoir utilisé une variable pour identifier un onglet spécifique ayant un lien avec un numéro de puits, du style que le 2e onglet ouvert sera correspondant à la 2e ligne dans mon textctrl.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          listeStats->InsertItem(donnes,0,numeroPuits);
          listeStats->SetItem(donnees,6,temperature);
    Merci encore

    EDIT : c'est bon j'ai trouvé, j'ai rajouté une colonne "index" pour trouver le numéro de l'onglet, et utilise SetSelection(), maintenant je m'attaque à la suppression d'une ligne dans le listCtrl lors de la fermeture de l'onglet correspondant...

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut
    Du coup je comprends pas trop la documentation des évenements de l'auinotebook :

    EVT_AUINOTEBOOK_PAGE_CLOSED(winid, fn):

    winid représente quoi ? car j'utilise des panel pour créer des onglets, je vois pas trop comment intercepter l'évenement et aussi je saisi pas la signification de "fn".
    Jusqu'à maintenant j'avais que des macros du style (id,func)

  5. #5
    Membre chevronné Avatar de wxXav
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Décembre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur amateur

    Informations forums :
    Inscription : Décembre 2008
    Messages : 214
    Par défaut
    Pour être franc, je n'ai jamais utilisé les wxAui.

    Malgré tout, il ne me semble pas voir, dans la macro que tu présentes, une grand différence par rapport aux macros des autres contrôles "normaux", mis à part les noms des paramètres :

    EVT_AUINOTEBOOK_PAGE_CLOSED(winid, fn) :
    • winid correspond à l'id du contrôle wxAuiNotebook
    • fn correspond à la fonction à appeler quand cet événement est rencontré


    C'est à mon avis une simple erreur de suivi des conventions dans les noms des paramètres.

    @+
    Xav'

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut
    Je suis parti de ce principe, mais je suis un peu perdu...

    Je veux créer plusieurs onglets, je fais appel à mon constructeur onglet qui dérive de wxPanel et je définis à chaque onglet un id et je l'affiche :

    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
     
    void LysisTimerFrame::CreationOnglet()
    {
     
        static int idOnglet = 0;
     
        onglet *creationOnglet = new onglet(this);
     
        wxString valeurid;
     
        creationOnglet->SetId(idOnglet);
        int valeur = creationOnglet->GetId();
        valeurid << valeur;
     
        creationOnglet->nomPage.Append(_(",puits: "));
        creationOnglet->nomPage.Append(numeroPuits);
        premierePage->AddPage(creationOnglet,creationOnglet->nomPage,true);
        idOnglet +=1;
        wxMessageBox(_("Numéro de l'id :" + valeurid));
    }
    Du coup j'ai déclaré dans mon .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    enum
    {
       idOnglet
    }
    et dans ma table d'événements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EVT_AUINOTEBOOK_PAGE_CLOSED(idOnglet, LysisTimerFrame::OnFermerOnglet)
    Je dois pas être sur la bonne piste, car je ne fais jamais appel à mon évenement PAGE_CLOSED lors de la fermeture d'un onglet

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut
    Je dois créer une base de données de patients. Par analogie avec des dossiers médicaux, je souhaite faire une structure renseignant nom prenom sexe... sur chaque patient que l'utilisateur va entrer via un formulaire.

    J'ai donc créé ma structure, mais si j'appelle à chaque fois ma fonction, il va écraser systématiquement les données que j'avais entré précédemment. En gros je suppose, qu'il va falloir créer un tableau de ma structure, mais aussi que ce tableau soit dynamique, qu'il ajoute une case mémoire à chaque appel à la boucle.

    Je sais pas si c'est mieux expliqué

  8. #8
    Membre chevronné Avatar de wxXav
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Décembre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur amateur

    Informations forums :
    Inscription : Décembre 2008
    Messages : 214
    Par défaut
    Salut.

    C'est bien ce que j'avais compris en fait.

    La solution est toute simple : tu peux utiliser une wxList (c'est l'implémentation wxWidgets d'une liste chainée).
    Tu pourras y ajouter dynamiquement des éléments, y accéder, les supprimer, ...

    Regarde l'aide à ce sujet (http://docs.wxwidgets.org/stable/wx_wxlist.html), et éventuellement, si tu veux un projet complet qui l'utilise, il y a celui-là : http://www.wxdev.fr/projet9-wxToDoList.html (le projet est un peu complexe, mais il marche à merveille).

    Si tu as besoin de plus d'infos, n'hésites pas (j'essayerais éventuellement de trouver le temps de te concocter quelque chose de plus simple utilisant les wxList

    @+
    Xav'

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut
    Merci Xav, je vais regarder cette solution , la solution des liste chainées me faisait peur car elle ravivaient des vieux souvenirs de fac en C, mais si y a un widegets qui joue ce rôle, je veux bien me pencher dessus

    EDIT : en fait pas la peine de se casser la tête la dessus, je ne m'occupe pas de cette partie là...

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut
    Hop, de retour

    J'ai un nouveau problème, dans mon formulaire de données, il faut que si l'utilisateur remplit des champs, et que s'il fait une mauvais manipulation ( appuie sur echap, ou clique sur Annuler ) une boite de dialogue s'affiche lui notifiant que des champs ont été saisi, et qu'il peut confirmer ou infirmer son choix de quitter la boite de dialogue. Je suppose qu'il doit s'agir d'un évenement...

  11. #11
    Membre chevronné Avatar de wxXav
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Décembre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur amateur

    Informations forums :
    Inscription : Décembre 2008
    Messages : 214
    Par défaut
    Salut.

    Effectivement, il s'agit d'un événement à intercepter.

    Il faut gérer l'événement "clic sur le bouton Annuler" (le fait d'appuyer sur Echap ou de fermer la boite de dialogue seront également interceptés).

    Dans la méthode événementielle, tu demandes confirmation, et si l'utilisateur veut bien fermer, tu n'as plus qu'à appeler EndModal(wxID_CANCEL).

    @+
    Xav'

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/12/2013, 11h46
  2. Récupérer une valeur à partir d'un datatable
    Par asmaSassou dans le forum JSF
    Réponses: 14
    Dernier message: 04/05/2012, 14h05
  3. [MySQL] Récupérer une valeur à partir d'une liste select
    Par xymagic dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 15/11/2011, 11h22
  4. Réponses: 1
    Dernier message: 28/10/2011, 10h32
  5. Réponses: 2
    Dernier message: 17/06/2005, 13h38

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