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


|
Conversation (Résolue) : Problème d'event |
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne |
bonjour, Voila mon petit soucis, j'ai une dll où je déclare une frame avec une toolbar du style :
Code wxWidgets:class MYLIB_API FrameWithNavigationToolBar : public wxFrame { public: FrameWithNavigationToolBar ( wxWindow *parent = NULL, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE) { Create(parent, id, title, pos, size, style); } bool Create( wxWindow *parent = NULL, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE); void OnNavigationToolBar(wxCommandEvent &event) { wxMessageBox(wxS("OK")); } virtual ~FrameWithNavigationToolBar () { } protected: DECLARE_EVENT_TABLE() private: void RecreateToolBar(); wxToolBar *m_ToolBar; };
Code wxWidgets: BEGIN_EVENT_TABLE(FrameWithNavigationToolBar, wxFrame) EVT_MENU(wxID_ANY, FrameWithNavigationToolBar::OnNavigationToolBar) END_EVENT_TABLE() bool FrameWithNavigationToolBar::Create(wxWindow *parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) { wxFrame::Create(parent, id, title, pos, size, style); RecreateToolBar(); return true; } void FrameWithNavigationToolBar::RecreateToolBar() { wxDELETE(m_ToolBar); SetToolBar(NULL); m_ToolBar = this->CreateToolBar(wxTB_HORIZONTAL | wxTB_FLAT, wxID_ANY); m_ToolBar->AddTool(1, wxS("Retour"), wxNullBitmap, wxNullBitmap, wxITEM_NORMAL, wxS("Page précédente")); m_ToolBar->Realize(); }
Mon message OK n'apparait jamais. J'ai essayé un EVT_SHOW pour voir si les évènements étaient bien propagés, et le EVT_SHOW marche. J'ai essayé des Connect également, rien y fait. Vous n'auriez pas des pistes ou une idée ?
à savoir que le code dans l'application utilisant la dll est du style
Code wxWidgets:class MyFrame : public FrameWithNavigationToolBar { ... };
merci par avance, Sem
PS: bien sur, j'ai simplifié le code pour plus de clarté
Dernière modification par Sem (21-05-2010 15:38:58)
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Salut.
A mon avis, cela vient du fait que tu attribues l'Id 1 au bouton de la toolbar.
Essayes avec un identifiant déjà défini par wxWidgets (par exemple, wxID_BACKWARD) pour voir)
@+ Xav'
|
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....
|
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne |
bonjour, merci pour la réponse. J'ai tenté en mettant wxID_BACKWARD ou même 1000000 ca ne donne rien également. Sem
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
C'est bizarre, en effet.
Je viens de faire le test, avec (à quelque chose près) le même style de code que toi, et ça marche nickel.
Essayes déjà de faire un "Rebuild" de tous les projets (lib et application), on ne sait jamais.
Je vais de mon côté nettoyer mon code pour le poster en entier si jamais ça ne marche toujours pas pour toi.
Tiens moi au courant
@+ Xav'
|
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....
|
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne |
Pour information, j'utilise wxWidget 2.9.0 ( tag 2_9_0 du svn ) en version Dll unicode. Ca ne peut pas être un truc lié au fait que j'ai mon code également dans une Dll ? ce qui est bizarre, c'est que si je met un bouton dans la frame, je récupère bien les event EVT_BUTTON ( dans la dll ). merci, Sem
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Sem:Ca ne peut pas être un truc lié au fait que j'ai mon code également dans une Dll ? Non : j'utilise wx2.8.11 en dll unicode et ça marche. Sem:ce qui est bizarre, c'est que si je met un bouton dans la frame, je récupère bien les event EVT_BUTTON ( dans la dll ) C'est encore plus bizarre, effectivement.
Voici le code que j'ai utilisé pour faire le test : D'abord, la dll : Fichier libwxtests.h:
Code wxWidgets:#ifndef LIBWXTESTS_H_INCLUDED #define LIBWXTESTS_H_INCLUDED #ifndef DLLIMPORT #if EXPORT_LIB #define DLLIMPORT __declspec (dllexport) #else #define DLLIMPORT __declspec (dllimport) #endif // EXPORT_LIB #endif // DLLIMPORT #endif // LIBWXTESTS_H_INCLUDED Fichier mainframe.h:
Code wxWidgets: #ifndef MAINFRAME_H_INCLUDED #define MAINFRAME_H_INCLUDED #include "libwxtests.h" #include <wx/wx.h> class DLLIMPORT MyLibFrame : public wxFrame { public: MyLibFrame(wxWindow *parent, const wxString& title) { Create(parent, title); } bool Create( wxWindow *parent, const wxString& title); ~MyLibFrame(); private: void RecreateToolBar(); void OnToolbarClicked(wxCommandEvent &event) { wxMessageBox( _T("OK")); } wxToolBar *m_ToolBar; DECLARE_EVENT_TABLE() }; #endif // MAINFRAME_H_INCLUDED
Fichier mainframe.cpp:
Code wxWidgets:#include "mainframe.h" #include "back.xpm" BEGIN_EVENT_TABLE(MyLibFrame, wxFrame) EVT_MENU(wxID_ANY, MyLibFrame::OnToolbarClicked) END_EVENT_TABLE() bool MyLibFrame::Create(wxWindow *parent, const wxString& title) { wxFrame::Create(parent, -1, title); RecreateToolBar(); return true; } MyLibFrame::~MyLibFrame() { // } void MyLibFrame::RecreateToolBar() { wxDELETE(m_ToolBar); SetToolBar(NULL); m_ToolBar = this->CreateToolBar(wxTB_HORIZONTAL | wxTB_FLAT, wxID_ANY); m_ToolBar->AddTool(1, _T("Retour"), wxBitmap(back_xpm), wxNullBitmap, wxITEM_NORMAL, _T("Page précédente")); m_ToolBar->Realize(); }
Ensuite, l'application de test : Fichier wxTestApp.h:
Code wxWidgets:#ifndef WXTESTSAPP_H_INCLUDED #define WXTESTSAPP_H_INCLUDED #include <wx/app.h> class wxTestsApp : public wxApp { public: virtual bool OnInit(); }; #endif //WXTESTSAPP_H_INCLUDED DECLARE_APP(wxTestsApp);
Fichier wxTestApp.cpp:
Code wxWidgets:#include "wxTestsApp.h" IMPLEMENT_APP(wxTestsApp); #include "wxTestsFrame.h" bool wxTestsApp::OnInit() { wxTestsFrame* frame = new wxTestsFrame(NULL, _T("TestFrame")); frame->Show(); return true; }
Fichier wxTestsFrame.h:
Code wxWidgets:#ifndef WXTESTSFRAME_H_INCLUDED #define WXTESTSFRAME_H_INCLUDED #include <wx/wx.h> #include "mainframe.h" class wxTestsFrame: public MyLibFrame { public: wxTestsFrame(wxWindow *parent, const wxString &title); ~wxTestsFrame(); protected: private: }; #endif //WXTESTSFRAME_H_INCLUDED
Fichier wxTestsFrame.cpp:
Code wxWidgets:#include "wxTestsFrame.h" wxTestsFrame::wxTestsFrame(wxWindow *parent, const wxString& title) : MyLibFrame(parent, title) { // } wxTestsFrame::~wxTestsFrame() { // }
Comme tu peux le voir, y'a rien de plus que ce que tu as mis (à part l'icône au format xpm pour le bouton de la wxToolBar, mais même sans, ça marche).
|
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....
|
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne |
bonjour, je vais recompiler wxWidgets bien que ce soit le seul "bug" que j'ai. On ne sait jamais. Parce-que la, je vois vraiment pas la différence entre nos deux codes. merci encore, Sem ----------
alors j'ai tout recompilé wxWidgets etc... , ca ne changeait rien. Par contre, j'ai trouvé une piste. Dans le code "nettoyé", j'ai ca en plus de toi, en reprenant ton code :
Code wxWidgets: bool MyLibFrame::Create(wxWindow *parent, const wxString& title) { wxFrame::Create(parent, -1, title); RecreateToolBar(); wxBoxSizer *Sizer = new wxBoxSizer(wxVERTICAL); Sizer->Add(new SpecialPanel(this), 1, wxALL | wxEXPAND, 0); SetSizer(Sizer); return true; }
SpecialPanel héritant de wxPanel. Si je met ce code en commentaire j'ai de nouveau les events qui fonctionnent. Si je met à la place
Code wxWidgets: bool MyLibFrame::Create(wxWindow *parent, const wxString& title) { wxFrame::Create(parent, -1, title); RecreateToolBar(); wxBoxSizer *Sizer = new wxBoxSizer(wxVERTICAL); Sizer->Add(new wxPanel(this), 1, wxALL | wxEXPAND, 0); SetSizer(Sizer); return true; } cela fonctionne également.
J'en déduis que mon code de SpecialPanel bloque quelque chose, il me reste à regarder de ce coté, même si pour le moment quelque chose m'échappe, encore merci, amitiés, Sem ----------
problème résolu. Alors ca restera un mystère pour moi, j'ai juste changé le code
Code wxWidgets: class SpecialPanel : public SpecialObject, public wxPanel { public: SpecialPanel (wxWindow *parent); } SpecialPanel::SpecialPanel(wxWindow *parent) : SpecialObject(), wxPanel(parent) { }
j'ai juste inversé l'ordre des objets hérités
Code wxWidgets: class SpecialPanel : public wxPanel, public SpecialObject { public: SpecialPanel (wxWindow *parent); } SpecialPanel::SpecialPanel(wxWindow *parent) : wxPanel(parent), SpecialObject() { }
Si quelqu'un connait l'importance de l'ordre, je suis preneur, encore merci, Sem
Dernière modification par Sem (22-05-2010 13:22:41)
|
|
freem (Membre)
Inscrit le : 09-04-2010
Messages: 11
Snippets: 0
Tutoriels: 0
Hors ligne |
"Si quelqu'un connait l'importance de l'ordre, je suis preneur,"
Je ne suis pas sûr de moi, car c'est plutôt rare que je fasse de l'héritage multiple, mais il me semble que si jamais les 2 classes dont tu hérites héritent de la même, il peut y avoir des conflits...
Il me semble, de mémoire, qu'il existe une astuce... Je ne saurai en revanche pas dire laquelle, mais juste que j'étais tombé sur un doc de developpez.com qui parlait d'héritages multiples et tortueux...
Désolé de pas pouvoir aider plus.
|
|
Sem (Membre)
Inscrit le : 31-05-2008
Messages: 64
Snippets: 0
Tutoriels: 0
Hors ligne |
bonjour, j'ai chercher un peu dans les articles de developpez.com mais sans succès. Merci, Sem
|
|
|