[C++] Boite de dialogue et saisie de string

Boite de dialogue et saisie de string [C++] - C++ - Programmation

Marsh Posté le 23-09-2003 à 16:00:25    

Rebonjour tous,
 
je vous jure que cette fois y aura pas de code moche ;)
 
mon probleme est simple, j'ai fait fonction qui saisie la string entrée dans une boite de dialogue dans une variable globale char TempString[20]. J'aimerai en fait que cette chaine finisse dans un tableau qui est declaré dans la fonction main et non pas en global. Le probleme c'est que j'ai essayé de passer mon tableau en argument de ma fonction DlgProc mais ca ne marche pas, je ne sais pas a quel niveau ; des que je rentre dans le gestionnaire de messages de la boite de dialogue l'adresse du tableau change... Je vous mets juste un extrait de code :
 

Code :
  1. char Nom[20];
  2. void GetName(char Nom[])
  3. {
  4.         hDlg=CreateDialog(hInstance,(LPCTSTR)ID_NAME,NULL,(DLGPROC)GetNameProc);
  5. SetFocus(hDlg);
  6. }
  7. BOOL CALLBACK GetNameProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam, char Nom[])
  8. {
  9.     switch (message)
  10.     {
  11.         case WM_COMMAND:
  12.             switch (LOWORD(wParam))
  13.             {
  14.                 case IDOK:
  15.                     if(GetDlgItemText(hDlg, IDC_NAME,TempString, 20))
  16.                     {
  17.                         for (i=0;i<20;i++)
  18.                         {
  19.                           Nom[i]= TempString[i];
  20.                         }
  21.                     }
  22.                 case IDCANCEL:
  23.                     EndDialog(hDlg, wParam);
  24.                     SetFocus(hWnd);
  25.                     return TRUE;
  26.             }
  27.     }
  28.     return FALSE;
  29. }


 
Voila j'espere que c'est pas trop crade et que vous pourrez m'aider.
 
Merci


Message édité par iceteapeche le 23-09-2003 à 16:02:39

---------------
Se souvenir des belles choses...
Reply

Marsh Posté le 23-09-2003 à 16:00:25   

Reply

Marsh Posté le 23-09-2003 à 16:16:19    

IceTeaPeche a écrit :

Rebonjour tous,
 
je vous jure que cette fois y aura pas de code moche ;)
 
mon probleme est simple, j'ai fait fonction qui saisie la string entrée dans une boite de dialogue dans une variable globale char TempString[20]. J'aimerai en fait que cette chaine finisse dans un tableau qui est declaré dans la fonction main et non pas en global. Le probleme c'est que j'ai essayé de passer mon tableau en argument de ma fonction DlgProc mais ca ne marche pas, je ne sais pas a quel niveau ; des que je rentre dans le gestionnaire de messages de la boite de dialogue l'adresse du tableau change... Je vous mets juste un extrait de code :
 

Code :
  1. char Nom[20];
  2. void GetName(char Nom[])
  3. {
  4.         hDlg=CreateDialog(hInstance,(LPCTSTR)ID_NAME,NULL,(DLGPROC)GetNameProc);
  5. SetFocus(hDlg);
  6. }
  7. BOOL CALLBACK GetNameProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam, char Nom[])
  8. {
  9.     switch (message)
  10.     {
  11.         case WM_COMMAND:
  12.             switch (LOWORD(wParam))
  13.             {
  14.                 case IDOK:
  15.                     if(GetDlgItemText(hDlg, IDC_NAME,TempString, 20))
  16.                     {
  17.                          for (i=0;i<20;i++)
  18.                         {
  19.                           Nom[i]= TempString[i];
  20.                         }
  21.                     }
  22.                 case IDCANCEL:
  23.                     EndDialog(hDlg, wParam);
  24.                     SetFocus(hWnd);
  25.                     return TRUE;
  26.             }
  27.     }
  28.     return FALSE;
  29. }


 
Voila j'espere que c'est pas trop crade et que vous pourrez m'aider.
 
Merci


 
 
strcpy non ?


Message édité par red faction le 23-09-2003 à 16:17:28
Reply

Marsh Posté le 23-09-2003 à 16:19:36    

a la limite le strcpy remplace mon for... Mais le pb c'est que l'adresse de Nom[] merde des qu'elle passe dans le Proc... je comprends pas pkoi y a aucune raison. :S  
En plus je suis obligé de faire la copie dans le Proc parceque sinon je n'ai aucun moyen de determiner si la fenetre est fermée ou pas, vu qu'il n'y a pas de programmation chronologique sur windows :'(


---------------
Se souvenir des belles choses...
Reply

Marsh Posté le 23-09-2003 à 16:49:50    

c'est koi cette DLGPROC avec un char* a la fin ? (char* ki a le meme nom ke ta globale au passage, d'ou la possible ratance)
 
c'est normal que la fct GetName() prenne un parametre 'Nom' qui est pas utilisé ?

Reply

Marsh Posté le 23-09-2003 à 16:52:34    

IceTeaPeche a écrit :

a la limite le strcpy remplace mon for... Mais le pb c'est que l'adresse de Nom[] merde des qu'elle passe dans le Proc... je comprends pas pkoi y a aucune raison. :S  
En plus je suis obligé de faire la copie dans le Proc parceque sinon je n'ai aucun moyen de determiner si la fenetre est fermée ou pas, vu qu'il n'y a pas de programmation chronologique sur windows :'(


 
ben une DLGPROC c'est :
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
alors rajouter un char* evidemment ca passe a la compilation grace au cast, mais ce que contient ce char* quand tu rentres dans la dlgproc, ca doit etre le mystere...

Reply

Marsh Posté le 23-09-2003 à 16:53:08    

nonononon
 
dslé c ma presentation qui est po claire ;)
 
Ma globale c'est TempString, Nom c'est ma variable de WinMain() que je veux egaliser a la saisie. Mais apparement je ne peux mettre dans GetTextDlg qu'une globale, alors j'essaye d'egaliser les deux variables apres.. mais pkoi l'adresse pointée par Nom change quand elle passe dans Proc?


---------------
Se souvenir des belles choses...
Reply

Marsh Posté le 23-09-2003 à 16:54:43    

Oki, voilou pkoi l'adresse de Nom merde
 
alors y a aucun moyen :S?
 
on ne peut stocker une saisie que dans une globale avec zindoz?


---------------
Se souvenir des belles choses...
Reply

Marsh Posté le 23-09-2003 à 16:56:40    

:o


Message édité par red faction le 23-09-2003 à 19:31:44
Reply

Marsh Posté le 23-09-2003 à 16:56:40    

Autre algo qui peut marcher c'est ne rendre la main a GetName() qu'une fois que EndDialog est executée...
 
C'est possible ca?
 
Svp, gourous du windows, repondez moi


---------------
Se souvenir des belles choses...
Reply

Marsh Posté le 23-09-2003 à 16:57:41    

IceTeaPeche a écrit :

Oki, voilou pkoi l'adresse de Nom merde
 
alors y a aucun moyen :S?
 
on ne peut stocker une saisie que dans une globale avec zindoz?


 
et oui, c'est comme ca...
d'ailleurs je te conseille de mettre tout en global.

Reply

Marsh Posté le 23-09-2003 à 16:57:41   

Reply

Marsh Posté le 23-09-2003 à 17:09:25    

IceTeaPeche a écrit :

Autre algo qui peut marcher c'est ne rendre la main a GetName() qu'une fois que EndDialog est executée...
 
C'est possible ca?
 
Svp, gourous du windows, repondez moi


 
t'as de la chance ke j'ai rien d'autre a faire...
 
utilise DialogBoxParam(), ki ne rend la main que quand tu fermes la DialogBox, et qui te permet de spécifier un parametre (un LPARAM donc ce ke tu veux). ce parametre se récupere dans ta dlgproc, ds le msg WM_INITDIALOG, ds la var lParam.
 
donc tu passes ton char* dans DialogBoxParam (dernier parametre), puis tu le sauvegardes dans le case WM_INITDIALOG, pour t'en re-servir plus tard.
 
bien sur y a d'autres solutions, mais en voila une...

Reply

Sujets relatifs:

Leave a Replay

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