Picturebox qui ne fonctionne plus

sebcsharp 4 Messages postés jeudi 15 mars 2018Date d'inscription 19 mars 2018 Dernière intervention - 15 mars 2018 à 16:58 - Dernière réponse : Whismeril 11552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention
- 19 mars 2018 à 10:22
Bien le bonjour à vous qui lissez mon message, j'espère que vous pourrez un petit peu m'aider.

Donc mon problème est simple à expliquer :
- Je commence depuis peu en c#
-J'avais une picturebox qui afficher des courbes suivant un certain nombre de paramètre et ce mettait à jour etc.

Tout allez bien dans le meilleurs des mondes.

Mais sans que je comprenne pourquoi, et sans que je touche au code lier à la picturebox, maintenant elle m'affiche l'image par défaut.

voici un bout de mon code
        private void Pbox_courbe_paint(object sender, PaintEventArgs e)
        {
            PictureBox courbeencour = (PictureBox)sender;
            float longueur = courbeencour.Width;
            float hauteur = courbeencour.Height;

            if (this.tc_mode_commande.SelectedIndex==0)//mode double pulse
            {
                Dessin.Pbox_courbe_paint_2pulse(longueur, hauteur, float.Parse(this.tb_db_T_Pulse1.Text), float.Parse(this.tb_db_T_Pulse2.Text), float.Parse(this.tb_db_T_Pulse3.Text), int.Parse(this.tb_niv_actif.Text), cmb_Choix_DP_Transistor.SelectedIndex, float.Parse(tb_tpsmort.Text), e);
            }
            else if (this.tc_mode_commande.SelectedIndex ==1)//mode boucle ouverte
            {
                List<string> param = new List<string>();//stock la valeur initial
                List<string> sens = new List<string>();//stock le sens du bras initial
                List<string> bras = new List<string>();//stock le nom du bras
                List<Pen> couleur = new List<Pen>();//stock le stylo
                if (this.chb_ActiveB1.Checked)
                {
                    param.Add(this.tb_tri1.Text);
                    sens.Add(this.cmb_tri1.SelectedIndex.ToString());
                    bras.Add("Bras 1");
                    if (chb_ModeDaltonien.Checked) //si mode daltonien
                        couleur.Add(new Pen(Color.Chartreuse, 2));
                    else //sinon
                        couleur.Add(new Pen(Color.Navy, 2));
                }
                if (this.chb_ActiveB2.Checked)
                {
                    param.Add(this.tb_tri2.Text);
                    sens.Add(this.cmb_tri2.SelectedIndex.ToString());
                    bras.Add("Bras 2");
                    if (chb_ModeDaltonien.Checked) //si mode daltonien
                        couleur.Add(new Pen(Color.Navy, 2));
                    else //sinon
                        couleur.Add(new Pen(Color.Maroon, 2));
                }
                if (this.chb_ActiveB3.Checked)
                {
                    param.Add(this.tb_tri3.Text);
                    sens.Add(this.cmb_tri3.SelectedIndex.ToString());
                    bras.Add("Bras 3");
                    if (chb_ModeDaltonien.Checked) //si mode daltonien
                        couleur.Add(new Pen(Color.LightSkyBlue, 2));
                    else //sinon
                        couleur.Add(new Pen(Color.DarkMagenta, 2));
                }
                if (this.chb_ActiveB4.Checked)
                {
                    param.Add(this.tb_tri4.Text);
                    sens.Add(this.cmb_tri4.SelectedIndex.ToString());
                    bras.Add("Bras 4");
                    if (chb_ModeDaltonien.Checked) //si mode daltonien
                        couleur.Add(new Pen(Color.OrangeRed, 2));
                    else //sinon
                        couleur.Add(new Pen(Color.LightSeaGreen, 2));
                }
                if (param.Count > 0)
                {
                    Dessin.Pbox_courbe_paint_boucleouverte(longueur, hauteur, param, sens, couleur, "toto",bras,  e);
                }
            }


Donc j'ai ausculté en mode pas a pas, et des qu'il arrive à la Dessin.Pbox_courbe_paint_2pulse qui doit faire les calcul et dessiné, bah le pas a pas fait comme si il avait tout fini, il ne rentre dans Dessin.Pbox_courbe_paint_2pulse et le programme continu a fonctionné comme si tout allez bien.

aussi this.refresh(); n'a plus d'effet, il n'appel même plus la fonction plus haut.

Auriez vous une piste pour résoudre mon problème ?

EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

Votre réponse

14 réponses

Whismeril 11552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - 15 mars 2018 à 17:37
0
Merci
Bonjour
J’attends qu’un modérateur ait l’obligeance de corriger la coloration syntaxique (tu n’as pas précisé que c.est du c# => pavé tout gris).

Mais j’arrive à y voir suffisamment pour une remarque.
C# travaille en 32 ou 64 bits selon l’option de compilation.
Utiliser des float ne fait pas gagner de ram, en effet, même codé en 16bit ils sont stockés dans un espace de 32 ou 64.
En plus ça force une conversion donc perte de temps d’exécution.
Conclusion travaille avec des double.

D’autre part windows form propose le controle Chart qui est tout indiqué pour les courbes.
NHenry 14182 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - 15 mars 2018 à 18:14
Corrigé.
Whismeril 11552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - 15 mars 2018 à 18:39
merci
Whismeril 11552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - 15 mars 2018 à 18:41
heu en fait tu ne l'aurais mis en VB?
NHenry 14182 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 25 mai 2018 Dernière intervention - 15 mars 2018 à 20:25
Entre VB et C#, c'est quoi la différence ?
Quasiment aucune, la preuve :D

Corrigé :)
Whismeril 11552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - 15 mars 2018 à 20:59
re merci
Commenter la réponse de Whismeril
Whismeril 11552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - Modifié par Whismeril le 15/03/2018 à 22:56
0
Merci
En regardant de plus près ton code, maintenant qu'il est lisible, difficile de savoir ce qui ne marche plus.
Il faudrait que tu exécutes pas à pas pour voir si ça rentre dans les if.


Je commence depuis peu en c#
peut s'interpréter je change de langage ou je débuté complètement la programmation par c#.

Dans le cas 1, visiblement ça n'était pas un langage objet, et même la structure n'existait pas, "oublie" tout ce que tu connais et essaye de penser objet.
Dans le cas 2, essaye de penser objet.


                 List<string> param = new List<string>();//stock la valeur initial
                List<string> sens = new List<string>();//stock le sens du bras initial
                List<string> bras = new List<string>();//stock le nom du bras
                List<Pen> couleur = new List<Pen>();//stock le stylo
//....
                    param.Add(this.tb_tri2.Text);
                    sens.Add(this.cmb_tri2.SelectedIndex.ToString());
                    bras.Add("Bras 2");
                    if (chb_ModeDaltonien.Checked) //si mode daltonien
                        couleur.Add(new Pen(Color.Navy, 2));
                    else //sinon
                        couleur.Add(new Pen(Color.Maroon, 2));



Ça c'est tout bonnement pas possible.

Donc là, dans un fichier cs à part, tu vas créer une class (pour l'exemple, comme je ne sais pas ce que cela représente je l'appelle LeTrucASeb)

    class LeTrucASeb
    {
        public LeTrucASeb(string Param, string Sens, string Bras, Pen Pinceau)
        {
            this.Param = Param;
            this.Sens = Sens;
            this.Bras = Bras;
            this.Pinceau = Pinceau;
        }


        public string Param { get; set; }

        public string Sens { get; set; }

        public string Bras { get; set; }

        public Pen Pinceau { get; set; }
    }


Que tu vas initier comme ça dans ta méthode
            List<LeTrucASeb> mesTrucs = new List<LeTrucASeb>();
            mesTrucs.Add(this.tb_tri2.Text, this.cmb_tri2.SelectedIndex.ToString(), "Bras 2", chb_ModeDaltonien.Checked ? new Pen(Color.Navy, 2) : new Pen(Color.Maroon, 2));

Une seule liste avec toutes les infos afférentes à ton truc.

Un bon cours pour débuter en C#
http://tahe.developpez.com/dotnet/csharp/
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
sebcsharp 4 Messages postés jeudi 15 mars 2018Date d'inscription 19 mars 2018 Dernière intervention - 16 mars 2018 à 09:32
Avant toute chose merci pour ton aide, et surtout merci à tous pour l'aide que vous apportez au différent utilisateur.

Donc cette fonction fait partie des premières de mon programme, j'ose espéré que maintenant le reste de mon code est un peu mieux que celui la.

et merci pour tes conseils sur l'organisation de mon code, car j'ose espéré m’améliorer et être plus cohérent avec le c# (que je préfère au VHDL)

à la base je voulais utiliser des doubles, mais le problème c'est que la fonction drawline semble utiliser que des floats. après peut être ai je rater quelque chose

Quand j'effectue le code pas à pas je rentre dans le if mais la fonction qui est dans le if n'est pas appelé... et je ne comprend pas pourquoi.

Edit :
J'ai trouvé la réponse à mon problème... c'était juste dans mes valeurs l'une d'entre elle été écrite avec un . au lieu d'une virgule. Mais par contre je ne comprend pas pourquoi visual ne me retourné aucune erreur.

Et si tu peux aussi m'apprendre comment utiliser des double au lieu de floats
Whismeril 11552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - 16 mars 2018 à 12:12
Mais par contre je ne comprend pas pourquoi visual ne me retourné aucune erreur.

C’est un bug connu de visual studio, au moins VS2013.
Je n’ai pas 2015 et avec 2017 communiy (que j’utilise à la maison pour répondre sur le forum) je ne l’ai pas constaté.

Pour utliser les doubles, c’est excatement pareil, il suffit juste de déclarer en double.

Pour drawline je regarderai plus tard, et pours’affranchir de la virgule, je te montrerai
sebcsharp 4 Messages postés jeudi 15 mars 2018Date d'inscription 19 mars 2018 Dernière intervention - 16 mars 2018 à 14:20
Donc après avoir fait quelque test sur différent ordinateur.

Celui de chez moi (paramètre régional USA) Visual 2015 ou 2017 aucune erreur détecté
Au travail (paramètre régional France) visual 2015 et 2017 les deux détecte l'erreur. (que j'ai corrigé depuis. d'ailleurs dois je mettre problème résolu alors ou l'on continu ici ?)

