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

MFC Discussion :

Pointeur générique vers d'autres types d'objets


Sujet :

MFC

  1. #1
    Membre confirmé Avatar de LapinGarou
    Homme Profil pro
    R&D Developer
    Inscrit en
    Octobre 2005
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D Developer
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 341
    Points : 479
    Points
    479
    Par défaut Pointeur générique vers d'autres types d'objets
    Bonjour à tous.

    Etant un peu novice en C++, je ne sais pas si ça a vraiment à voir avec les MFC.
    Le problème: j'ai par exemple différentes commandes : CFG (config), BAT(batteries),...dans une Combobox.
    Quelques paramètres sont communs entre les commandes, d'autres non. Je fait afficher les paramètres spécifiques par des CDialog dans une variable membre de type CStatic avec tout le tintouin SetWindowPos(xx,...) etc.
    Mes classes sont nommées : CSubCFG (Sub pour sub dialog, on ne rigole pas au fond! ), CSubBAT...
    J'affiche correctement chaque dialogue correspondant à la commande sélectionnée, mais j'ai près de 70 commandes. Plutot que de créer pour chaque dialog un pointeur, existe il un moyen pour stocker les variables "CSubCFG cfg" et autres dans un tableau ? Ou bien avoir un pointeur générique ? Comment faire ?
    Est ce que la CRuntimeClass pourrait m'aider ? (je dois manquer une étape, le programme se lance et le debugger "just in time" se lance...)


    Merci !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Le problème est, à mon humble avis, posé de façon trop vague.

    Essaie d'être un peu plus clair !
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    si le sujet c'est de stocker des objets divers dans un array et de les reconnaitres avec la signature oui c'est possible.
    l'objet doit hériter de CObject et posséder la macro IMPLEMENT_SERIAL.
    aprés l'utilisation de la fonction Iskindoff est possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // CArray<CObject *,CObject *> array;
     
    if(array[i]->IsKindOf(RUNTIME_CLASS(CSubCFG)))
    {
    // traitement
    }
    autrement il est possible d'utiliser le mecanisme RTTI et dynamic_cast, mais tes classes doivent utilsiser la virtualité ...
    mais bon ton probleme est tres mal exposé...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    DECLARE/IMPLEMENT_SERIAL n'est pas nécessaire pour la pseudo-RTTI de MFC:
    DECLARE_DYNAMIC et IMPLEMENT_DYNAMIC suffisent...
    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.

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par Médinoc
    DECLARE/IMPLEMENT_SERIAL n'est pas nécessaire pour la pseudo-RTTI de MFC:
    DECLARE_DYNAMIC et IMPLEMENT_DYNAMIC suffisent...
    se sont simplement des usages différents.
    A part qu' Implement_serial cumul les trois usages:
    iskindof ,createobjet ,et l'archivages d'ou mon choix...

  6. #6
    Membre confirmé Avatar de LapinGarou
    Homme Profil pro
    R&D Developer
    Inscrit en
    Octobre 2005
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D Developer
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 341
    Points : 479
    Points
    479
    Par défaut
    Bon je vais essayer d'être plus clair, c'est déjà pas mal compliqué quand on est dedans, alors expliquer...

    J'ai une combobox qui contient les groupes de message (configuration, etc). Elle remplit en fonction du groupe une autre combobox avec l'id des message. (CFG pour config generale, VID pour video...) là pas de probleme.
    Pour les paramètres communs, ils font partie de la fenetre principale. Pour les paramètres non communs, suivant l'id du message, je fais afficher au travers d'un CStatic le dialogbox correspondant à l'id du message avec la fameuse commande SetWindowPos().
    Ce coté la marche bien.
    Mais je voudrai simplifier le travail avec un array come décrit par FarScape, et ne pas avoir à stocker un pointeur pour chaque dialogbox dans ma classe principale (appelons la CPrincipale tiens). Pour le moment j'ai donc :
    Principale.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "SubCFG.h"
    #include "SubVID.h"
     
    class CPrincipale : public CPropertyPage
    {
        DECLARE_DYNAMIC(COwiQuery)
    //constructeurs et tutti quanti
    protected:
        CSubCFG *cfg;
        CSubCTL *ctl;
    ...}
    et dans OnInitDialog de CPrincipale:
    Principale.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    IMPLEMENT_DYNAMIC(COwiQuery, CPropertyPage)
     
    bool CPrincipale::OnInitDialog()
    {
    //...
        //initialisation des pointeurs
        cfg = new CSubCFG;
        cfg->Create(cfg->IDD, this);
     
        vid = new CSubVID;
        vid->Create(vid->IDD, this);
    //...
    }
    mais je vais avoir plus de 60 id de messages...


    J'espère que c'est un peu plus clair.

    D'autre part, comment faire pour par exemple: dans l'une dialogbox affichée dans mon CStatic, j'ai une CEdit. Comment récupérer le contenu du CEdit pour le faire afficher dans une CEdit de CPrincipale sans avoir à mettre un bouton ok/valider. Que le changement dans la "dialogchild" soit répercuté en temps réel dans le CEdit de la fenetre principale.

    Merci à tous.

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    tu peux faire la chose suivante:
    une classe mére (CSubRoot) pour tes CSubxxx avec une fonction virtuelle GetIDD() qui renvoie l'idd de la fenetre.
    cette fonction sera à redefinir pour chacune des classes CSubxxx.
    pour la creation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //CArray<CSubRoot *,CSubRoot *> m_arrayCSub;
    CSubRoot * pSub=new CSubCFG ;
    m_arrayCSub.Add( pSub);
    pSub->Create(pSub->GetIDD(), this);
     
    pSub= new CSubVID;
    m_arrayCSub.Add( pSub);
    pSub->Create(pSub->GetIDD(), this);
    deuxieme approche ,
    rappel :toutes tes classes doivent posséder les macros IMPLEMENT_SERIAL ou _DYNAMIC comme tu veux en s'en fout...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CRuntimeClass *tab[]={RUNTIME_CLASS(CSubCFG),
                                    RUNTIME_CLASS(CSubVID)};
     
    for(int i=0;i<sizeof(tab)/sizeof(CRuntimeClass *);i++)
    {
          pSub= static_cast< CSubRoot *>(tab[i]->CreateObject());
          pSub->Create(pSub->GetIDD(), this);
          m_arrayCSub.Add( pSub);
    }

  8. #8
    Membre confirmé Avatar de LapinGarou
    Homme Profil pro
    R&D Developer
    Inscrit en
    Octobre 2005
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D Developer
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 341
    Points : 479
    Points
    479
    Par défaut
    Merci, je vais essayer ça, je vous tiens au courant

    Et pour la seconde partie, à savoir récupérer les données dans les champs du dialog child ?

  9. #9
    Membre confirmé Avatar de LapinGarou
    Homme Profil pro
    R&D Developer
    Inscrit en
    Octobre 2005
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D Developer
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 341
    Points : 479
    Points
    479
    Par défaut
    Bon. J'ai créé une classe CMsg qui va me servir à gérer le tableau de pointeurs de CRuntimeClasse. Mais quand je compile, il ne trouve pas de valeur pour :
    "xxx->GetIDD()"

    J'ai créé une classe C++ et pas MFC. Manque t'il un paramètre ?

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    faudrait voir ce que tu as ecris pour répondre .....

  11. #11
    Membre confirmé Avatar de LapinGarou
    Homme Profil pro
    R&D Developer
    Inscrit en
    Octobre 2005
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D Developer
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 341
    Points : 479
    Points
    479
    Par défaut
    Voila Msg.h (ce n'est qu'un squelette, j'ai viré pas mal de trucs pour isoler le pb sur cfg seulement pour l'instant)
    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
    #include "SubCFG.h"
     
    class CMsg
    {
    public:
        CMsg(void);
    public:
        ~CMsg(void);
    public:
     
        CSubCFG            *cfg;
    public:
        bool InitPointers(void);
    public:
        bool KillPointers(void);
    };
    et le .cpp qui va avec (un truc maison, comme j'ai le meme probleme avec les CRuntimeClasse, j'ai voulu tester plus simplement, et ça donne pareil :
    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
    #include "MsgClasses.h"
     
    CMsg::CMsg(void)
    {
    }
     
    CMsg::~CMsg(void)
    {
    }
     
    bool CMsg::InitPointers(void)
    {
        cfg = new CSubCFG;
        cfg->Create(cfg->IDD, this);
     
        return false;
    } 
    bool CMsg::KillPointers(void)
    {
        delete cfg;
        return false;
    }
    C'est à la ligne "cfg->Create(cfg->IDD, this);" que la compil plante :
    IDD_SUBCFG n'existe pas,
    impossible de convertir de ' ' vers 'CWnd*'... pourtant c'est la meme methode que j'utilisais avec la tienne, déclaration des pointeurs un par un, qui marchait dans la classe principale, qui maintenant utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CMsg m_msg;
     
    //...initdialog()
    m_msg.InitPointers();
    //...
     
    //... fonction qui doit charger les messages groupés par types de parametres (params en commun quoi)
    m_msg.cfg->GetWindowRect(rc);
    //...calcul des coordonnées pour l'affichage centré
    m_msg.cfg->SetWindowPos(NULL, x, y, 0, 0, SWP_NOZORDER|SWP_NOSIZE);
    m_msg.cfg->ShowWindow(SW_SHOW);
    Il n'y a rien de spécial je pense, ça marchait sans passer par une classe intermédiaire (CMsg) et maintenant ça ne passe plus.

  12. #12
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    si il ne trouve pas IDD_SUBCFG c'est qu'il te manque include de "resource.h"
    qui est habituellement dans inclu dans le header de l'application (myApp.h)...

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/04/2019, 18h52
  2. Réponses: 2
    Dernier message: 27/04/2015, 23h10
  3. Vers un autre type de Mémoire ?
    Par Ododo dans le forum Actualités
    Réponses: 0
    Dernier message: 30/10/2014, 02h13
  4. Réponses: 8
    Dernier message: 03/09/2014, 22h23
  5. Réponses: 7
    Dernier message: 19/05/2012, 19h38

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