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

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

Marsh Posté le 04-03-2005 à 17:23:25    

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

Reply

Marsh Posté le 04-03-2005 à 17:23:25   

Reply

Marsh Posté le 04-03-2005 à 17:38:40    

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
Reply

Marsh Posté le 05-03-2005 à 12:16:39    

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

Reply

Marsh Posté le 05-03-2005 à 16:49:15    

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
Reply

Marsh Posté le 05-03-2005 à 20:58:34    

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
Reply

Marsh Posté le 07-03-2005 à 17:56:50    

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. }

Reply

Marsh Posté le 07-03-2005 à 19:10:40    

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

Reply

Marsh Posté le 07-03-2005 à 19:24:37    

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
Reply

Marsh Posté le 07-03-2005 à 19:32:56    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed