Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
582 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [+/-MFC] Visibilité de variables et fenêtre fille

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[+/-MFC] Visibilité de variables et fenêtre fille

n°1001053
lolobreizh
Posté le 04-03-2005 à 17:23:25  profilanswer
 

Bonjour,
Je cherche à récupérer un membre d'une fenêtre dans sa fenêtre fille. Sauf que ça marche pas comme je voudrais.
 
La fenêtre parent Fen1 a un membre zEnv du type :

Code :
  1. class CEnvironment {
  2.    CString user;
  3.    CString pwd; }


Ce membre est initialisé dans le constructeur de Fen1 :

Code :
  1. CEnvironment::CEnvironment() {
  2.    user = "toto";
  3.    pwd = "titi"; }


Quand je récupère le pointeur vers Fen1 dans Fen2 comme le dit la faq :

Code :
  1. Fen1 *pDlg=(Fen1 *)GetParent();


Mais la variable (*pDlg).zEnv n'existe pas. (Access Violation) :

Code :
  1. CEnvironment zEnv = (*pDlg).zEnv;


Si vous avez une explication et comment je peux faire, ça m'aiderait beaucoup. Merci d'avance.
Cordialement,
Loïc

mood
Publicité
Posté le 04-03-2005 à 17:23:25  profilanswer
 

n°1001076
HelloWorld
Salut tout le monde!
Posté le 04-03-2005 à 17:38:40  profilanswer
 

Access violation, c'est plutot que pDlg est un pointeur nul.
Modifier le parent depuis les enfants c'est pas une bonne idée. Pourquoi tu veux accéder à zEnv ? Si c'est pour le consulter pourquoi tu le passes pas en paramètre à ta fenêtre 2 ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1001700
lolobreizh
Posté le 05-03-2005 à 12:16:39  profilanswer
 

Pour résumer, la Fenêtre 2 sert à saisir les valeurs du membre de Fenêtre 1 de type CEnvironment.
Je n'avais pas penser créer un nouveau constructeur en passant le membre en paramètre. Je vais essayer ça.
Merci !
Ceci dit, mon appel à Fen2 se fait ainsi :

Code :
  1. void Fen1::OnOK()
  2. {
  3.    Fen2 Dlg(this);
  4.    Dlg.DoModal();
  5. }


Je comprends donc pas que le pointeur puisse être nul...
Loïc

n°1001824
HelloWorld
Salut tout le monde!
Posté le 05-03-2005 à 16:49:15  profilanswer
 

Je sais pas, c'est peut être ailleurs, mais access violation c'est une erreur à l'exécution non ? Le debuger te dit pas où elle a lieu cette erreur ?
Car "la variable (*pDlg).zEnv n'existe pas" je comprends pas trop ce que tu veux dire.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1002010
lolobreizh
Posté le 05-03-2005 à 20:58:34  profilanswer
 

Oui, c'est l'erreur classique de l'accès à un pointeur nul.
Et ce que je comprends pas c'est pourquoi ce pointeur est nul alors que le membre zEnv est initialisé dans la Fenêtre1.
Loïc


Message édité par lolobreizh le 07-03-2005 à 10:40:42
n°1003843
IrmatDen
Posté le 07-03-2005 à 17:56:50  profilanswer
 

lolobreizh a écrit :

Pour résumer, la Fenêtre 2 sert à saisir les valeurs du membre de Fenêtre 1 de type CEnvironment.


Ca ne répondra pas au "pourquoi" de la question, mais te permettra peut-être de passer outre ton problème...
Si tu appelles Fen2 a partir de Fen1 pour initialiser l'un de ses membres (donc zEnv) tu devrais peut-être mieux récupérer tes données a la fin de l'appel Fen2. Donc pas de manipulation de pointeur et, d'après moi, un plus grand respect de l'encapsulation objet.
Cela te donnerait un appel du genre :

Code :
  1. void Fen1::OnOK()
  2. {
  3.    Fen2 Dlg(this);
  4.    // On initialise les donnees de Fen2 avec les valeurs actuelles
  5.    Dlg.user = zEnv.user;
  6.    Dlg.pwd = zEnv.pwd;
  7.    // La recuperation des donnees se fait comme tu le fais
  8.    // mais en enlevant la manipulation de la structure CEnvironment
  9.    int nRet = Dlg.DoModal();
  10.    // Et on modifie la structure en fonction du résultat de l'appel
  11.    if( nRet == IDOK )
  12.    {
  13.       zEnv.user = Dlg.user;
  14.       zEnv.pwd = Dlg.pwd;
  15.    }
  16. }

n°1003899
lolobreizh
Posté le 07-03-2005 à 19:10:40  profilanswer
 

Il me semblait que lorsque DoModal() est finie (ce qui est le cas quand on atteint le test [if( nRet == IDOK )] ), les champs de Dlg ne sont plus accessibles.
Je me trompe ?
Ceci résoudrait en effet le problème.
Sinon, j'ai contourné le problème en déclarant zEnv comme membre de la classe Application. Mais c'est pas très élégant.
Merci pour votre aide à tous.
Loïc

n°1003921
IrmatDen
Posté le 07-03-2005 à 19:24:37  profilanswer
 

Les champs ne sont plus accessible sous leur forme "éléments d'interface", je veux dire par là qu'on n'a plus accés aux pointeurs vers les LineEdit, ListCtrl, etc...
Mais il y un mécanisme qui garde la correspondance entre les éléments d'IU et les membres que tu cherche à lire c-a-d QString dans ton cas (mais ça peut être des int ou tout autre type de données).
Ca fait longtemps que j'ai pas touché les MFC, j'ai vu la lumière avec Qt ;). Je cherche donc le lien et je poste...
++


Message édité par IrmatDen le 07-03-2005 à 19:30:54
n°1003930
IrmatDen
Posté le 07-03-2005 à 19:32:56  profilanswer
 

et voilou je pense que tout les détails sont là :
http://c.developpez.com/faq/vc/?page=DoDataExchange


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [+/-MFC] Visibilité de variables et fenêtre fille

 

Sujets relatifs
ouverture petite fenetrepb pour declarer des variables
[MFC/C++] Problème d'initialisation de CListCtrl[VC++]Récupération de variables d'environnement
Passage de variables...avicap sans une GUI MFC
Image fixe dans un coin de la fenêtrefenetre parent/enfant et transfert de champ
Post d'un formulaire d'une fenetre fille vers une fenetre mère! 
Plus de sujets relatifs à : [+/-MFC] Visibilité de variables et fenêtre fille


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR