[wxWidgets] Communication entre les fenetres

Communication entre les fenetres [wxWidgets] - C++ - Programmation

Marsh Posté le 27-12-2005 à 16:27:03    

bonjour,
 
J'ai un simple programme en C++ utilisant wxWidgets. La Frame principale permet d'ouvrir une boite de dialogue de configuration ressemblant à ceci :
http://www.pixee.net/mini/paramconnect.jpg
 
Lorsque l'on clique sur OK, je veux pouvoir enregistrer les modifications dans un fichier, et que la Frame principale puisse lire la configuration, que ce soit juste après la validation des paramètres ou au démarrage du programme.
 
Je ne demande pas de code, mais plutôt la méthode pour faire tout ca.
Est-ce la fenêtre fille qui écrit dans le fichier, ou la parente ? Dans le premier cas, comment la parente lit-elle les paramètres de connexion ? Dans le second cas, comment la fille transmet-elle les données à la fenêtre parente ?
 
Merci :jap:

Message cité 1 fois
Message édité par ritzle le 27-12-2005 à 16:27:47
Reply

Marsh Posté le 27-12-2005 à 16:27:03   

Reply

Marsh Posté le 27-12-2005 à 17:24:42    

ritzle a écrit :

bonjour,
 
J'ai un simple programme en C++ utilisant wxWidgets. La Frame principale permet d'ouvrir une boite de dialogue de configuration ressemblant à ceci :
http://www.pixee.net/mini/paramconnect.jpg
 
Lorsque l'on clique sur OK, je veux pouvoir enregistrer les modifications dans un fichier, et que la Frame principale puisse lire la configuration, que ce soit juste après la validation des paramètres ou au démarrage du programme.
 
Je ne demande pas de code, mais plutôt la méthode pour faire tout ca.
Est-ce la fenêtre fille qui écrit dans le fichier, ou la parente ? Dans le premier cas, comment la parente lit-elle les paramètres de connexion ? Dans le second cas, comment la fille transmet-elle les données à la fenêtre parente ?
 
Merci :jap:


tu pourrais passer tes parametres par reference dans le constructeur de ta boite de dialogue:
par exemple:
 

