|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||||
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
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 :
Code :
Code :
Merci d'avance |
||||||
|
|
00
|
|
|
#2 | ||
|
Membre confirmé
![]() Xavier PerrissoudDéveloppeur amateur Inscription : décembre 2008 Messages : 135 ![]() |
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 :
Xav' |
||
|
|
10
|
|
|
#3 | ||||||
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
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 :
Code :
Code :
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...
|
||||||
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
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) |
|
|
00
|
|
|
#5 |
|
Membre confirmé
![]() Xavier PerrissoudDéveloppeur amateur Inscription : décembre 2008 Messages : 135 ![]() |
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) :
C'est à mon avis une simple erreur de suivi des conventions dans les noms des paramètres. @+ Xav' |
|
|
10
|
|
|
#6 | ||||
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
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 :
et dans ma table d'événements : Code :
|
||||
|
|
00
|
|
|
#7 |
|
Membre confirmé
![]() Xavier PerrissoudDéveloppeur amateur Inscription : décembre 2008 Messages : 135 ![]() |
En fait, il ne s'agit pas de l'id de l'onglet, mais de celui du notebook.
Et avec le paramètre wxAuiNotebookEvent, tu pourras récupérer l'index de la nouvelle page sélectionnée ( GetSelection() ), et éventuellement celui qui était sélectionné avant le changement ( GetOldSelection() ) si tu as besoin d'annuler l'événement. |
|
|
00
|
|
|
#8 | ||
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
Ok, forcément ca pouvait pas marcher.
Voilà comment je l'utilise : Code :
Ici, j'ai bien la capture de l'évenement, seulement getSelection me renvoie l'emplacement de l'onglet dans le sizer, donc le 1er onglet à une valeur de -1, le deuxième de 0 et le plus à droite aura la valeur max. Quand je ferme un onglet, l'onglet de droite prendra la valeur de celui qui a été fermé, ce qui fausse un peu la donne. 2 semaines que les widgets sont entrés dans ma vie, et ca fait mal... EDIT : en fait c'est plus compliqué que ça. En soit, ce problème n'en est pas un. Le plus embêtant et que si je supprime un onglet ainsi que la ligne, et que j'ai un ID pour un onglet d'une valeur = 4 par exemple, et que je n'ai plus que 3 onglets d'ouverts, si je clique sur la listctrl de l'onglet à la valeur 4, il ne me trouvera pas l'onget même s'il est ouvert. Bref, je ne t'embête pas plus longtemps, ca me semble tordu, je vais essayer de voir ca, merci pour ton aide, je reviendrai bien assez tôt |
||
|
|
00
|
|
|
#9 | ||
|
Membre confirmé
![]() Xavier PerrissoudDéveloppeur amateur Inscription : décembre 2008 Messages : 135 ![]() |
En fait, je verrai plus quelque chose comme :
Code :
Si jamais, tu peux peut-être passer par l'événement "EVT_AUINOTEBOOK_PAGE_CLOSE" plutôt que "EVT_AUINOTEBOOK_PAGE_CLOSED" (c'est juste une piste de recherche que je te donne, pas une solution). Tu peux éventuellement ajouter une valeur "ClientData" aux éléments de ton wxListCtrl afin de pouvoir stocker un état "Onglet ouvert/fermé". @+ Xav' |
||
|
|
10
|
|
|
#10 | ||
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
Après quelques essais infructueux, on m'a dit que la solution est de faire passer un paramètre à ma fonction de création d'onglet. Donc pour chaque onglet créé, je définit un numéro d'index. Puis ensuite lorsque je clique dans ma liste de contrôle, il faut que je fasse une boucle for qui va me passer les onglets ouverts et comparer la valeur que je lui ai donné dans ma liste de contrôle. Si la comparaison est bonne, ca retournera l'onglet...
Après l'écrire c'est autre chose EDIT: voilà y a du neuf : Code :
|
||
|
|
00
|
|
|
#11 | ||
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
J'ai encore des soucis, mais il est complétement différent celui là :
J'ai créer des textctrl pour que l'utilisateur remplisse les différentes informations d'une personne dans un wxDialog, puis je récupère les infos dans ma Frame principale. J'ai donc créé une structure comportant mes variables. Si je créé plusieurs personnes, comment éviter la perte des données des autres personnes et aussi comment pourrais je accéder aux infos d'une personne particulière. Code :
|
||
|
|
00
|
|
|
#12 |
|
Membre confirmé
![]() Xavier PerrissoudDéveloppeur amateur Inscription : décembre 2008 Messages : 135 ![]() |
Hello
J'avoue ne pas trop comprendre quel est ton problème. Peux-tu être plus précis, stp. @+ Xav' |
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
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é |
|
|
00
|
|
|
#14 |
|
Membre confirmé
![]() Xavier PerrissoudDéveloppeur amateur Inscription : décembre 2008 Messages : 135 ![]() |
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' |
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
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à... |
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
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... |
|
|
00
|
|
|
#17 |
|
Membre confirmé
![]() Xavier PerrissoudDéveloppeur amateur Inscription : décembre 2008 Messages : 135 ![]() |
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' |
|
|
00
|
|
|
#18 |
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
Merci, c'est fonctionnel
![]() Maintenant, mon dernier contrôle est de vérifier si certaines données n'auront pas de doublons lorsque l'utilisateur sélectionnera un numéro : Via un combobox, je récupère la valeur ( 1 à 8). Mon idée est de construire un tableau d'entier, d'ajouter le choix de l'utilisateur dans le tableau, et continuer... Pour le contrôle, je souhaiterai faire une boucle for, pour vérifier si le choix qu'il demande n'a pas déjà été entré ( si le numéro n'est pas déjà dans le tableau ) et auquel cas, il devra en choisir un autre. J'ai vu un peu de doc sur les wxArrayInt, mais elle n'est pas trop complète. Je pense que Insert est pour insérer une valeur, mais il faudrait aussi que je supprime des valeurs dans le tableau et aussi le parcourir pour vérifier si le numéro n'existe pas. As-tu un petit exemple qui pourrait me mettre sur la piste ? |
|
|
00
|
|
|
#19 |
|
Membre confirmé
![]() Xavier PerrissoudDéveloppeur amateur Inscription : décembre 2008 Messages : 135 ![]() |
En fait, wxArrayInt utilise wxArray.
Il te suffit de regarder la doc concernant cette dernière classe, et tu aura le fonctionnement de wxArrayInt, wxArrayString, wxArrayDouble, wxArrayShort, ... Comme tu l'as dit, "Insert" sert à insérer une ou plusieurs données à un endroit précis. Sinon, tu as la méthode "Add" pour simplement ajouter des données en fin de tableau, "Remove" pour en enlever, et "Index" pour trouver la position d'un élément (et si cet élément n'existe pas, tu obtiens la valeur wxNOT_FOUND. @+ Xav' |
|
|
00
|
|
|
#20 | ||||
|
Invité de passage
![]() Étudiant Inscription : avril 2012 Messages : 22 ![]() |
Et encore un problème de résolu
Mais ce n'est pas tout... j'en ai un autre. Peut on changer une variable booléenne qui ne se situe pas dans la même classe ? Dans mon main : Code :
Code :
Il y a sans doute plus simple à faire, mais c'est le mieux que j'ai pu trouver, et ca ne marche pas. J'ai l'impression, qu'il ne me change pas mes valeurs... |
||||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com