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# Discussion :

timer et boucle for [Débutant]


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut timer et boucle for
    Bonjour à tous,
    je me casse les dents sur un problème d'Algo utilisant une boucle for à l'intérieur d'un timer.

    Dans l'exemple ci-dessous la boucle ne rentre jamais dans le else. ça boucle sur le for qui évidemment initialise _PieNumber à zéro...
    j'ai donc une messagebox qui affiche "zéro" en continu


    Merci de votre aide.
    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
     
     private void button2_Click(object sender, EventArgs e)
            {
                timer2.Enabled = true;
     
                for (int _PieNumber = 0; _PieNumber <= 5; _PieNumber++)
                {
                    if (_PieNumber == 0)
                    {
                        MessageBox.Show("zéro");
                    }
                    else
                    {
                        MessageBox.Show(Convert.ToString(_PieNumber));
                    }
                }
            }

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Bonjour

    Toi, tu ne montres pas tout le code... car, l'évènement dans ton bouton click est tout à fait fonctionnel et affiche bien les valeurs allant de 1 à 5 dans une messageBox...
    pour peu qu'on enlève le timer2.Enable puisque je n'ai pas le code du "Timer Event"...

    JE te soupçonne de faire dans ton Timer_Even une ENORME merde du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void t_Tick(object sender, EventArgs e)
            {
                button2_click(...)
            }

    Franchement, si tu fais ça dans ton code :

    1 - C'est juste HORRIBLE
    2 - On appelle JAMAIS une méthode lié à un evenement d'un controle dans une autre méthode...
    3 - LIRE un cours sur C#, Winforms
    4 - Logique que ton timer appelle sans cesse ta fonction avant meme que tu n'es le temps d'appuyer sur le bouton de la messageBox.

    Maintenant, soit tu nous montres "tout" le code, soit tu expliques ce que tu veux faire...
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Candidat au Club
    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    1/ Merci de t'abstenir de répondre à des questions marquées résolue
    surtout si c'est juste pour nous faire part de ton humeur à la noix.

    Le but du jeux: utiliser l'objet Pie pour remplir un cercle en alternance de couleurs puis animer l'alternance pour donner un rendu de turbine qui tourne.
    les tableaux Brushtab et Brushtab1 servent de zones tampon pendant la manoeuvre.

    code C# : la boucle sur le timer ne marche pas.
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
     
    namespace Graph01
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                SolidBrush[] BrushTab1 = new SolidBrush[30];
                SolidBrush[] BrushTab = new SolidBrush[30];
                SolidBrush myBrush = new SolidBrush(Color.DeepPink);
                Graphics myGraphics = this.CreateGraphics();
     
                if (timer1.Enabled == false)
                {
                    for (int PieNumber = 0; PieNumber <= 29; PieNumber++)
                    {
                        if (PieNumber == 0) myBrush.Color = Color.Black; // facultatif. Met en évidence le sens de rotation
     
                        else
                        {
                            if (PieNumber != 0 & PieNumber % 2 == 0) myBrush.Color = Color.DeepPink; // TransparencyKey
     
                            else
                            {
                                myBrush.Color = Color.Aquamarine;
                            }
                        }
                        myGraphics.FillPie(myBrush, 50, 100, 180, 150, PieNumber * 12, 12);
                        BrushTab[PieNumber] = myBrush;
                    }
                }
     
                // ANIMATION
     
                timer1.Enabled = true;
     
                for (int _PieNumber = 0; _PieNumber <= 29; _PieNumber++)
                    {
                        if (_PieNumber == 0)
                        {
                            myBrush = BrushTab[29];
                            BrushTab1[0] =BrushTab[0];
                            BrushTab[0] = BrushTab[29];
                        }
                        else
                        {
     
                            myBrush = BrushTab1[_PieNumber - 1];
                            BrushTab1[_PieNumber] = BrushTab[_PieNumber];
                            BrushTab[_PieNumber] = BrushTab1[_PieNumber - 1];
                        }
                        myGraphics.FillPie(myBrush, 50, 100, 180, 150, _PieNumber * 12, 12);
     
                    }
     
            }
     
        }
    }
    Code VB: La même structure. seul la syntaxe change. L'animation due à l'alternance de couleurs marche à merveille.
    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
     
    Public Class Form1
        Dim myGraphics As Graphics = Me.CreateGraphics
        Dim myBrush As Brush
        Dim BrushTab(30) As Brush 'table tampon
        Dim BrushTab1(30) As Brush 'table tampon
     
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click, Timer2.Tick
            'Construction du dessin à 30 Pies
            '---------------------------------
            Timer1.Enabled = False
            If Timer2.Enabled = False Then
                For PieNumber = 0 To 29
                    If PieNumber = 0 Then
                        myBrush = New SolidBrush(Color.Black) ' facultatif. met plus en évidence le sens de rotation
                    Else
                        If PieNumber <> 0 And PieNumber Mod (2) = 0 Then
                            myBrush = New SolidBrush(Color.HotPink) ' TransparencyKey ******
                        Else
                            myBrush = New SolidBrush(Color.Lime)
                        End If
                    End If
                    myGraphics.FillPie(myBrush, 50, 100, 180, 150, PieNumber * 12, 12)
                    BrushTab(PieNumber) = myBrush
     
                Next
            End If
            'Animation
            '---------
            Timer2.Enabled = True
     
            For PieNumber = 0 To 29
                If PieNumber = 0 Then
                    myBrush = BrushTab(29)
                    BrushTab1(0) = BrushTab(0)
                    BrushTab(0) = BrushTab(29)
                Else
                    myBrush = BrushTab1(PieNumber - 1)
                    BrushTab1(PieNumber) = BrushTab(PieNumber)
                    BrushTab(PieNumber) = BrushTab1(PieNumber - 1)
                End If
                myGraphics.FillPie(myBrush, 50, 100, 180, 150, PieNumber * 12, 12)
            Next
     
        End Sub
    C'est marqué débutant pas "ton torchon"

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Alex.eu Voir le message
    1/ Merci de t'abstenir de répondre à des questions marquées résolue
    Juste pour info, il n'y a rien dans les règles du Club qui empêche de répondre à une discussion résolue.

    Citation Envoyé par Alex.eu Voir le message
    surtout si c'est juste pour nous faire part de ton humeur à la noix. [...] C'est marqué débutant pas "ton torchon"
    Je ne vois rien de choquant dans la réponse de theMonz31. Comme tu l'indiques tu es débutant, donc il faut t'attendre à recevoir des réflexions plus ou moins plaisantes sur ton code. Si tu n'es pas en mesure d'y faire face, alors autant s'abstenir de poster Personnellement je suis totalement autodidacte et mes débuts n'ont pas été simples, mais les commentaires - même durs - sur ce forum m'ont permis d'évoluer et de renforcer mes connaissances.

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click, Timer2.Tick
    La ligne de code ci-dessus démontre l'intérêt des remarques de theMonz31, tu fais quelque chose qui est contraire au principe de SRP (le S de SOLID, qui signifie Single Responsibility Principle), autrement dit le principe de responsabilité unique. Chaque gestionnaire d'évènement ne doit pas avoir à gérer d'autres événements que celui pour lequel il est concu.

    Donc effectivement on ne peut que te recommander de te documenter plus sur C#, et sur les principes de la POO en général, car il y a un problème de conception évident.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Candidat au Club
    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Le problème était simplement la PORTEE des variable Brush...

    Merci Alex


    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    using System;
    using System.Drawing;
    using System.Windows.Forms;
     
    namespace Graph03
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            SolidBrush[] BrushTab1 = new SolidBrush[6];
            SolidBrush[] BrushTab = new SolidBrush[6];
            SolidBrush myBrush = new SolidBrush(Color.HotPink);
     
            private void button1_Click(object sender, EventArgs e)
            {
                Graphics myGraphics = this.CreateGraphics();
     
     
                if (timer1.Enabled == false)
                {
                    for (int PieNumber = 0; PieNumber <= 5; PieNumber++)
                    {
     
                            if (PieNumber % 2 == 0) myBrush = new SolidBrush(Color.HotPink);
                            else
                            {
                                myBrush = new SolidBrush(Color.Aquamarine);
                            }
     
                        myGraphics.FillPie(myBrush, 50, 100, 180, 150, PieNumber * 60, 60);
                        BrushTab[PieNumber] = new SolidBrush(myBrush.Color);
                    }
     
                }
     
                // ANIMATION
                timer1.Enabled = true;
     
                for (int _PieNumber = 0; _PieNumber <= 5; _PieNumber++)
                {
     
                    if (_PieNumber == 0)
                    {
                        myBrush = new SolidBrush(BrushTab[5].Color);
                        BrushTab1[0] = new SolidBrush(BrushTab[0].Color);
                        BrushTab[0] = new SolidBrush(BrushTab[5].Color);
                    }
                    else
                    {
                        myBrush = new SolidBrush(BrushTab1[_PieNumber - 1].Color);
                        BrushTab1[_PieNumber] = new SolidBrush(BrushTab[_PieNumber].Color);
                        BrushTab[_PieNumber] = new SolidBrush(BrushTab1[_PieNumber - 1].Color);
                    }
                    myGraphics.FillPie(myBrush, 50, 100, 180, 150, _PieNumber * 60, 60);
                }
     
            }//
     
     
        }
    }

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Bonjour

    J'vais ignorer tes remarques et te donner un petit conseil...

    Tu veux faire tourner ton "Pie", alors, dessines le 1 fois dans une bitmap et ensuite, utilises les fonctions de rotations de l'objet Graphics pour simplement
    afficher ta Bitmap en ayant appliquer une transformation (Matrice Rotation)...

    Tu gagneras fortement en performance et en complexité du code...


    et de plus, tu pourrais voir comment jouer avec les transformations pour un objet graphics.
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Timer] timer bloqué par une boucle for?
    Par Jidefix dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 18/09/2006, 17h12
  2. [VB6] Problème contrôle Timer et boucle For-Next ...
    Par Stéphane BEHMENBURG dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/12/2005, 17h36
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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