Code :
  1. class Dialog : public wxDialog
  2. {
  3. public:
  4.     Dialog(wxWindow* parent, wxWindowID id, const wxString& title, Taclass &data );
  5. .....
  6. .....


 
puis lorsque tu clique ok dans la boite de dialogue tu en profites pour les enregistrer dans un fichier,tu refiles toutes les données dans data que tu recuperes alors dans la mainframe. et voilou.
 
qu'en penses tu?
 
 

Reply

Marsh Posté le 27-12-2005 à 17:29:41    

pas mal, mais quand je démarre le programme (donc la fenetre fille n'est pas appelée), comment je récupère les données depuis la mainframe ? Si je dois lire dans le fichier, alors autant le faire systématiquement plutôt que de passer les paramètres par référence

Message cité 1 fois
Message édité par ritzle le 27-12-2005 à 17:35:06
Reply

Marsh Posté le 27-12-2005 à 17:46:51    

ritzle a écrit :

pas mal, mais quand je démarre le programme (donc la fenetre fille n'est pas appelée), comment je récupère les données depuis la mainframe ? Si je dois lire dans le fichier, alors autant le faire systématiquement plutôt que de passer les paramètres par référence


 
comprend pas bien  :??:  :??:  
si ta boite de dialogue n'est pas appelée au demarrage, elle n'existe pas, donc pas possible d'y lire les données, non?
 
moi je ferais un test au demarrage pour voir si ton fichier de config existe. si il existe, tu y lis les données, sinon tu lance automatiquement la boite de dialogue.
 
je pense qu'il est preferable de passer les données par references malgré tout car cela doit etre plus rapide et efficace que de relire dans le fichier que tu auras créé.
 

Reply

Marsh Posté le 28-12-2005 à 22:38:26    

Je vais faire comme tu me l'as suggéré, merci pour ton aide.
 
J'ai encore un problème, c'est pour les boutons radio. Pour l'instant tous mes boutons radio ont l'air reliés entre eux, quand je coche l'un d'eux les autres se décochent, or je veux plusieurs "zones"
J'utilise la classe wxRadioButton, mais à priori il faut d'abord utiliser wxRadioBox, le problème est que je ne sais pas comment faire, la documentation est minable et je n'ai pas trouvé d'exemple de code qui pourrait m'aider. Quelqu'un pourrait m'expliquer ?

Reply

Marsh Posté le 29-12-2005 à 07:49:06    

ritzle a écrit :

Je vais faire comme tu me l'as suggéré, merci pour ton aide.
 
J'ai encore un problème, c'est pour les boutons radio. Pour l'instant tous mes boutons radio ont l'air reliés entre eux, quand je coche l'un d'eux les autres se décochent, or je veux plusieurs "zones"
J'utilise la classe wxRadioButton, mais à priori il faut d'abord utiliser wxRadioBox, le problème est que je ne sais pas comment faire, la documentation est minable et je n'ai pas trouvé d'exemple de code qui pourrait m'aider. Quelqu'un pourrait m'expliquer ?


 
pour pouvoir creer plusieurs groupes de radiobutton, il suffit de preciser  wxRB_GROUP en creant le bouton:
exemple:

Code :
  1. RadioBouton1 = new wxRadioButton(this,id_bt1,"Un",wxPoint(10,10), wxDefaultSize,wxRB_GROUP);
  2. RadioBouton2 = new wxRadioButton(this,id_bt2,"Deux",wxPoint(10,30));
  3. //1 et 2 sont dans le meme groupe. on ne peut qu'en choisir un parmi les 2
  4. RadioBouton3 = new wxRadioButton(this,id_bt3,"Trois",wxPoint(10,50), wxDefaultSize,wxRB_GROUP);
  5. // 3 est dans un 2eme groupe,il peut etre selectionné en plus de 1 ou 2


 
c'est dans la doc de wxWidgets, pas si mal faite que ca :hello:


Message édité par sankukai8 le 29-12-2005 à 07:55:00
Reply

Marsh Posté le 29-12-2005 à 10:56:36    

Je te remercie. On va mettre ça sur le fait que je ne suis pas encore très à l'aise avec wxWidgets :ange:

Reply

Marsh Posté le 02-01-2006 à 01:03:58    

sankukai8 a écrit :


Code :
  1. class Dialog : public wxDialog
  2. {
  3. public:
  4.     Dialog(wxWindow* parent, wxWindowID id, const wxString& title, Taclass &data );
  5. .....
  6. .....


 
puis lorsque tu clique ok dans la boite de dialogue tu en profites pour les enregistrer dans un fichier,tu refiles toutes les données dans data que tu recuperes alors dans la mainframe. et voilou.


Maintenant j'ai un problème avec la récupération des données dans la mainframe.
J'ai cree un evenement lors du clic sur OK, qui execute la fonction OnOK (void Dialog:: OnOK(wxCommandEvent& event); ) sensée modifier les données dans data. Le problème c'est que ma fonction ne connait pas l'objet data, vu que c'est uniquement au constructeur qu'il est transmis.
 
Comment dois-je faire ?

Reply

Marsh Posté le 02-01-2006 à 01:11:10    

Code :
  1. class Dialog : public wxDialog
  2. {
  3. public:
  4.     Dialog(wxWindow* parent, wxWindowID id, const wxString& title, Taclass &data );
  5.     Taclass data;
  6. .....
  7. .....


Avec ce code toute ma classe Dialog "voit" l'objet data et ses données, mais quand je retourne à la mainframe rien n'a changé pour elle.
Est-ce que je suis sur la bonne voie ou je me plante complètement ?

Message cité 1 fois
Message édité par ritzle le 02-01-2006 à 01:11:41
Reply

Marsh Posté le 02-01-2006 à 07:37:51    

ritzle a écrit :

Code :
  1. class Dialog : public wxDialog
  2. {
  3. public:
  4.     Dialog(wxWindow* parent, wxWindowID id, const wxString& title, Taclass &data );
  5.     Taclass data;
  6. .....
  7. .....




Que fait le Taclass data; ici? tu redefinis un objet Taclass alors qu'il est deja passé par reference dans le constructeur. il ne doit pas y etre. tu as acces a data directement sans le redefinir.
 
poste un extrait de ton code pour voir plus precisement

Reply

Marsh Posté le 02-01-2006 à 07:37:51   

Reply

Marsh Posté le 02-01-2006 à 11:38:19    

voilà la partie concernée :
 

Code :
  1. Dialog::Dialog(wxWindow* parent, wxWindowID id, const wxString& titre, Config &data )
  2.                   : wxDialog(parent,id,titre,wxDefaultPosition,wxSize(240, 500))
  3. {
  4.    
  5.     //J'ai acces sans probleme à data
  6.     data.SetPseudo( wxT("Truc" ) );
  7.    
  8. }
  9. void Dialog::OnOK(wxCommandEvent& event)
  10. {
  11.    
  12.     //Mais ici le compilateur me dit : 'data' undeclared
  13.     data.SetPseudo( wxT("Machin" ) );
  14.    
  15. }


 
en fait je n'ai pas accès à l'objet 'data' dans les méthodes de 'Dialog'

Reply

Marsh Posté le 02-01-2006 à 12:51:21    

Code :
  1. void Dialog::OnOK(wxCommandEvent& event)
  2. {
  3.    
  4.     //Mais ici le compilateur me dit : 'data' undeclared
  5.     data.SetPseudo( wxT("Machin" ) );
  6.    
  7. }


normal, car data ne fait pas partie de Dialog.Mais cette partie ne sert a rien. En effet lorsque tu construis ta boite de dialogue, tu devrais plutot faire:

Code :
  1. Dialog dialog(NULL,-1,"Titre",data);
  2.      if ( dialog.ShowModal() == wxID_OK ) // ceci est true si tu appuies sur le bouton ok
  3.          {
  4.         //ici tu as acces a data sans probleme   
  5.          }


note: tu n'es meme pas obligé de passer data par reference, car lorsque tu appelles dialog.showmodal, tu dois normalement te trouver dans une des methodes de la mainframe, et donc tu dois avoir ton data deja créé dans la mainframe qui est accessible.


Message édité par sankukai8 le 02-01-2006 à 12:51:37
Reply

Marsh Posté le 02-01-2006 à 12:59:37    

C'est ce que j'ai fait, mais je veux recuperer les données tapées par l'utilisateur dans 'dialog'
à la limite je peux faire :

Code :
  1. Dialog dialog(NULL,-1,"Titre",data);
  2. if ( dialog.ShowModal() == wxID_OK ) // ceci est true si tu appuies sur le bouton ok
  3. {
  4.        
  5.         data.SetPseudo( dialog.ChampPseudo1->GetValue() );
  6.        
  7. }


mais ca suppose que le wxTextCtrl *ChampPseudo1 soit public (et ce n'est pas très "propre" à priori...)


Message édité par ritzle le 02-01-2006 à 13:00:22
Reply

Marsh Posté le 02-01-2006 à 13:16:49    

Code :
  1. Dialog::Dialog(wxWindow* parent, wxWindowID id, const wxString& titre )
  2.                  : wxDialog(parent,id,titre,wxDefaultPosition,wxSize(240, 500))
  3. {
  4. // tout ce qu'il faut
  5. }
  6. void Dialog::GetValue(Config &shmurtz)
  7. {
  8.    
  9.    shmurtz.SetPseudo( wxT("Machin" ) );
  10. //remplis ton shmurtz de tout ce qu'il faut
  11.    
  12. }


 
puis  

Code :
  1. Dialog dialog(NULL,-1,"Titre" );
  2.       if ( dialog.ShowModal() == wxID_OK )
  3.       {
  4.             dialog.GetValue(data) ;
  5. // data est defini dans la mainframe
  6.       }



Message édité par sankukai8 le 02-01-2006 à 13:17:44
Reply

Marsh Posté le 02-01-2006 à 14:00:12    

parfait, merci beaucoup :)

Reply

Sujets relatifs:

Leave a Replay

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