Passer une variable d'une fenêtre à une autre

Passer une variable d'une fenêtre à une autre - C++ - Programmation

Marsh Posté le 17-02-2003 à 21:23:38    

Bonsoir,
 
Alors voilà mon problème:
 
Je travaille avec Borland C++ Builder, et dans le fichier .cpp de ma fenêtre principale, je vais chercher des infos dans un fichier .ini
 

Code :
  1. TIniFile *ConfIni;
  2.         ConfIni = new TIniFile(ChangeFileExt(Application->ExeName,".ini" ));
  3.         INIRepEquipes = ConfIni->ReadString("Options","RepEquipes",ExtractFileDir(Application->ExeName) + "\\Equipes" );
  4.         INIRepStats = ConfIni->ReadString("Options","RepStats",ExtractFileDir(Application->ExeName) + "\\Stats" );
  5.         delete ConfIni;
  6.         ShowMessage(INIRepEquipes);


 
Bon, là ca marche, j'arrive à récupérer et à afficher INIRepEquipes par exemple.
 
Là où ça marche plus, c'est que j'ouvre une nouvelle fenêtre où je dois récupérer ces valeurs issues du INI, et là ça marche pas.
 
Code pour l'ouverture de la fenêtre:

Code :
  1. EditEquipeForm = new TEditEquipeForm(this);
  2. EditEquipeForm->ShowModal();
  3. delete EditEquipeForm;


 
Et quand j'utilise la variable INIRepEquipes, il me met l'erreur suivante:
 
Symbole 'INIRepEquipes' non défini
 
Pourtant je fais bien un include du .h de la fenêtre principale, là où sont déclarés ces fameuses variables:
 

Code :
  1. AnsiString NomFichier,INIRepEquipes,INIRepStats;


 
Quand je tente de redéfinir ces valeurs dans le .h de la nouvelle fenêtre, elles ont perdu leur valeur.
 
Comment je peux faire passer des variables d'une fenêtre à une autre?
 
Merci d'avance!!

Reply

Marsh Posté le 17-02-2003 à 21:23:38   

Reply

Marsh Posté le 17-02-2003 à 21:42:49    

Pour passer des variables d'une classe à l'autre, il faut écrire des fonctions get/set !
 
Ainsi, dans ta classe de fenêtre principale, tu écris une fonction du genre :
 

Code :
  1. AnsiString Fenetre::getVariable()
  2. {
  3.    return INIRepEquipes;
  4. }


 
Et dans la classe de ta fenêtre fille, tu appelles tout simplement cette fonction :
 

Code :
  1. AnsiString INIRepEquipes = parent->getVariable();


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-02-2003 à 22:58:32    

Merci beaucoup!!
 
Dur dur d'apprendre le C++ sur le tas... :sarcastic:  :whistle:

Reply

Marsh Posté le 17-02-2003 à 23:11:54    

Et dans le même ordre d'idées, comment tu modifierais cette fonction pour qu'elle ne se limite pas juste à INIRepEquipes?
 
