Membres inscrits :598
Membres en ligne : 0
Invités en ligne : 6


|
| Conversation (Résolue) : Utilisation de la classe wxValidator |
Bourinax (Nouveau membre)
Inscrit le : 23-10-2009
Messages: 4
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour,
Je travaille actuellement sur un projet dans le cadre de mes études, mon problème est le suivant :
Je dois utiliser la classe wxValidator pour contrôler la saisie d'une liste de paramètres dans une boîte de dialogue. Ce que je souhaite c'est utiliser un wxChoice pour permettre à l'utilisateur de sélectionner le paramètre à entrer, avec à coté un wxTextCtrl lui permettant de saisir la valeur.
Je souhaite que l'utilisateur puisse sélectionner un paramètre, change sa valeur dans le TextCtrl, en sélectionne un autre, change sa valeur, etc... et ceci pour tous les paramètres qu'il souhaite, sans avoir a cliquer sur un bouton "apply" pour valider entre chaque changement.
Tout les changements sont validés quand il click sur OK en quittant la fenêtre (ou pas validés s'il click sur annuler, of course).
Précision : les paramètres sont stockés dans une map. (map : objet de la STL...)
Le problème vient du fait que pour mon projet la gestion des événements sera dynamique (c'est quelqu'un d'autre qui interceptera l'événement click sur OK avec un "Connect"), et appellera depuis son code une fonction de ma boite de dialogue.
Dans ce cadre je ne pas bien comment utiliser les wxValidator (que je n'ai jamais utilisé avant en fait...), j'ai regardé la doc mais c'est loin d'être évident.
Je voudrait donc que quelqu'un m'explique en gros comment je peux utiliser les wxValidator dans ce cadre. Je me doute qu'il va éventuellement falloir que je fasse des fonctions supplémentaires pour assurer la validation et le stockage dans la map entre chaque changement pour le wxChoice (j'ai le droit de capter et gérer ce type d'événements moi même).
Merci pour votre aide !
PS : si vous n'avez pas tout compris à mon problème n'hésitez pas à demander des précisions, j'ai forcement oublié de préciser certains détails...
| |
|
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 289
Snippets: 4
Tutoriels: 0
Hors ligne |
Salut,
J'espère qu'il n'est pas trop tard pour ton problème mais en lisant j'avoue ne pas avoir tout compris. Ce que tu voudrais faire c'est a chaque changement de paramètre dans ta liste faire en sorte qu'il soit stocké en attendant la validation finale ? en gros faire une sorte de validation du champ de façon temporaire de la durée de vie de ta boite de dialogue ?
| |
|
Bourinax (Nouveau membre)
Inscrit le : 23-10-2009
Messages: 4
Snippets: 0
Tutoriels: 0
Hors ligne |
Oui c'est en fait plus compliqué que ça, il y a plusieurs difficultés.
L'interception de l'événement de changement de paramètre de la liste pose problème, de l'aide même rien que pour ça serait la bienvenue. Ce n'est pourtant pas la partie qui devait me poser problème, je m'explique : Entre temps j'ai essayé d'avancer... J'ai utilisé wxFormBuilder pour coder l'intérieur de ma boîte de dialogue (et ça fonctionne très bien pour la layout), wxFormBuilder permet aussi d'associer un événement à mon wxChoice et j'ai pu ainsi générer le code correspondant à l'interception de l'événement :
Code wxWidgets:/* construction du wxChoice */ wxString m_choice2Choices[] = { wxT("koko"), wxT("kiki") }; int m_choice2NChoices = sizeof( m_choice2Choices ) / sizeof( wxString ); m_choice2 = new wxChoice( PanelOptions, wxID_ANY, wxDefaultPosition, wxSize( 300,-1 ), m_choice2NChoices, m_choice2Choices, 0 ); m_choice2->SetSelection( 0 ); [...] /* utilisation du connect */ m_choice2->Connect(ID_PARAMETER_SELECT, wxEVT_COMMAND_CHOICE_SELECTED,wxCommandEventHandler(wxSettings::ValidateParameter),NULL,this); [...] /* fonction appellée (pour l'instant c'est juste un test) */ void wxSettings::ValidateParameter(wxCommandEvent& event) { m_textCtrl2->AppendText("fct OK"); }
J'ai regardé dans la doc et l'utilisation du "connect" à l'air correcte, je n'arrive pas à voir ce que j'ai fait de travers (ça compile, mais aucun message n'apparait lors des selections).
| |
|
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 289
Snippets: 4
Tutoriels: 0
Hors ligne |
Au niveau de l'utilisation du Connect je suis pas très calé j'ai plutôt pour habitude d'utiliser les tables d'évènements. Mais juste un truc tout bête tu as essaye de mettre un wxMessageBox(wxT("message")) dans la fonction appelé par l'évènement voir si des fois ca ne viendrai pas du AppendText ?
Sinon pour ce qui est des tables d'évènements, ca ressemble à ca :
Code wxWidgets: BEGIN_EVENT_TABLE(TaClasse,wxFrame (wxDialog ou autre)) EVT_CHOICE(ID_DE_TON_CONTROLE, wxSettings::ValidateParameter) END_EVENT_TABLE();
Dernière modification par Warzer (16-12-2009 22:53:03)
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1147
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Hello
Bourinax a écrit:
Code wxWidgets:/* construction du wxChoice */ [...] m_choice2 = new wxChoice( PanelOptions, wxID_ANY, wxDefaultPosition, wxSize( 300,-1 ), m_choice2NChoices, m_choice2Choices, 0 ); [...] /* utilisation du connect */ m_choice2->Connect(ID_PARAMETER_SELECT, wxEVT_COMMAND_CHOICE_SELECTED,wxCommandEventHandler(wxSettings::ValidateParameter),NULL,this); [...] Le problème vient du fait que tu ne spécifies pas l'ID du contrôle lors de sa création : - Tu crées le controle avec wxID_ANY comme id, donc tu laisses wxWidgets choisir l'ID - Tu connectes l'événement wxEVT_COMMAND_CHOICE_SELECTED au controle dont l'ID est ID_PARAMETER_SELECT, qui n'existe pas. Il est donc normal que tu ne reçoives pas l'événement.
Il aurait fallu mettre, lors de la création du contrôle :
Code wxWidgets:m_choice2 = new wxChoice( PanelOptions, ID_PARAMETER_SELECT, wxDefaultPosition, wxSize( 300,-1 ), m_choice2NChoices, m_choice2Choices, 0 );
Avec ça, ça devrait marcher.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
Bourinax (Nouveau membre)
Inscrit le : 23-10-2009
Messages: 4
Snippets: 0
Tutoriels: 0
Hors ligne |
@Warzer dans mon cas je peux pas utiliser les tables statiques, les événements sont aussi interceptés en dehors de ma classe 
merci Xaviou c'était bien ça le problème, il fallait juste remplacer ID_PARAMETER_SELECT par wxID_ANY. Je pensait à tort que le fait de mettre "m_choice2->" devant le connect permettait de définir quel contrôle est associé à la fonction 
Il y a juste quelque chose que je ne comprend pas, quand j'enlève le "m_choice2->" devant le connect, ça marche pareil, alors il servait à quoi, à faire joli? ...
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1147
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
En fait, quand tu utilises cette version de la méthode "Connect", tu n'as pas besoin de spécifier l'ID du contrôle. Tu peux directement mettre :
Code wxWidgets:m_choice2->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(wxSettings::ValidateParameter), NULL, this);
@+ Xav'
P.S: N'oublie pas de passer le topic en "résolu" quand c'est bon (lien "Accepter" en bas à droite du post qui a résolu ton pb).
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
|