MFC : les pointeurs sur Doc c'est de la m....?

MFC : les pointeurs sur Doc c'est de la m....? - C++ - Programmation

Marsh Posté le 12-03-2003 à 09:21:06    

L'utilisateur saisi son username dans une boite de dialogue. Cet username sera utilise dans tout le reste du pgm, mais pour ne pas qu'il doive le ressaisir dans chaque boite de dialogue, je voudrai le sauver dans une variable du document.
=>
dans le document (CCASDoc)
CString SaveUserName;
 
dans ma boite de dialogue ou il le saisi :
UpdateData(TRUE);    
AfxMessageBox((CString)"avant" );
CCASDoc* ptr_doc->SaveUserName = this.m_UserName;
AfxMessageBox((CString)"apres" );
 
L'affichage de "avant" se fait mais je ne voit jamais arriver l'affichage de "apres", bon sang!  
Y aurait-il pas un ptit truc que j'ai betement oublie de faire?
 

Reply

Marsh Posté le 12-03-2003 à 09:21:06   

Reply

Marsh Posté le 12-03-2003 à 10:30:59    

deja il faut proteger ses variables!
donc
private:
CString SaveUserName;
 
puis creer une methode get/set
 
void CCASDoc::SetSaveUserName(CString strName)
{
   SaveUserName = strName;
}
 
CString CCASDoc::GetSaveUserName()
{
   return strName;
}
 
 
puis dans ta vue par exemple tu as surement la methode .. GetDocument();
sinon je te conseille de la passer dans ton constructeur par exemple..
 
 
UpdateData(TRUE);
AfxMessageBox("avant" );
ptr_doc->SetUserName(m_UserName);
AfxMessageBox("apres" );
 
pour ton soucis (??)
1. tu crees un pointeur doc .. mais l'as tu initialiser???
(pas d'allocation memoire apparement)
2. creer un pointeur doc mais il faudrait le relier à ton doc deja existant (ce qui n'est pas non plus le cas)
3. tu alloues directement à une variable une valeur (à ne pas faire)
4. tu as de la chance que ca explose pas (si ce n'est pas le cas)
 
alors tu pourrais faire
 
CCASDoc* ptr_doc = new CCASDoc();
ptr_doc->SetSaveUserName(m_UserName);
AfxMessageBox(ptr_doc->GetSaveUserName());
del ptr_doc;
 
ou
ptr_doc = .. (dans le constructeur de ta boite de dialogue tu fais passer un pointeur du doc)

Reply

Marsh Posté le 12-03-2003 à 10:43:48    

Oui, en effet cette solution me parait bien meilleure mais comment fais tu pour passer un pointeur sur le Doc a ta boite de dialogue??
 
DlgLogin.DoModal();//on le passe comment le pointeur sur doc?
                   //et comment on l'initialise alors?
 
et dans le constructeur de la boite?:

Code :
  1. CDlgLogin::CDlgLogin(CWnd* pParent /*=NULL*/,CCASDoc* pdoc)
  2. : CDialog(CDlgLogin::IDD, pParent)
  3. {
  4. //{{AFX_DATA_INIT(CDlgLogin)
  5. m_UserName = _T("" );
  6. //}}AFX_DATA_INIT
  7.        ptr_doc = pdoc;}


 

Reply

Marsh Posté le 12-03-2003 à 10:56:27    

alors si je refais un nouveau constructeur pour ma boite
CDlgLogin::CDlgLogin(CCASDoc * pdoc)
{
 this->ptr_doc=pdoc;
}
et je l'apelle :  
CDlgLogin dlglogin = new CDlgLogin((CWnd*)this);
dlglogin.DoModal();
 
et pour mettre le username :  
AfxMessageBox((CString)"avant pdoc" );
ptr_doc->SetSaveUserName(m_UserName);
AfxMessageBox((CString)"apres pdoc" );
 
et ben non, ca m'affiche "avant" mais pas "apres". Le pgm se fige.
 

Reply

Marsh Posté le 12-03-2003 à 11:03:26    

Euh  
 

Code :
  1. CCASDoc* ptr_doc = new CCASDoc();
  2. ptr_doc->SetSaveUserName(m_UserName);
  3. AfxMessageBox(ptr_doc->GetSaveUserName());
  4. del ptr_doc;


 
tu crees un nv Doc et tu le detruit apres donc l'interet pour qu il soit persistant ;)
 
Sinon, ta dlg est cree et appelee de quelle classe ?
- Si une vue le plus simple c est de faire effectivement un GetDocument ds ta Dlg, ce qui donerait un truc du genre (et avec comme viper de l'a indique une Set/Get ds ton Doc.

Code :
  1. UpdateData(TRUE);
  2. // m_UserName init avec valeur entree
  3. CTonDoc* pDoc = (CTonDoc*)(((CView*)GetParent())->GetDocument());
  4. if (pDoc)  pDoc->SaveUserName(m_UserName);


 
- Si pas d'une vue ben depend de la classe de base, mais en suivant les GetParent on peut sans pb.


Message édité par VisualC++ le 12-03-2003 à 11:14:59
Reply

Marsh Posté le 12-03-2003 à 11:04:18    

Ton AfxMessage Box tu l'appeles ou ca ds ta Dlg ?
 
Puis une autre chose, le constructeur rajoute un param mais supprime pas le parent de type CWnd*


Message édité par VisualC++ le 12-03-2003 à 11:05:13
Reply

Marsh Posté le 12-03-2003 à 11:30:27    

je l'apelle depuis la vue.

Code :
  1. void CCASView::OnFileIdentification()
  2. {
  3. // TODO: Add your command handler code here
  4. CDlgLogin dlglogin;
  5. dlglogin.DoModal();
  6. }


 
et dans ma boite de dialogue :

Code :
  1. AfxMessageBox((CString)"avant" );
  2.     CCASDoc* pDoc = (CCASDoc*)(((CView*)GetParent())->GetDocument());
  3. if (pDoc)
  4. {
  5. AfxMessageBox((CString)"dans if" );
  6. pDoc->SetSaveUserName(m_UserName);
  7. }
  8. ((CString)"apres" );


 
et la encore une fois, j'ai l'affichage de "dans if" mais pas celui de "apres".
Je comprends pas la!
 
 
J'ai aussi essaye de passer le pointeur dans le constructeur de la boite mais ca ne va pas.

Reply

Marsh Posté le 12-03-2003 à 11:34:56    

Euh certe mais au debug tu passe dans le if ou pas en pas a pas ?
 
Car la tu te bases sur un MessageBox qui peut ne pas s afficher pour d autre raison
 
Sinon tu fais ce code ou ca ? Dans ton OnClose (ou OnOk) ?

Reply

Marsh Posté le 12-03-2003 à 11:50:55    

je l'ai dans un simple bouton.
 
Mais ce n'est surement pas un probleme de AfxMessageBox car je peux me retourner dans toutes les positions et ce probleme arrive toujours lorsque je manipule un pointeur sur Doc. Ce serait quand meme une drole de coincidence si ce n'etait pas ca.
 
Et je passe dans le if puisqu'il m'affiche "dans if".
Maintenant pour le debug ce n'est pas possible car je ne peux pas executer le pgm sur la machine ou je le developpe.

Reply

Marsh Posté le 12-03-2003 à 12:02:02    

Oki desole pour le If j avais pas tout lu
 
Par contre si il trouve bien le SaveUserName() normalement c bien sur le Doc de ton appli qu il pointe, et donc ton Cstring SaveUserName dans le doc doit etre bien sette avec la bonne valeur.
 


Message édité par VisualC++ le 12-03-2003 à 12:02:26
Reply

Marsh Posté le 12-03-2003 à 12:02:02   

Reply

Marsh Posté le 12-03-2003 à 12:13:06    

VisualC++ a écrit :

Oki desole pour le If j avais pas tout lu
 
Par contre si il trouve bien le SaveUserName() normalement c bien sur le Doc de ton appli qu il pointe, et donc ton Cstring SaveUserName dans le doc doit etre bien sette avec la bonne valeur.


 
oui peut-etre mais le probleme n'est pas la.
Le probleme c que mon programme n'execute pas la suite du code qui se trouve apres  

Code :
  1. pDoc->SetSaveUserName(m_UserName);


Comme si ca le bloquait.
 
Quant a savoir si la valeur est settee correctement, je ne le saurait qu'apres avoir resolut le probleme.

Reply

Marsh Posté le 12-03-2003 à 12:24:56    

Tu peux essayer de faire autre chose pour voir sinon
 
CString m_csUserTemp de type public ds ta dlg
 
Au moment de fermer la dialog  

Code :
  1. UpdateData(TRUE);
  2. m_csUserTemp = m_UserName;


 
et ds ta vue

Code :
  1. CDlgLogin dlglogin;
  2. dlglogin.DoModal();
  3. ((CTonDoc*)GetDocument())->SetSaveUserName(dlg.m_csUserTmp);


 
PS : t es oblige de passe par variable temp, car le CString attache a ton EditBox (enfin je suppose que c ce que tu as fait) est detruit et n'est plus valide au moment de la fermeture de la dlg, alors que les variable propre definie existe encore.

Reply

Marsh Posté le 12-03-2003 à 12:38:51    

MON HERO.   :sweat:  :love:   :jap:  
Ca semble bien fonctionner comme ca. Je vais continuer comme ca pour la suite.  
Quelle idee lumineuse de passer par la vue pour reprendre une donnee membre de la dlg! Mais pourquoi j'ai pas pense a ca plus tot moi??  :(  
C'est quand meme bien d'etre intelligent.

Reply

Marsh Posté le 12-03-2003 à 12:45:16    

De rien :jap:
J'utilise pas mal comem ca quand bcp de parm a sauvegarder niveau vue/doc
 
Mais bon louche quand mm que ton Doc soit inaccessible de ta dlg :)

Reply

Marsh Posté le 12-03-2003 à 13:26:02    

oui et maintenant si c pas exagere, t'as pas une idee pour reprendre mon username (qui est stocke dans le Doc) a partir d'une autre boite de dialogue? Ca fait comme avant, bloque

Code :
  1. CCASDoc* pDoc = (CCASDoc*)(((CView*)GetParent())->GetDocument());
  2. AfxMessageBox((CString)"avant" );
  3. CString TempUserName =pDoc->GetSaveUserName();
  4. AfxMessageBox((CString)"vous etes : " +TempUserName);


 
Y m'affiche pas qui c'est.  :pfff:  

Reply

Marsh Posté le 12-03-2003 à 13:35:00    

Deja juste un truc pour les CString
 
CString("Vous etes" ) c est mieu que (Cstring)"vous etes" ca te contruit reelement un objet CString (utile si passage par ref)
 
Quand tu dis il t affiche pas, c comme avant ca bloque ou il te marque "Vous etes"
Si ca bloque ben de la mm facon alors
 
Tu definie des var temp ds la dlg
et puis

Code :
  1. CDialog dlg;
  2. dmg.m_csUserTemp= pDoc->Get....();
  3. dlg.DoModal()


 
et dans le OnInitDialog de ta dlg (et pas ds le constructeur)

Code :
  1. m_Username = m_csUserTemp;
  2. etc ...
  3. UpdateData(FALSE);

Reply

Marsh Posté le 12-03-2003 à 13:57:52    

c'est exactement ca. Bonne reponse de Monsieur ...
 
Ben dites donc , j'en aurai appris des choses today.
 
Merci  :)  :jap:

Reply

Marsh Posté le 12-03-2003 à 13:59:06    

dr  :)

Reply

Marsh Posté le 12-03-2003 à 23:13:09    

et c'est là que j'interviens pour te dire de passer par des methode get/set pour recuperer des valeurs de variable :)
 
 
OnMonboutton()
{
  CAuthDlg *pDlg = new CAuthDlg();
  if(pDlg->DoModal()==IDOK)
  {
     GetDocument()->GetUserName(pDlg->GetUserName);
     GetDocument()->GetPasswd(pDlg->GetPasswd);
  }
 
  del pDlg;
}
 
en gros c'est comme ca qu'on devrait s'y prendre pour etre reglo
 
par defaut avec les MFC les variables sont publiques et ce n'est pas bien dutou' dutou' dutou'
 

Reply

Marsh Posté le 12-03-2003 à 23:38:34    

Tt a fait, cependant je redit gaffe en faisant un pDlg->GetParam() apres le DoModal si le GetParam recup la variable corerspondant directement a un control comme le CEdit, car il existe plus enfin n est plsu valable apres le DoModal (d ou passer par var temporaire qui elle peuvent etre privee)


Message édité par VisualC++ le 12-03-2003 à 23:40:06
Reply

Marsh Posté le 13-03-2003 à 00:00:22    

exact!!! :)

Reply

Marsh Posté le 13-03-2003 à 08:01:42    

okay, j'ai pige.
Mon pgm va deja ressembler un peu plus a un pgm avec ca!
 :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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