Je ne sais pas encore passer de paramètres à une fonction, donc là je patauge un peu... :(  
 
Parce que j'imagine que si une fenêtre doit envoyer plusieurs variables, on code pas autant de fonctions que de variables?
 
Pour qu'elle fasse (je pense pas que ce soit bon):
 

Code :
  1. AnsiString Fenetre::getVariable(VariableAEnvoyer)
  2. {
  3.   return VariableAEnvoyer;
  4. }


 
Mais également pas seulement pour les AnsiString, mais pour tout!
 
Parmi bool, void (je sais même pas comment on appelle ça :??: :lol: ), lequel est adapté pour tous?
 
Et par la suite, la réception de cette variable:
 

Code :
  1. AnsiString VariableARecevoir= parent->getVariable(VariableAEnvoyer);


 
Merci d'avance!! :jap:

Reply

Marsh Posté le 18-02-2003 à 02:58:58    

Dans une classe, il vaut mieux toujours imposer de passer par des methodes get/set que d'offrir un acces direct à une propriété, même s'il n'y a aucune contrainte sur cette propriété.
ex :

Code :
  1. class A
  2. {
  3. public:
  4.     int Valeur;
  5. };
  6. //mieux vaut utiliser :
  7. class A
  8. {
  9. public:
  10.     inline int  GetValeur( void ) { return _Valeur; }
  11.     inline void SetValeur( int V ) { _Valeur = V; }
  12. private:
  13.     int _Valeur;
  14. };


 
La 2° solution est bcp plus évolutive.
Car si, soudain, pour une version XXX de ta classe, tu as besoin de mettre une contrainte sur Valeur ( >0 par exemple) ou changer son type, avec la première solution, les millions de lignes de codes qui utilisent ta classe devront être modifiées avec la première version, alors que seule ta classe le devra avec la 2°.
Exemple : changer Valeur en double.

Code :
  1. class A
  2. {
  3. public:
  4.     inline int    GetValeur( void ) { return int( _Valeur ); }
  5.     inline void   SetValeur( int V ) { _Valeur = double( V ); } // hihi, double V ! :)
  6.     inline double GetValeur( void ) { return _Valeur; }
  7.     inline void   SetValeur( double V ) { _Valeur = V; }
  8. private:
  9.     double _Valeur;
  10. };


Et voila, tout code basé sur l'ancienne version compile sans erreur/warning avec cette nouvelle.
Ca c'etait la parenthese.
Pour passer un param à une fonction, rien de sorcier :
tu mets le type du paramètre suivi de son nom dans les parenthèses.
Si y'a plusieurs paramètres, tu les sépare par de virgules.

Code :
  1. void Fonction( int P1, char P2, float P3 );


Tu les utilises dans la fonction comme des variables classiques.
 

Citation :

Parce que j'imagine que si une fenêtre doit envoyer plusieurs variables, on code pas autant de fonctions que de variables?


 
Qu'entends-tu par envoyer ?
Tu veux surement dire renvoyer la valeur de plusieurs de ses propriétés.
Dans ce cas oui, il vaut mieux faire une methode par propriété.
Car si on n'en veut qu'une, ça impose de quand meme demander les autres.

Code :
  1. Fenetre F;
  2. int a = F.GetA();
  3. int b = F.GetB();
  4. int c = F.GetC();
  5. // c'est pas tellement différent de :
  6. a = F.a;
  7. b = F.b;
  8. c = F.c;
  9. // si ça t'embête vraiment, tu peux faire
  10. F.GetABC( a, b ,c );
  11. // mais personnelement je te le déconseille


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 18-02-2003 à 10:32:08    

Donc dans la fenêtre enfant, il vaut mieux récupérer la variable INIRepEquipes de cette manière:
 

Code :
  1. AnsiString INIRepEquipes = MainForm->GetVariable();


 
que comme ceci:
 

Code :
  1. AnsiString INIRepEquipes = MainForm->INIRepEquipes;


 
C'est bien ça?
 
Et donc le fichier H de ma fenêtre prinicpale, comment se passent les déclarations?
Moi j'ai ça:
 

Code :
  1. private: // Déclarations de l'utilisateur
  2. public:  // Déclarations de l'utilisateur
  3.         int temps,Nombre;
  4.         AnsiString NomFichier,INIRepEquipes,INIRepStats;
  5.         __fastcall TMainForm(TComponent* Owner);
  6.         bool __fastcall IniExist();
  7.         bool __fastcall XMLEquipeExist();
  8.         AnsiString GetVariable();


 
Si j'ai compris, je devrais donc plutôt avoir quelque chose du genre:
 

Code :
  1. private: // Déclarations de l'utilisateur
  2. AnsiString INIRepEquipes,INIRepStats;
  3. public:  // Déclarations de l'utilisateur
  4.         int temps,Nombre;
  5.         AnsiString NomFichier;
  6.         __fastcall TMainForm(TComponent* Owner);
  7.         bool __fastcall IniExist();
  8.         bool __fastcall XMLEquipeExist();
  9.         AnsiString GetVariable();


 
C'est ça?
 
Et donc quand une fenêtre enfant veut récupérer des valeurs de variables déclarées dans la fenêtre parent, on est obligé d'écrire autant de fonctions get/set qu'il y a de variables...
Dans le cas de nombreuses variables à récupérer, comment on fait?
 
Parce qu'en fait je voudrais récupérer des infos se trouvant dans le INI. Je récupére ces infos dans la fenêtre principale, et je dois les réutiliser dans une fenêtre enfant, et plus tard je devrai également les utiliser dans d'autres fenêtres...
 
Ca serait pas plus simple, dans la fenêtre principale, de récupérer toutes les valeurs dont j'ai besoin, de les rentrer dans un tableau (ou bien dans une List, ou une StringList) et d'écrire un get pour récupérer le tableau?

Reply

Sujets relatifs:

Leave a Replay

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