wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 3

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» Bug lors de l'appel de méthodes...
Conversation (Résolue) : Bug lors de l'appel de méthodes...
25-11-2007 21:16:40  Bug lors de l'appel de méthodes... #1
Arkhiall (Membre)
Inscrit le : 08-11-2007
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne
Salut à tous,

Je suis en train de me créer un widget contenant un wxTextCtrl. Je veux appeler une fonction lorsque le champ de texte est cliqué...

Code wxWidgets:

 
 
monWidget::monWidget(wxWindow *parent, wxWindowID id) : wxPanel(parent, id, wxDefaultPosition, wxDefaultSize)
{
  textCtrl   = new wxTextCtrl(this, wxID_ANY, _("0:000:00"), wxDefaultPosition, wxSize(60, 20), wxTE_PROCESS_ENTER);
  //... blablabla
  textCtrl->Connect(wxEVT_LEFT_DOWN,
                wxCommandEventHandler(atCoordinates::onClick));
}
 
void monWidget::onClick(wxCommandEvent& event)
{
  textCtrl->GetValue();
}


Problème : lorsque je clique sur le textCtrl, le programme plante... à cause de l'appel à textCtrl->GetValue() !

Lorsque je l'appelle dans le constructeur, pas de problème, mais un appel dans onClick fait tout planter... quelqu'un saurait pourqquoi?

Merci à vous !
25-11-2007 21:20:45  Re: Bug lors de l'appel de méthodes... #2
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 544
Snippets: 0
Tutoriels: 0
Site web
Hors ligne
Tu l'ajoutes sur celui du textctrl, pas de ton objet, a mon avis c'est Connect tout seul

Itérer est humain, récurser est divin
25-11-2007 21:24:58  Re: Bug lors de l'appel de méthodes... #3
Arkhiall (Membre)
Inscrit le : 08-11-2007
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne
Mouarf...
Connect(textCtrl->GetId(), wxEVT_LEFT_DOWN,
                wxCommandEventHandler(atCoordinates::onClick));

Et ca marche !

Même si je comprends pas trop la différence entre les deux...

Merci en tous cas ;)
25-11-2007 21:32:14  Re: Bug lors de l'appel de méthodes... #4
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 544
Snippets: 0
Tutoriels: 0
Site web
Hors ligne
En fait quand tu appelles une fonction memebre, il y a un parametre qui est ajouté par le compilo : this. Ce que tu faisais avant c'est executé la fonction mais avec le textctrl comme pointeur this, ce qui fai que le pointeur textCtrl membre de ta class etais en fait n'importe quoi. d'ou le sergault
----------
Pour resumer : un_pointeur_sur_nimp->getValue();

Dernière modification par xxltux (25-11-2007 21:34:39)


Itérer est humain, récurser est divin
25-11-2007 21:39:44  Re: Bug lors de l'appel de méthodes... #5
Arkhiall (Membre)
Inscrit le : 08-11-2007
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne
Merci ;)

Mais je viens de me rendre compte que ca plantait plus, parce que onClick n'était plus appelée lors du clic...

En initialisant mon wxTextCtrl avec un ID fixe au lieu de wxID_ANY (2345 par exemple) et en passant 2345 à la place de textCtrl->GetId(), ca passe pas non plus !

:/
25-11-2007 21:45:38  Re: Bug lors de l'appel de méthodes... #6
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne
Pour crée une ID il y a une fonction spécial qu'il vaut mieux utiliser :

Code wxWidgets:

 
//Tu le déclarre dans TaClasse.
static const int uneID;
 
//Et ça tu le met dans ton fichier cpp
const int TaClasse::uneID= wxNewId();
 


Et du coup quand tu en a besoin tu utilise uneID.

Ps : Xaviou si tu lit ça faudrai que tu change la couleur bleu super clair parceque sur du blanc sa fait mal au yeux :p

Dernière modification par Warzer (25-11-2007 21:47:14)

25-11-2007 21:54:41  Re: Bug lors de l'appel de méthodes... #7
Arkhiall (Membre)
Inscrit le : 08-11-2007
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne
Merci, je connaissais aps cette fonction et ca peut être utile.

Mais ca passe toujours pas :/

Problème avec Connect()?
25-11-2007 21:56:38  Re: Bug lors de l'appel de méthodes... #8
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne
Connect je l'utilise comme ça :

Code wxWidgets:

 
Connect(this->GetId(), wxEVT_SIZE, (wxObjectEventFunction)&InteractionImages::OnSize);
 

après tu met les evenement en conséquence
25-11-2007 22:10:18  Re: Bug lors de l'appel de méthodes... #9
Arkhiall (Membre)
Inscrit le : 08-11-2007
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne
Toujours rien j'ai tout testé... avec GetId(), l'ID de wxNewId(), (wxObjectEventFunction)&monWidget::onClick, wxCommandEventHandler(monWidget::onClick)... rien passe!

Une autre idée?
25-11-2007 22:14:24  Re: Bug lors de l'appel de méthodes... #10
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut à tous.

Première erreur : la méthode appelée par l'événement wxEVT_LEFT_DOWN ne doit pas être de type "wxCommandEventHandler" mais "wxMouseEventHandler", et donc qui ne prend pas un "wxCommandEvent" en paramètre, mais un wxMouseEvent.

Ensuite, il n'est pas possible de connecter cet événement avec un ID spécifique, comme pour un bouton, ou autre contrôle...

Il faut donc vérifier cet ID depuis le wxMouseEvent.

Ça donne donc, pour ton code :

Code wxWidgets:

monWidget::monWidget(wxWindow *parent, wxWindowID id) : wxPanel(parent, id, wxDefaultPosition, wxDefaultSize)
{
  textCtrl   = new wxTextCtrl(this, wxID_ANY, _("0:000:00"), wxDefaultPosition, wxSize(60, 20), wxTE_PROCESS_ENTER);
  //... blablabla
  Connect(wxEVT_LEFT_DOWN,
                wxMouseEventHandler(atCoordinates::onClick));
}
 
void monWidget::onClick(wxMouseEvent& event)
{
  if (event.GetId()==textCtrl->GetId()
  {
    // Le clic a été effectué sur textCtrl
  }
}

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
25-11-2007 22:18:52  Re: Bug lors de l'appel de méthodes... #11
Warzer (Membre)
Inscrit le : 05-10-2007
Messages: 284
Snippets: 4
Tutoriels: 0
Hors ligne
Tu pourai fare un truc dans ce style sinon:

Code wxWidgets:

 
const int TaClasse::ID_TEXTCTRL = wxNewId();
 
BEGIN_EVENT_TABLE(monWidget,wxPanel)
    EVT_TEXT(ID_TEXTCTRL, monWidget::onClick)
END_EVENT_TABLE()
 
monWidget::monWidget(wxWindow *parent, wxWindowID id) : wxPanel(parent, id, wxDefaultPosition, wxDefaultSize)
{
  textCtrl   = new wxTextCtrl(this, ID_TEXTCTRL, _("0:000:00"), wxDefaultPosition, wxSize(60, 20), wxTE_PROCESS_ENTER);
  //... blablabla
}
 
void monWidget::onClick(wxCommandEvent& event)
{
  textCtrl->GetValue();
}
 


J'ai peut être fait des erreurs alors modifie en conséquence
25-11-2007 22:26:08  Re: Bug lors de l'appel de méthodes... #12
Arkhiall (Membre)
Inscrit le : 08-11-2007
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne
J'essaye d'éviter les EVENT_TABLE ;)

Sinon Xaviou, j'ai suivi ce que tu m'as dit, ca compile... mais toujours rien lorsque je clique :/

Mon code :

Code wxWidgets:

atCoordinates::atCoordinates(wxWindow *parent, wxWindowID id) : wxPanel(parent, id, wxDefaultPosition, wxDefaultSize)
{
    textCtrl   = new wxTextCtrl(this, wxID_ANY, _("0:000:00"), wxDefaultPosition, wxSize(60, 20));
    //blablabla
 
    Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(atCoordinates::onClick));
}
 
void atCoordinates::onClick(wxMouseEvent& event)
{
    if (event.GetId()==textCtrl->GetId())
    {
        wxMessageBox(_("ok!"), _("Alert"));
    }
}
 
25-11-2007 22:40:03  Re: Bug lors de l'appel de méthodes... #13
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
As-tu essayé ma méthode avec "textCtrl->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(atCoordinates::onClick));"

