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 :

Référence d'objet et instance (visual C++ EXpress)


Sujet :

C++/CLI

  1. #1
    Candidat au Club
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Référence d'objet et instance (visual C++ EXpress)
    Bonjour à tous !

    Je réalise un petit programme dans lequel j'ai un tabControl avec plusieurs Tabs dont chacun contient un dataGridView.

    Déclarés comme suit :
    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
     
     
    public:
     
    		array<System::Windows::Forms::TabPage ^> ^ MyTab;
    		array<System::Windows::Forms::DataGridView^> ^ MyDataG;
     
    private: System::Windows::Forms::DataGridView^  dataGridView1;
    ...
    private: System::Windows::Forms::DataGridView^  dataGridView30;
     
    private: System::Windows::Forms::TabControl^  tabControl1;
     
    private: System::Windows::Forms::TabPage^  tabPage1;
    ...
    private: System::Windows::Forms::TabPage^  tabPage30;
    initialisé comme suit :

    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
     
    DataProc(void)
    		{
    			InitializeComponent();
    			//
    			//TODO*: ajoutez ici le code du constructeur
    			//
    			MyDepotProc = gcnew array<DepotProc ^>(256);
    			DepotProc^ T = gcnew DepotProc();
    			for(int p = 0; p<=255; p++){MyDepotProc[p] = T;};
     
     
    	  MyTab = gcnew array<System::Windows::Forms::TabPage ^>(30);
    	  MyDataG = gcnew array<System::Windows::Forms::DataGridView ^>(30);
     
    MyTab[0] = tabPage1;
    ...
    MyTab[29] = tabPage30;
     
    MyDataG[0] = dataGridView1;
    ...
    MyDataG[29] = dataGridView30;
    Dans une de mes fonctions j'itère sur mes Tab (et DatagridView) :

    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
     
    if(this->MyDataG[k]->RowCount != 0)
    	{
    		for(int y = 0; y<= this->MyDataG[k]->RowCount-1 ; y++)
    		{
    			String^ DATE1 = this->MyDataG[k]->Rows[y]->Cells[2]->Value->ToString();
     
    	...
     
    			String^ DATE2;
     
    			if( !String::IsNullOrEmpty( (this->MyDataG[k])->Rows[y]->Cells[3]->Value->ToString()))
    			{ 
    				DATE2 = (this->MyDataG[k])->Rows[y]->Cells[3]->Value->ToString();
    			}
    			else
    			{
    				DATE2 = "01/01/1980";
    			}
     
    			...
    Et là j'ai le message d'erreur (la référence d'objet n'est pas définie à une instance d'un objet) pour la ligne avec le IsNullOrEmpty !!!?!

    Je ne comprend pas pourquoi d'autant plus qu'en debug si l'étape est "ignorée" les données sont correctement utilisées .

    Un petit idée ? une remarque ??

    MERCI !

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (this->MyDataG[k])->Rows[y]->Cells[3]->Value->ToString()
    Avec une instruction pareille ça ne m'étonne pas.
    Tu es sûr qu'il existe un k-ième élément pour MyDataG, un y-ième élément pour Rows, etc ?

  3. #3
    Candidat au Club
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    C'est vrai que ça fait un peu barbare mais je n'ai rien trouvé d'autre...( je prends tous les conseils !)

    au débug ça plante pour k=0 et y=0 or dans le constructeur j'ai bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyDataG[0] = dataGridView1;
    et pour Rows[y] ça ne lui pose pas de problème lorsque je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String^ DATE1 = this->MyDataG[k]->Rows[y]->Cells[2]->Value->ToString();
    Mais ça lui en pose un quand justement je test la valeur en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if( !String::IsNullOrEmpty( (this->MyDataG[k])->Rows[y]->Cells[3]->Value->ToString()))
    			{ 
    				DATE2 = (this->MyDataG[k])->Rows[y]->Cells[3]->Value->ToString();
    			}
    C'est là où je ne comprends plus !

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    à priori, c'est parce que cells[3] n'est pas défini, quand cells[2] l'est.

    C'est la seule différence que je vois.

    Cela dit, je n'aime pas ce style de this->truc[]->truc[]->truc
    je préfererai déjà des classes mieux définies
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String^ DATE1 = this->MyDataG[k]->Rows[y]->Cells[2]->Value->ToString();
    devrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String^ DATE1 = get(k,y,2).stringValue();
    Si c'est ta librairie, je te recommande chaleureusement de la retravailler un peu.

    Si tu es contraint de l'utiliser sans en être l'auteur, je te plaints.
    Et quel est ce type étrange "String^"?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Candidat au Club
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Alors je suis effectivement à plaindre.... Et tout à fait d'accord que c'est la cause la plus probable.

    Cependant encore une chose qui me dérange,

    Si je ne dis pas (trop) de conn***, et dans d'autre prog que j'ai fais ça fonctionnait comme ça, le dataGridView gère ses cellules.

    C'est à dire qu'en exécution lors qu'on écrit dans le dataGridView il créer sa ligne et les cellules qu'elle contient.

    Or, lorsque je rentre des données (en respectant le type) dans toutes les cellules, i.e. cells[2] et cells[3] ça ne fonctionne pas (enfin comme je le disait au début il me retrouve par la suite les infos quand même).

    Pourtant ces deux cellules sont crées en même temps, de la même manière et par une classe (normalement) éprouvée...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Il s'agit de C++/CLI, la notation ^ pour les pointeurs managés.
    Par contre nommer les champs XXX1...XXX30 etc, c'est limite..
    et le code de manière générale est discutable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (this->MyDataG[k])->Rows[y]
    parenthèses inutiles; this est-il obligatoire en CLI ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(this->MyDataG[k]->RowCount != 0)
    ce test est-il utile ? étant donné que tu boucles de toutes façons de 0 à RowCount-1... si RowCount est nul, tu boucles pas; n'y a-t-il pas un risque que RowCount soit < 0 ?

    Quel est ton problème ? ça crash ?
    Vue les boucles, redéfinis tes bornes et vas-y pas-à-pas, tu te rendras compte assez vite d'où se situe le problème.

    btw, on préfère généralement faire for (i = 0; i < n; ++i) que (i = 0; i <= n-1; ++i), ça fait une opération de moins à chaque tour (au moins, je ne sais pas spécifiquement comment se comporte un < par rapport à un <=)

    Le code que tu présentes n'est de toutes façons pas spécialement probant à montrer/déceler une erreur. Il convient de présenter sur le forum un code épuré, mais qui reste lisible et duquel on puisse suivre la logique.
    Là on a au mieux des bribes.
    MyDepotProc que l'on découvre dans une méthode apparement globale, mais qui doit en fait appartenir à "la classe sans nom", où chaque élément de MyDepotProc est... un unique élement (cool un tableau de 256 occurences du même élément). etc
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. [Débutant] Référence d'objet et instance (visual C++ EXpress)
    Par Falckounet dans le forum Visual Studio
    Réponses: 0
    Dernier message: 01/08/2012, 12h10
  2. Réponses: 2
    Dernier message: 05/06/2007, 17h22
  3. Réponses: 8
    Dernier message: 04/06/2007, 16h20
  4. Réponses: 24
    Dernier message: 01/06/2007, 09h26
  5. Réponses: 8
    Dernier message: 11/07/2006, 17h27

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