IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

TextBox avec plusieurs Windows Form


Sujet :

C++/CLI

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 30
    Points : 33
    Points
    33
    Par défaut TextBox avec plusieurs Windows Form
    Salut à tous,

    J'ai une interface ou j'ai plusieurs textbox et je récupère leur valeur dans une fonction dans class Form2.
    Cependant vu que j'aurais les mêmes textbox dans plusieurs interfaces j'aurais voulu faire une fonction générique qui récupère les données selon l'interface utilisé.

    Dans form2.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    String^Form2::valeur_limites()
    {
    	String^ min_ab;  String^ max_ab; String^ pas_ab; String^ min_or; String^ max_or; String^ pas_or;
    	String^ total;
     
     
    	min_ab=textBox_min_ab->Text->ToString();		
    	max_ab=textBox_max_ab->Text->ToString();
    	pas_ab=textBox_pas_ab->Text->ToString();
    	min_or=textBox_min_or->Text->ToString();
    	max_or=textBox_max_or->Text->ToString();
    	pas_or=textBox_pas_or->Text->ToString();
    	total="x"+" "+min_ab+" "+max_ab+" "+pas_ab+" "+min_or+" "+max_or+" "+pas_or+" ";
     
    	return total;
    }
    Dans communication.cpp : (là où sont mes fonctions génériques)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    int* Limites()
    {
    	
    	Form2 gForm2;
    	String^limites;
    	char* lim;
    	if (type_gene==0)
    	{
    		//on récupère les données de l'interface teleview
    	}
    	if (type_gene==1)
    	{
    		//on récupère les données de l'interface dektek
    		limites=gForm2.valeur_limites();
    	}
    	//convertit un string en char
    	lim= (char*)(void*)Marshal::StringToHGlobalAnsi(limites);
    
    	char* pt=lim;	static char argv[32][32];	char* pargv[7];
    					
    	//on décortique la chaine total pour avoir les valeurs des limites
    	int i = 0;		
    	int num[6];
    	while (true)
    	{
    		pt = strstr(lim, " ");		// find space
    		if (pt == 0)				// space not find
    		{
    			strcpy(argv[i++], lim);	// last command
    			break;					// end of cmd
    		}
    		*pt = 0;					// end of string
    		strcpy(argv[i++], lim);		// one command
    		pargv[i] = &argv[i][0];		// init pointer
    
    		*pt++;						// next command
    		strcpy(lim, pt);			// erase previous command
    	}			
    	// on convertit les char en int
    	num[0] = atoi(pargv[1]); // freq min -> Abcisse Min
    	num[1] = atoi(pargv[2]); // freq max -> Abscisse Max
    	num[2] = atoi(pargv[3]); // pas freq -> Abcisse Pas
    	num[3] = atoi(pargv[4]); // niveau min -> Ordonnée Min
    	num[4] = atoi(pargv[5]); // niveau max -> Ordonnée Max
    	num[5] = atoi(pargv[6]); // pas niveau -> Ordonnée Pas
    
    	return num;
    
    }
    Le soucis lorsque j’exécute c'est que dans les variables qui récupèrent les valeurs (min-ab, max_ab...), sont vides (leurs valeurs: "").

    Je ne comprend absolument pas pourquoi.
    Quelqu'un a une idée?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    int* Limites()
    {

    Form2 gForm2;
    ...
    gForm2 n'est pas affichée (Load, Show, ou je ne sais quoi) ?
    Du coup, les textboxes ne sont pas initialisés ...

    (... cela dit, moi c'est plutot C#, alors C++... )
    (... par ailleurs, créer une chaine pour la redécomposer ensuite, il y a peut être plus simple... )

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Alikendarfen Voir le message
    gForm2 n'est pas affichée (Load, Show, ou je ne sais quoi) ?
    Du coup, les textboxes ne sont pas initialisés ...
    Je suis pas sûre de comprendre ... Ma form2 est ouverte et les textbox ont été remplies pourtant


    (... par ailleurs, créer une chaine pour la redécomposer ensuite, il y a peut être plus simple... )
    Vous avez surement raison mais pour l'instant j'ai trouvé que cette solution, je ne me suis pas attardé dessus. Peut-être une fois mon programme fini je m'y pencherai à nouveau dessus.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    Je suis pas sûre de comprendre ... Ma form2 est ouverte et les textbox ont été remplies pourtant
    Peut être. Mais si c'est bien la 'gForm2' qui est déclarée dans la fonction 'Limites', ça veut dire qu'elle s'affiche et vous laisse le temps de saisir les paramètres dès sa déclaration (ça n'est pas habituel, sauf à ce que vous ayez défini des choses particulières dans son constructeur ?).

    Pour le voir, ça peut être simple : mettre un point d'arrêt sur la déclaration de gForm2, avancer d'un pas et voir si elle s'affiche à ce moment là et qu'elle est modale (un dialogue).
    Edit : Attention, dans cette situation, si elle n'est pas modale le code va se poursuivre sans interruption et du coup vous allez récupérer les valeurs des champs avant de les avoir saisis.

    Si c'est pas le cas, alors vous avez probablement une autre fenêtre de la même classe ouverte quelque part.

    Mais du coup, la fonction 'Limites' va chercher les valeurs dans gForm2 et non pas dans la fenêtre qui est ouverte à l'écran...

    Testez ça et dites nous !

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    Ah oui d'accord j'ai compris ^^

    Je vais essayer de tester ça dans la matinée !

    Merci.

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    C'est exactement ce que vous m'avez dit. Enfaite j'instancie a nouveau ma form2.

    Mais du coup comment puis-je faire pour utiliser la form2 déjà initialisée?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    Il faut la passer en paramètre à ta fonction 'Limites' (et non plus la déclarer dans cette fonction).

    Par contre, il te faut un événement pour lancer l'appel à cette fonction : en général cet événement est lié au fait que l'utilisateur aura appuyé sur un bouton de la forme pour indiquer qu'il a saisi les valeurs limites dans les textboxes.

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    Ok je vois.

    Cependant je n'arrive pas a mettre une windows form en paramètre. Quelle est la syntaxe ?

    j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* Limites(System::Windows::Forms::Form form)
    Mais je ne suis pas certaine que ça soit ça, surtout qu'après le nom du paramètre à passer dans l'utilisation de la fonction ... je ne vois pas non plus quoi mettre.

    C'est la dernière aide que je demande après je vous casse plus les pieds ^^

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    C'est la dernière aide que je demande après je vous casse plus les pieds ^^
    Vous ne cassez les pieds à personne : chacun est libre de répondre ou pas !

    Je pense que votre problème vient des notions qui tournent autour des passages de paramètres par valeur ou bien par référence.

    En c++, trois façons de faire (sans aller chercher midi à 14h, car il peut y avoir des 'astuces' plus compliquées mais ça n'est pas le sujet) :

    Note : je peux me tromper un peu car ça fait longtemps que je ne fais plus de c++. Mais les principes généraux sont là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    1/ Passage par valeur
    Déclaration :
         void fonction( Form form );
    Appel :
         Form x;
         fonction( x );
     
    2/ Passage par référence
    Déclaration :
         void fonction( Form &form );
    Appel :
         Form x;
         fonction( x );
     
    3/ Passage par adresse (pointeur)
    Déclaration :
         void fonction( Form *form );
    Appel :
         Form x;
         fonction( &x );
    Cas 1/
    Lors de l'appel une copie de la forme est transmise à la fonction. Cet appel nécessite que Form ait un constructeur de copie : Form( Form &form).
    Normalement, ça n'est pas le cas d'une Form (à vérifier, mais de toute façon ça n'est pas la bonne solution ici).

    Cas 2/
    Lors de l'appel c'est en fait la forme de la fonction appelante qui est transmise à la fonction appelée sans copie ni rien (c'est un peu comme pour le passage par adresse au final, mais c'est dans l'esprit des 'var' ou 'ref' qu'on trouve dans d'autres langages).

    Cas 3/
    On passe l'adresse de la forme (l'adresse est en fait passée par valeur) et du coup, à l'intérieur de la fonction appelée on accède à la forme d'origine depuis son adresse


    Pour votre problème :
    - On doit partir de la forme où l'utilisateur saisit les valeurs et traiter une événement sur cette forme (appui sur un bouton)
    - Depuis l'événement qui est une méthode de la forme (en général), la forme s'appelle 'this' qui est de type 'Form *'
    - Votre fonction 'Limites' peut donc avoir comme signature :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *Limites( Form *pForm );
    Auquel cas, vous l'appellez par : ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *Limites( Form &form );
    Et vous l'appelez par : Je préconise cette dernière solution (avec 'Form &form') car il vaut mieux utiliser les pointeurs seulement là où c'est vraiment utile.

    En espérant que ça vous aide.

    bon courage

  10. #10
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    Merci pour cette réponse, j'ai pu mettre la windows form en paramètre avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *Limites( Form^form );
    et l'appel se fait par:
    Mais enfaite ça va plus du tout, parce que j'ai acces qu'à une windows form quelque conque j'ai l''impression.
    et si je fais :

    et l'appel se fait par:
    voici l'erreur :
    Form1.cpp(2455) : error C2664: 'Limites'*: impossible de convertir le paramètre 1 de 'Commande_Generateur2::Form1' en 'System::Windows::Forms::Form ^'
    Enfaite ma form1 est déclaré dans le namespace Commande_Generateur2.
    Et du coup je suis perdue, je comprends plus grand chose

    Je crois que malheureusement je vais abandonner de faire cette fonction. et je vais récupérer les valeurs dans chaque form et puis voilà ! Tant pis !

    En tout cas, merci beaucoup du temps que vous avez accordé à mon problème et pour réponse.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    OK.
    Effectivement, le plus simple sera sans doute de faire le tableau de int dans chaque forme (sans chercher une représentation texte intermédiaire).

    De plus ça vous permet de créer (plus tard) d'autres types de formes sans avoir à modifier tout le temps cette fonction Limites.

    Allez, bon courage

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Points : 486
    Points
    486
    Par défaut
    Ah sinon, j'ai regardé cette histoire de '^' que je ne connaissais pas et qui est propre au c++ dotnet (mon historique c'est c++ avant dotnet et c# après).

    ^ : C'est des pointeurs managés (garbagés par le framework).

    Donc pour ce qu'on disait avant : effectivement il faut Limites( this ) à l'appel et int *Limites( Form2^ form ) comme signature.

    Mais encore une fois, il est plus simple de créer le tableau int * directement dans la forme...

Discussions similaires

  1. Tutoriel pour débuter rapidement avec les Windows.Forms ?
    Par Leelith dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/12/2008, 14h25
  2. Enregistrement avec deux windows form
    Par ApprentiDeveloppeur dans le forum Windows Forms
    Réponses: 2
    Dernier message: 01/09/2008, 13h46
  3. Manipuler des XML en c# avec un windows form
    Par Courgette17 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/05/2008, 18h37
  4. [c#][.NET][CF] TextBox avec plusieurs fonts et styles.
    Par safisoft13 dans le forum Windows Mobile
    Réponses: 4
    Dernier message: 08/02/2007, 15h37
  5. [C#] Look and Feel Office 2003 avec les Windows Forms
    Par vandamme dans le forum Windows Forms
    Réponses: 7
    Dernier message: 20/01/2006, 00h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo