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 : 2

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» Problème d'event
Conversation (Résolue) : Problème d'event
21-05-2010 15:37:43  Problème d'event #1
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)

21-05-2010 17:02:43  Re: Problème d'event #2
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....
21-05-2010 17:08:50  Re: Problème d'event #3
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
21-05-2010 18:24:36  Re: Problème d'event #4
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....
21-05-2010 20:23:53  Re: Problème d'event #5
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
21-05-2010 20:34:48  Re: Problème d'event #6
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....
22-05-2010 01:48:06  Re: Problème d'event #7
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)

01-06-2010 15:08:03  Re: Problème d'event #8
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.
05-06-2010 18:17:10  Re: Problème d'event #9
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
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» Problème d'event