Je doute que ça marche, mais on ne sait jamais...

Sinon, tu vas devoir te créer ta propre classe dérivée de wxTextCtrl, et possédant sa propre méthode "OnClick" connectée comme je te l'ai mis précédement.

Dans cette méthode, il faudra faire passer le wxMouseEvent à la wxFrame parent.
Regardes ce topic, c'est à peut près le même problème.

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
25-11-2007 22:44:05  Re: Bug lors de l'appel de méthodes... #14
Arkhiall (Membre)
Inscrit le : 08-11-2007
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne
Oui j'ai essayé!
C'est marqué au dessus, ca marche mais je peux plus rien appeler dans onClick (segfault).

Merci pour le lien, je vais voir ca demain à tête reposée!
25-11-2007 22:44:54  Re: Bug lors de l'appel de méthodes... #15
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Sinon, suivant ce que tu veux faire, tu peux éventuellement utiliser l'événement "focus"

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
25-11-2007 23:49:22  Re: Bug lors de l'appel de méthodes... #16
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 544
Snippets: 0
Tutoriels: 0
Site web
Hors ligne
J'ai meme expliqué pk! Mais pas comment faire snif
Sinon de ce que j'ai mi par mail, tu as regardé?

Itérer est humain, récurser est divin
26-11-2007 13:09:24  Re: Bug lors de l'appel de méthodes... #17
Arkhiall (Membre)
Inscrit le : 08-11-2007
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne
J'ai trouvé !

Je suis tombé sur ca en cherchant :
http:/groups.google.com.vn/group/comp.s … 674e05a22c

EN fait, la méthode était bonne au début, lorsque ca marchait, mais il fallait passer le pointeur this en dernier argument en plus !
26-11-2007 16:42:19  Re: Bug lors de l'appel de méthodes... #18
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Arkhiall:
En fait, la méthode était bonne au début, lorsque ca marchait, mais il fallait passer le pointeur this en dernier argument en plus !
Effectivement, ça marche !
Mais le fait que tu n'utilisais pas le bon type d'événement reste valable.
Il faut utiliser un wxMouseEvent, mais il n'est plus nécessaire de tester l'ID du contrôle.

Ce qui donne :

Code wxWidgets:

monWidget::monWidget(wxWindow *parent, wxWindowID id) : wxPanel(parent, id, wxDefaultPosition, wxDefaultSize)
{
  textCtrl   = new wxTextCtrl(this, wxID_ANY, _("0:000:00"), wxDefaultPosition, wxSize(60, 20), wxTE_PROCESS_ENTER);
  //... blablabla
  textCtrl->Connect(wxEVT_LEFT_DOWN,
                wxMouseEventHandler(atCoordinates::onClick),NULL,this);
}
 
void monWidget::onClick(wxMouseEvent& event)
{
    // Le clic a été effectué sur textCtrl
}

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
26-11-2007 16:54:20  Re: Bug lors de l'appel de méthodes... #19
Arkhiall (Membre)
Inscrit le : 08-11-2007
Messages: 28
Snippets: 0
Tutoriels: 0
Hors ligne
En effet, j'utilise bien MouseEvent, j'avais oublié de le repréciser ;)

C'est quand même le problème que je trouve à wxWidgets, le manque de doc! Pour un truc comme ca, on galère des heures :/
----------
Encore une question !

J'ai fait la même chose, sauf que ma focntion est appelée lorsque le wxTextCtrl gagne le focus (donc avec wxFocusEvent, wxEVT_SET_FOCUS, etc).

Ca marche (ma fonction est bien appelée), mais lorsque je fais un SetSelection, rien ne se sélectionne... alors que, toujours dans le constructeur, ca marche...

PS : peut être qu'il faudrait prendre l'habitude d'utiliser Connect comme on vient de le montrer!

EDIT : je viens de remarquer que lorsque je clique dans le text ctrl, pas de sélection, mais que si je clique ailleurs (autre programme, le mien passe en arière plan) et que je remets mon prog au premier plan, la sélection est faite!

Comportement bizarre?

Dernière modification par Arkhiall (26-11-2007 18:02:47)

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» Bug lors de l'appel de méthodes...