Pour le problème point/virgule j'utilise un replace quand l'utilisateur écrit lui même (au validating je fait la vérification et je met à jour), mais le problème venait que la fenêtre se chargé avec une case contenant un . donc ma vérification et remplacement n'avait pas lieu.

J'ai essayé de déclaré en double, mais je n'ai pas trouver de fonction drawline avec des doubles, il me demande des floats, ou si j'utilise point je peux utiliser des int
Commenter la réponse de Whismeril
Whismeril 11552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - 18 mars 2018 à 12:59
0
Merci
Bonjour

pour les problèmes de virgules, ce code gère la majorité des cas
        private double ToDouble(string Valeur)
        {
            //on pourrait regarder la culture du Thread et chnager la virugle en point quand on est US et l'inverse quand on est Fr
            //Mais finalement forcer la conversion en US et remplacer une éventuelle virgule en point suffit dans la majorité des cas (ça ne gère pas les nombres ou le séparateur des milliers est la virgule)

            double resultat;
            if (double.TryParse(Valeur.Replace(',','.').Replace(" ", ""), NumberStyles.Number, CultureInfo.InvariantCulture, out resultat))
                return resultat;

            //si la conversion rate, on retourne une valeur par défaut, pour l'exemple je retoune Not A Number
            return double.NaN;
        }


Petit code de test
            List<double> testConversion = new List<double>();
            testConversion.Add(ToDouble("1.2"));
            testConversion.Add(ToDouble("2,3"));
            testConversion.Add(ToDouble("1 234,5"));
            testConversion.Add(ToDouble("2 345.6"));
            testConversion.Add(ToDouble("3,456.7"));//seul cekui kà n'est pas converti, car une fois la virgule en point ça donne 3.456.7



Si tu penses être confronté à des nombres américains avec virgule et point, ça ce complique un peu, il faut d'abord déterminer à quoi sert la virgule, donc la culture. Pour cela je me sers d'une regex
[http://regexstorm.net/tester?p=%5B%2B-%5D%3F%28%3F%3A%5Cd%7B1%2C3%7D+%3F%29%2A%5Cd%7B1%2C3%7D%28%3F%3A%2C%5Cd%7B1%2C3%7D%28%3F%3A+%3F%5Cd%7B1%2C3%7D%29%2A%29%3F&i=123+456%2C12%0D%0A123456%2C12%0D%0A%2B123+456%2C12%0D%0A-123456%2C12%0D%0A123+456+789%2C123445679%0D%0A123+456+789%2C123+456+789%0D%0A123+456+789%0D%0A123+456+789 [+-]?(?:\d{1,3} ?)*\d{1,3}(?:,\d{1,3}(?: ?\d{1,3})*)?]

Et une autre pour la culture US, et une pour espace en séparateur de millier et point en séparateur décimal.

        private double ToDouble(string Valeur)
        {
            CultureInfo culture;
            //on va faire une regex pour voir si on est en FR
            if (Regex.IsMatch(Valeur, @"^[+-]?(?:\d{1,3} ?)*\d{1,3}(?:,\d{1,3}(?: ?\d{1,3})*)?$"))
                culture = CultureInfo.GetCultureInfo("FR");
            else if (Regex.IsMatch(Valeur, @"^[+-]?(?:\d{1,3},?)*\d{1,3}(?:\.\d{1,3}(?:,?\d{1,3})*)?$"))
                culture = CultureInfo.GetCultureInfo("US");
            else if (Regex.IsMatch(Valeur, @"^[+-]?(?:\d{1,3} ?)*\d{1,3}(?:\.\d{1,3}(?: ?\d{1,3})*)?$"))
            {
                Valeur = Valeur.Replace(" ", "");
                culture = CultureInfo.GetCultureInfo("US");
            }
            else
                return double.NaN;

            return double.Parse(Valeur, culture);
        }

Petit code de test
            List<double> testConversion = new List<double>();
            testConversion.Add(ToDouble("1.2"));
            testConversion.Add(ToDouble("2,3"));
            testConversion.Add(ToDouble("1 234,5"));
            testConversion.Add(ToDouble("2 345.6"));
            testConversion.Add(ToDouble("3,456.7"));
            testConversion.Add(ToDouble("3 456.7£"));//seul celui-ci n'est pas convertit car c'est une monnaie


Et si tu veux gérer les monnaies, il faut adapter les regex, la culture et le parse en conséquence.
Commenter la réponse de Whismeril
Whismeril 11552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - 18 mars 2018 à 13:08
0
Merci
Pour DrawLine effectivement il semble que cette méthode n'accepte pas de double.

Soit
  • tu restes comme tu es,
  • soit tu castes au moment utile
    DrawLine(Pinceaux, (float)double1, (float)double2, (float)double3, (float)double3)


Cependant, je te l'ai écrit plus haut, pour les courbes il y a un contrôle dédié qui marche bien: Charts
Voici un tuto en VB.net, il suffit de transcrire le code en c# http://plasserre.developpez.com/cours/chart/
Commenter la réponse de Whismeril
sebcsharp 4 Messages postés jeudi 15 mars 2018Date d'inscription 19 mars 2018 Dernière intervention - 19 mars 2018 à 10:06
0
Merci
Franchement merci pour ton aide. ton tuto sur les courbes me sera pas mal utile. Car je vais régulièrement avoir à en afficher dans le futur. et de tout genre.

Je pense que je vais mettre mon sujet en résolu mais avant une dernière question. Est ce que tu serais d'accord si je t’envoie mon code que tu regarde un peu, juste pour me donner quelque conseil sur comment améliorer ma manière de coder ?

Juste un survol bien sur pas que tu étudie tout ça me semblerait bien trop long.

Que tu dises oui ou non je te remercie pour toute ton aide.
Whismeril 11552 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 25 mai 2018 Dernière intervention - 19 mars 2018 à 10:22
Dans le principe je ne suis pas contre sous certaines conditions:
  • d’abord j’y jetterai un oeil quand je pourrais/voudrais.
  • tu nettoies la solution, pas d’exe
  • tu la zipes et tu la postes sur un site de partage de fichier (cijoint.com par exemple)
  • s’il y a des fichiers de données, envoie des exemples realistes mais pas réels (pas d’identités par exemple).
  • tu postes ici le lien, éventuellement par MP si tu ne veux pas que le web entier ait accès à ton source.
  • je te répondrai ici.
Commenter la réponse de sebcsharp

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.