IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

FindWindow & IsKindOf


Sujet :

wxWidgets

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Par défaut FindWindow & IsKindOf
    Bonjour,

    vu que je commence a comprendre comment marche wxWidget et qu'il faut éviter les declaration de wxWindow* en tant que membre de class (evité les duplications), j'ai essayé de récuperer des valeurs d'une wxCheckBoxList en utilisant FindWindow.

    Le probleme c'est que visiblement la wxWindow* que je recupere n'est pas du type wxCheckBoxList, et je ne comprend pas pourquoi...

    qqun aurait une idée d'ou vient mon probleme ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    void MyFrame::initComponent() {
     
    wxPanel *panel = new wxPanel(this);
     
    ...
     
    wxPanel *subpanel = new wxPanel(panel);
    wxCheckListBox *clb = new wxCheckListBox(subpanel,ID_CTRL_CAM_ON, wxDefaultPosition, wxDefaultSize,strings, wxLB_MULTIPLE);
    Connect(ID_CTRL_CAM_ON,wxEVT_COMMAND_CHECKLISTBOX_TOGGLED,wxCommandEventHandler(MyFrame::OnEnableCam));
     
    }
     
     
    void MyFrame::OnEnableCam(wxCommandEvent& event) {
    	wxWindow *wintmp = this->FindWindow(ID_CTRL_CAM_ON);
    	if(wintmp->IsKindOf(CLASSINFO(wxCheckListBox))) { ##Always false
    		wxCheckListBox* clb = (wxCheckListBox*)wintmp;
                    clb->IsChecked(0); ## If we don't check the KindOf we have an error here
            }
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Es-tu sûr au moins que FindWindow n'a pas retourné NULL ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Beaucoup plus simple, il faut simplement tester:
    Citation Envoyé par elraton
    et qu'il faut éviter les declaration de wxWindow* en tant que membre de class (evité les duplications)
    Non c'est pas ce qui a été dit, dans ta classe tu peux stocker tes pointeurs sans aucun problème, ils seront toujours valide du début à la fin, sauf si tu détruis ton composant !!!
    Ce qui parait très logique, le pointeur pointera un espace invalide si le composant a été détruit !

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Par défaut
    1. J'ai bien verifier le pointeur wxWindow *wintmp n'est pas NULL.
    2. event.IsChecked(), ca marche mais ca me permet pas de savoir lequel des CheckBox est checker dans la checkListBox

  5. #5
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Le mieux c'est de créer une map.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    //.h
    class MyFrame
    {
    ...
    std::map<int, wxWindow*> mAllComponents;
    ...
    }
     
    //.cpp
    // Pour chaque composant on l'ajoute dans une map
    // On peut faire des maps séparées, on peut s'organiser comme on veut
    void CreateComponents()
    {
    ...
    wxWindow *tNewComponent = new wxCheckListBox(...);
    mAllComponents[tNewComponent->GetId()] = tNewComponent ;
    ...
    }
     
    // dans l'event
    void MyFrame::OnEnableCam(wxCommandEvent& event)
    {
    std::map<int, wxWindow*>::iterator itComponent;
    if((itComponent = mAllComponents.find(event.GetId())) != mAllComponents.end())
    {
    itComponent->GetName();
    itComponent->GetId()
    ...
       event.IsChecked()
    }
    }
    Lorsqu'un composant est détruit, il suffit de mettre à jour la map.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Sauf que là tu fais de la redondance avec wxWidget. Et tu risques d'avoir un désynchronisme entre ta map et les composants. C'est pour ça qu'à mon avis, il vaut mieux s'appuyer sur wxWidget pour obtenir les composants.
    Pour récupérer le composant:event.GetId()?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme FindWindow
    Par abignon dans le forum MFC
    Réponses: 2
    Dernier message: 28/01/2004, 12h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo