Valeurs d'un tableau entre Form et Usercontrol [Résolu]

Signaler
Messages postés
41
Date d'inscription
jeudi 7 juin 2007
Statut
Membre
Dernière intervention
15 septembre 2008
-
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
-
Bonjour,

voici donc mon problème du moment (ça fait 5 jours que je suis dessus).

Je suis en train d'écrire un code pour afficher des courbes à partir de tableaude données (Jusqu'ici tout va bien).
Pour cela, je construis un UserControl (Uc) que j'ajoute à ma form (Jusqu'ici tout va bien).
Dans ce Uc j'ai une méthode Add qui me permet d'ajouter les tableaux à des arraylist, une méthode Delete pour supprimer un tableau et une Méthode clear pour tout supprimer (Jusqu'ici tout va bien).
J'ai aussi des évènements Load, Resize, MouseMove, MouseDrop et Paint (Jusqu'ici tout va bien).
Puis, suivant le type de courbe désirée, je construis me courbe sur mon UC (Jusqu'ici tout va bien).

Là où mon problème apparait, c'est que j'ai une méthode qui me permet de tracer la moyenne de chaque courbe. Le tracé est OK. Mais la valeur de chaque moyenne est stockée dans un tableau que (Normalement) je récupère dans mon MainForm via une propriété de mon Uc. Mais quand je lis les données du tableau, il me les indiques nulles. Et quand elle sont non nulles elles ont leurs valeurs après que j'ai fait un MessageBox.Show dans mon MainForm...

J'en perd mon Latin (même si je n'ai jamais été fort dans cette discipline )

Voici une partie du code :

    * dans mon Uc :
dans la partie déclaration j'ai :            private float[] ZMoyenne = new float[NBMaxCourbes+1];
dans la méthode Delete j'ai :                 ZMoyenne[x]=float.NaN;
dans la méthode Clear j'ai :                 ZMoyenne = new float[NBMaxCourbes+1];
dans la méthode DessineMoyenne j'ai :                 ZMoyenne.SetValue(fMoyenne,iNumeroSerie); //fMoyenne = valeur de la moyenne de la courbe iNumeroSerie
dans ma propriété j'ai :                 public float[] Moyenne {get {return ZMoyenne;}}

    * dans mon MainForm :
j'ai G qui designe mon Uc et j'appelle G.Moyenne[i] pour récupérer mes données.

            UcBib.UcGraphXY G = new UcBib.UcGraphXY(); //Nouveau graphique
            G.RafraichiLive=false; //evite le scintillement
            float[] tmpy =new float[10+1]; //tab 1
            float[] tmpx =new float[10+1]; //tab2
            float[] tmpz =new float[10+1]; //tab3
            for (int i = 0; i<=10;i++) //remplissage des tableaux
            {
                tmpy[i]=(float)Math.Cos(i/Math.PI);
                tmpx[i]=i;
                tmpz[i]=(float)Math.Sin(i/Math.PI);
            }
            G.TitreGraphique="";//titre du graphique
            G.LegendeVisible=true;//affichage de la légende
            G.PointVisible=true;//affichage des points sur la courbe
            G.ZoomActif=true;//zoom possible
           //ajout des courbes 1 et 2 G.AddCourbe("1",UcBib.UcGraphXY.NuméroAxe.Y,UcBib.UcGraphXY.CourbeType.XY,tmpy,tmpx,UcBib.UcGraphXY.MoyenneCourbe.Oui);
            G.AddCourbe("2",UcBib.UcGraphXY.NuméroAxe.Y2,UcBib.UcGraphXY.CourbeType.XY,tmpx,tmpy,UcBib.UcGraphXY.MoyenneCourbe.Oui);
           G.RafraichiLive=true;

            this.Controls.Add(G); //affichage du graph
            string tmp ="1--"+G.Moyenne.GetUpperBound(0).ToString()+"\r\n";//récupération de la taille du tableau des moyennes (=10)
            for (int i=0 ; i<G.Moyenne.GetUpperBound(0);i++) //remplissage d'un combo avec les valeurs des moyennes
            {
                this.comboBox1.Items.Add(G.Moyenne[i]); //Marche pas --> Valeurs tjs nulles
            }
            MessageBox.Show(tmp);//attente
            this.Controls.Remove(G);//on enleve le graph
            G.RafraichiLive =false;//evite le scientillement
            G.DeleteCourbes("2");//on supprime la deuxième courbe
             //on en ajoute une autre
G.AddCourbe("2",UcBib.UcGraphXY.NuméroAxe.Y2,UcBib.UcGraphXY.CourbeType.XY,tmpz,tmpx,UcBib.UcGraphXY.MoyenneCourbe.Oui);
            this.Controls.Add(G);//on affiche le graph
            for (int i= 0 ; i<G.Moyenne.GetUpperBound(0);i++)//on rerempli le combo
            {
                this.comboBox1.Items.RemoveAt(i);
                this.comboBox1.Items.Insert(i,G.Moyenne[i]); //Marche pas --> Valeurs tjs nulles sauf le 2ème qui est NaN
            }
            G.RafraichiLive =true;

Si vous avez des solutions, je suis preneur

D'avance Merci

RB

6 réponses

Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
Donc, d'après ce que tu dis, tu n'inities les valeurs de ZMoyenne que dans DessineMoyenne, et lors du Paint.
Dans ce cas, il ne faut pas t'étonner que ce soit vide. Paint n'a pas encore été appelé à ce moment.
Il faudrait à mon avis calculer les moyennes dans la méthode AddCourbe.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
Hello,

Où appelles-tu la méthode DessineMoyenne, je ne la vois nulle part ?

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
41
Date d'inscription
jeudi 7 juin 2007
Statut
Membre
Dernière intervention
15 septembre 2008

dans la évènement Paint de mon Uc
Messages postés
41
Date d'inscription
jeudi 7 juin 2007
Statut
Membre
Dernière intervention
15 septembre 2008

            void FondPaint(object sender, System.Windows.Forms.PaintEventArgs e)
            {
                if (!(ZRafraichi)) {
                    return;
                }
                Image = new Bitmap(Fond.Width, Fond.Height);
                Graphics g = Graphics.FromImage(Image);
                Graphics gf = Fond.CreateGraphics();
                g.SmoothingMode = SmoothingMode.AntiAlias;
                try {
                    DessineElements(g);
                    gf.DrawImage(Image, 0, 0);
                } catch (Exception ex) {
                    MessageBox.Show(ex.Message);
                } finally{
                    gf.Dispose();
                    g.Dispose();
                    this.Image.Dispose();
                }
            }

puis

            void DessineElements(Graphics g)
            {
                if (OrdreCourbes.Count == 0) {// si pas de courbes -> on sort
                    return;
                }
                object[] TempArray = OrdreCourbes.ToArray();//OrdreCourbes en tableau
                this.CalculMargeGauche(g);
                this.CalculMargeDroite();
                this.CalculMargeHaute();
                this.CalculMargeBasse(g);
                DessineFond(g);
                if (((CourbeType)TypeDeCourbe[0])==CourbeType.Barre)
                {
                    DessineGrille(g,false);
                    DessineAxe(g);
                    DessineBars(g);
                   
                }
                for (int x = 0; x <= TempArray.GetUpperBound(0); x++) {//pour chaque courbe
                    switch ((CourbeType)TypeDeCourbe[x])
                    {
                        case CourbeType.XY:
                        case CourbeType.Courbe:
                            DessineGrille(g);
                            DessineAxe(g);
                            DessineCourbe(g, x);
                            break;
                        case CourbeType.Barre:
                            break;
                        case CourbeType.Curseur:
                            DessineGrille(g);
                            DessineAxe(g);
                            DessineCurseur(g, x);
                            break;
                    }
                    if ((MoyenneCourbe)CourbeMoyenne[x]==MoyenneCourbe.Oui)
                    {
                        DessineMoyenne(g,x);
                    }
                }
                if (ZLegende) {//si légende on trace
                    DessineLegende(g);
                }
            }
Messages postés
41
Date d'inscription
jeudi 7 juin 2007
Statut
Membre
Dernière intervention
15 septembre 2008

quelle est l'odre d'appel des évènements, méthodes, propriétés amors ??
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
Hello,

Pour ce que j'en sais, il n'y a pas vraiment d'ordre, mais l'événement Paint, comme les autres événements est levé dans le même thread. Tant que tu n'as pas fini la méthode de ton mainForm ou que tu n'a pas appelé Application.DoEvent, Paint ne sera pas appelé.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)