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 :

[Débutant VC++] passer un objet entre deux classe


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut [Débutant VC++] passer un objet entre deux classe
    Bonjour,

    j'ai beaucoup de mal à faire passer une chaine de caractère (chemin d'une photo sauvegarder) entre de classes.

    j'ai une boite dialogue (1ère classe) qui fait l'acquisition d'une image, dans une fonction membres (CaptureImage) cette classe 1 appelle une deuxième boite de dialogue (2ème classe) qui doit afficher cette image et son chemin de sauvegarde...

    dans cette fonstion membre, j'ai un char FileSave[256] qui contient le chemin de l'image capturer. J'aimerai par un moyen sûr et stable, pouvoir transmettre le contenu de cette objet (FileSave) à ma 2ème Classe pour pouvoir l'afficher...

    dans ma 2ème classe j'ai une fonction LoadImage(CString sFilePathName) qui s'occupe d'affiché mon image au bon endroit, et une fontion SetDlgItemText(IDC_CHEMIN_IMAGE_TEXT, sFilePathName) qui s'occupe d'afficher le chemin au bonne endroit.

    Y aurai-t-il quelqu'un qui pourrai m'aider à mettre en place un objet qui aurai une portée ou une durée de vie suffisante pour me permettre d'en finir avec ce problème !!!

    Merci

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    si tu fais attention à la portée de tes classes, c'est tres simple.

    Regarde cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class A  
    {
    public:
    	A();
    	char path[256];
     
    };
     
    A::A()
    {
    	strcpy(path,"c:\\test");
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class B  
    {
    public:
    	B();
    };
     
    B::B()
    {
    	A objA;
    	char lePath[256];
    	strcpy(lePath,objA.path);
    	printf("%s\n",lePath);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(int argc, char* argv[])
    {
    	B objB;
    	return 0;
    }
    ici le main, va instancier un objet B, qui, dans son constructeur va instancier un objet A, dont le path va etre initialisé dans son constructeur ; puis le constructeur de l'objet B va copier le contenu du path dans une variable locale puis l'afficher.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 681
    Points
    10 681
    Billets dans le blog
    3
    Par défaut
    Utilise une classe string / CString / ...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    merci pour vos réponses . mais, je manquais de précision.

    J'utilise une dll d'un fabricant de carte d'acquisition qui me fournis une fonction
    UranieBMPSave(hUranie, FileSave, &zp);
    Cette fontion utilise un char FileSave[256] pour sauvegarder le chemin de l'image, donc je ne peut pas le changer, à moin qu'il y a une possibilité de passer du char au Cstring?

    Quand a l'explication de Nico, c'est bien ce que j'ai fais dans mon code, mais le soucis, c'est que je programme sous VC++.net et que je n'ai pas de main, mais seulement des Cdialog qui communique entre elle, la première Cdialog (ClasseA) appelle la seconde Cdialog (ClasseB) grace à DoModale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     CImageSaved Dlg;
    	  Dlg.DoModal();
    et du coup je ne sais pas si mon objet peut être transmis avec DoModal()... d'ailleur s'il y a une autre solution pour appeler ma deuxième boite de dialogue sans DoModal (car ça ne m'arrange pas ), je suis partant.

    merci

  5. #5
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Salut,

    Tu peux passer du char * au CString sans problème, ensuite il suffit de passer ce CString au constructeur de ta 2eme CDialog.
    Le DoModal permet d'afficher une boite de dialog dite "Modal", ce qui veut dire qu'elle seule est active dans ton application. Tu peut afficher une boite de dialog non modale en appelant la méthode create puis la méthode ShowWindow sur ta dialog, c'est une dialog dite "Modeless".

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut
    merci à tous pour votre aide, mais j'ai enfin trouver le fin mot de l'histoire

    en fait, quand on ouvre une boite de dialogue à l'aide de DoModale(), il faut d'abord charger les controle, voir FAQ VC++ et MFC :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    CImageSaved Dlg;
    Dlg.m_BtStaticTest=FileSave;
    Dlg.DoModal();
    Comme ça, le chemin de l'image qui est dans FileSave est charger dans la variable m_BtStaticTest qui est membre de la seconde boite de dialogue. Je faisait malheureusement l'inverse, j'appelai d'abord la Classe CImageSaved et dans cette classe je créait un object mais qui ne prennait pas la valeur!!! maintenant, je peux utilisé la variable m_BtStatic pour affiché mon image sans problème.

    Encore merci pour vos conseille.

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

Discussions similaires

  1. Passer une QMap entre deux objets
    Par Zhitoune dans le forum Débuter
    Réponses: 4
    Dernier message: 31/08/2011, 19h05
  2. [C#][débutant] différence entre deux classes
    Par lerieure dans le forum C#
    Réponses: 5
    Dernier message: 03/05/2011, 17h49
  3. passer une variable entre deux classes as3
    Par sanatou dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 27/06/2008, 21h52
  4. Passage d'un objet entre deux classes
    Par ericlemoustic dans le forum Langage
    Réponses: 2
    Dernier message: 13/10/2006, 09h58
  5. Réponses: 7
    Dernier message: 30/12/2004, 12h01

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