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

VB.NET Discussion :

Timer et boucle


Sujet :

VB.NET

  1. #1
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut Timer et boucle
    Bonjour et joyeux Noël à vous
    Je vous sollicite pour résoudre un problème. Je dois faire un code qui fait déplacer une fenêtre sur l'écran de gauche à droite et qui s'arrête à une certaine distance que je spécifie.
    J'ai essayé ce code, mais il plante

    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
    Public Class Form1
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.Left = 0
            Me.Top = 0
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Timer1.Interval = 50
            Do
                Me.Timer1.Enabled = True
            Loop While Me.Left < 200
     
        End Sub
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Me.Left = Me.Left + 5
     
        End Sub
    End Class
    pouvez-vous m'expliquer pourquoi?
    J'apprends la programmation pour le plaisir

  2. #2
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Pour moi,je comprends la chose comme suit:
    On prend comme référence le point A (pixel) le plus haut (top) et le plus gauche (left) de la fenêtre . sa valeur est donné par rapport à mon écran, sachant, par convention , que le point de mon écran situé à l'angle sup gauche vaut (0,0). Donc si Me.left=100 alors A est à une distance de 100 pixels du bord gauche de l'écran.
    est ce vrai?
    J'apprends la programmation pour le plaisir

  3. #3
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Bonjour

    pas besoin de loop


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Button1_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Bt_Calcul.MouseClick
            Timer1.Start()
            Timer1.Interval = 100
     
        End Sub
     
        Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
            Me.Left += 3
            If Me.Left > Me.Width \ 2 Then
                Timer1.Stop()
            End If
        End Sub
    selon ton code le timer est exécuté à la sortie de ta boucle

  4. #4
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
            Me.Left += 20
            If Me.Left > My.Computer.Screen.WorkingArea.Width  Then
                Timer1.Stop()
            End If
        End Sub
    essaie de faire si ta fenêtre atteint le coté droit revenir vers la gauche et le contraire

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par stracoma Voir le message
    Pour moi,je comprends la chose comme suit:
    On prend comme référence le point A (pixel) le plus haut (top) et le plus gauche (left) de la fenêtre . sa valeur est donné par rapport à mon écran, sachant, par convention , que le point de mon écran situé à l'angle sup gauche vaut (0,0). Donc si Me.left=100 alors A est à une distance de 100 pixels du bord gauche de l'écran.
    est ce vrai?
    Oui
    Citation Envoyé par stracoma Voir le message
    Bonjour et joyeux Noël à vous
    Je vous sollicite pour résoudre un problème. Je dois faire un code qui fait déplacer une fenêtre sur l'écran de gauche à droite et qui s'arrête à une certaine distance que je spécifie.
    J'ai essayé ce code, mais il plante
    ...
    pouvez-vous m'expliquer pourquoi?
    Plusieurs problèmes surviennent dans ton code.
    1er - ta boucle "Do ... Loop ..." accapare la main et ne donne pas accès au reste du code (le timer ne court-circuite pas ta boucle et la fenêtre reste à sa place)
    2ème - tu n'arrête pas le timer, si celui-ci est déclencher à chaque Tick il va indéfiniment pousser ta fenêtre.

    Pou voir le premier problème, tu peux rajouter une instruction issu de vb6 (à ne pas faire dans vb.net, présent seulement à titre didactique)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Timer1.Interval = 50
            Do
                Me.Timer1.Enabled = True
                Application.DoEvents()  ' pour voir à titre didacique, ne pas utiliser
            Loop While Me.Left < 200
        End Sub
    Maintenant ta fenêtre va se déplacer, mais elle va sortir de l'écran, Pourquoi ?
    Parceque le timer va continuer de se déclencher et rajouter 5 à Me.Left indiffiniment (enfin jusqu'à un débordement qui provoquera une erreur).

    Il faut donc une autre approche.
    Comme l'indique shayw, il n'y a pas besoin de boucle puisque le timer va se déclencher à intervale régulier.
    C'est donc lui qui va vérifier la condition (if condition) et augmenter la valeur de Me.Left (then +) ou s'arrêter (else stop).
    Tu peux donc faire ton init
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.Left = 0
            Me.Top = 0
            Timer1.Interval = 50
        End Sub
    Le bouton déclenche le timer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.Timer1.Enabled = True
        End Sub
    Et l'évènement tick du timer va gérer le positionnement de la fenêtre (et son arrêt)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            ' ... exercice : écrire la ligne de code "if" 
            'if ... then ... else ...
            ' (ou les 5 lignes si décomposé pour plus de clartée)
            'if ...
            '  ...
            'else ...
            '  ...
            'end if ...
        End Sub
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Bonjour, bonnes fêtes à tous,
    Le but étant de simplifier en vb.net (pas de vb6), sans timer, sans boucle do/loop, uniquement un simple for/next en 4 lignes de code, testé et fonctionnel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     For i As Integer = PositionXDuForm To (LargeurDelEcran - LargeurDuForm)
            Dim Emplac As Point = New Point(i, PositionYDuForm)
            PositionDuForm = Emplac
     next
    Bon... vous avez compris que la déclaration de 'Emplac' dans la boucle n'a rien à y faire, mais ça m'a fait économiser une ligne de code...
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  7. #7
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Citation Envoyé par shayw Voir le message
    plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
            Me.Left += 20
            If Me.Left > My.Computer.Screen.WorkingArea.Width  Then
                Timer1.Stop()
            End If
        End Sub
    essaie de faire si ta fenêtre atteint le coté droit revenir vers la gauche et le contraire
    avec ce code difficile de vérifier si la fenêtre s'arrête ou se déplace à l'infini. Mais vérification faite avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Me.Left += 20
            If Me.Left > My.Computer.Screen.WorkingArea.Width - 50 Then
                Timer1.Stop()
            End If
        End Sub
    J'apprends la programmation pour le plaisir

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Re:
    Pourquoi '- 50' ?
    Pourquoi pas '- me.width' ?
    si tu changes la largeur du form le - 50 ne sera plus adapté sinon
    D'ailleurs tu fais le 'Me.Left += 20' avant de vérifier sa position, pas logique...

    regarde ce que j'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i As Integer = PositionXDuForm To (LargeurDelEcran - LargeurDuForm)
    'Ce qui fait:
    For i As Integer = Me.Location.X To Screen.PrimaryScreen.Bounds.Width - Me.Width
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Ou pour respecter la condition donnée dans le premier post. (et l'utilisation du timer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            If Me.Left < 200 Then Me.Left = Me.Left + 5 Else Me.Timer1.Enabled = False
    donc le code du timer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If Me.Left < 200 Then Me.Left = Me.Left + 5 Else Me.Timer1.Enabled = False
        End Sub

    @acive_cs
    Sinon la boucle "For" donne une autre approche, [Edit]mais il n'y a pas la temporisation. (tout est trop rapide)
    Citation Envoyé par ACIVE_CS Voir le message
    Bon... vous avez compris que la déclaration de 'Emplac' dans la boucle n'a rien à y faire, mais ça m'a fait économiser une ligne de code...
    Il n'y a même pas besoin de cette variable (Me.Location = New Point(i, 0))[/Edit]
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  10. #10
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Salut Acive

    Le timer c'est pour l'animation

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Bonnes fêtes à tous,

    Ok les gars, si vous voulez un peu plus d'animation:
    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
     
    Public Class Form1
        Dim Key As Boolean = False
     
        Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
            Key = True
        End Sub
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.KeyPreview = True
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.Text = "Appuyez sur une touche pour sortir de cette galère..."
            Dim Vitesse As Integer = 10
            Dim Pos_1 As Integer = Me.Location.X
            Dim Pos_2 As Integer = Me.Location.Y
            Dim Random As New Random(), Rnd As Integer
            Dim Emplac As Point
            Dim SensX As Boolean
            Dim SensY As Boolean
            Do
                Rnd = Random.Next(1, 9)
                If SensX = True Then
                    Emplac = New Point(Me.Location.X + Rnd, Me.Location.Y)
                    If Me.Location.X + Rnd >= (Screen.PrimaryScreen.Bounds.Width - Me.Width) Then SensX = False
                Else
                    Emplac = New Point(Me.Location.X - Rnd, Me.Location.Y)
                    If Me.Location.X - Rnd <= 0 Then SensX = True
                End If
                Me.Location = Emplac
                Application.DoEvents()
                Threading.Thread.Sleep(Vitesse)
                Rnd = Random.Next(1, 9)
                If SensY = True Then
                    Emplac = New Point(Me.Location.X, Me.Location.Y + Rnd)
                    If Me.Location.Y + Rnd >= (Screen.PrimaryScreen.Bounds.Height - Me.Height) Then SensY = False
                Else
                    Emplac = New Point(Me.Location.X, Me.Location.Y - Rnd)
                    If Me.Location.Y - Rnd <= 0 Then SensY = True
                End If
                Me.Location = Emplac
                Application.DoEvents()
                If Key = True Then Exit Do
            Loop
        End Sub
     
    End Class
    Oupsss... j'ai du exagérer sur la bûche de noël, mais elle fondait, il fait 30°C à l'extérieur chez moi...
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  12. #12
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    mets Dim Vitesse As Integer = 0

    je consaste que plus la vitesse est petite plus cela va vite donc pour ralentir il faut accèlérer


    un bug après l'avoir stoppé et cliquez le bouton ça bouge comme une tortue


    Tu connais
    http://members.iinet.net.au/~pontipak/redsquare.html

  13. #13
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Ah ah ah...
    pour ralentir il faut accèlérer
    On a vu ça avec schumacher à 30 à l'heure sur des skis... ce gars la... il ne faut pas le faire descendre en dessous de 250

    un bug après l'avoir stoppé et cliquez le bouton
    J'ai jamais dit qu'il fallait re-cliquer sur le bouton...
    (j'ai même pas testé d'ailleurs)
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  14. #14
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    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
    75
    Public Class Form1
        Dim value As Integer
        Dim Key As Boolean = False
        Private counter As Integer
        Private lb As New Label
     
        Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
            lb.Text = "Mais non pour arrêter il faut trouver la bonne touche"
            Threading.Thread.Sleep(600)
            If e.KeyValue = value Then
                Key = True
            End If
            counter -= 1
            If counter = 1 Then
                lb.Text = "encore un essais"
            End If
            If counter = 0 Then
                Key = True
            End If
        End Sub
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.KeyPreview = True
            lb.Font = New Font("arial", 12, FontStyle.Bold)
            lb.AutoSize = True
            lb.Text = "Appuyez sur une touche pour sortir de cette galère..."
            lb.Location = New Point(10, 10)
            Me.Controls.Add(lb)
            counter = 4
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Dim Vitesse As Integer = 10
            Dim Pos_1 As Integer = Me.Location.X
            Dim Pos_2 As Integer = Me.Location.Y
            Dim Random As New Random(), Rnd As Integer
            Dim Emplac As Point
            Dim SensX As Boolean
            Dim SensY As Boolean
            value = Random.Next(Convert.ToInt32("a"c), Convert.ToInt32("z"c))
            Do
                Rnd = Random.Next(1, 9)
     
     
                If SensX = True Then
                    Emplac = New Point(Me.Location.X + Rnd, Me.Location.Y)
                    If Me.Location.X + Rnd >= (Screen.PrimaryScreen.Bounds.Width - Me.Width) Then SensX = False
                Else
                    Emplac = New Point(Me.Location.X - Rnd, Me.Location.Y)
                    If Me.Location.X - Rnd <= 0 Then SensX = True
                End If
                Me.Location = Emplac
                Application.DoEvents()
                Threading.Thread.Sleep(Vitesse)
                Rnd = Random.Next(1, 9)
                If SensY = True Then
                    Emplac = New Point(Me.Location.X, Me.Location.Y + Rnd)
                    If Me.Location.Y + Rnd >= (Screen.PrimaryScreen.Bounds.Height - Me.Height) Then SensY = False
                Else
                    Emplac = New Point(Me.Location.X, Me.Location.Y - Rnd)
                    If Me.Location.Y - Rnd <= 0 Then SensY = True
                End If
                Me.Location = Emplac
                Application.DoEvents()
                If Key = True Then Exit Do
            Loop
            Key = False
     counter = 4
            lb.Text = "Appuyez sur une touche pour sortir de cette galère..."
        End Sub
     
     
     
    End Class

  15. #15
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    (Après je dois revenir au sujet de la boucle)
    Maintenant j'ai ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If Me.Left = My.Computer.Screen.WorkingArea.Width - Me.Width Then
                Me.Timer1.Stop()
            End If
            Me.Left = Me.Left + 5
        End Sub
    je me suis amusé à utiliser Me.right:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If Me.Right = My.Computer.Screen.WorkingArea.Width Then
                Me.Timer1.Enabled = False
            End If
            Me.Left = Me.Left + 5
        End Sub
    je voudrai savoir si My.Computer.Screen.WorkingArea.Width et Height représentent la résolution de l'écran
    J'apprends la programmation pour le plaisir

  16. #16
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Pourquoi le code accepte "Me.Left = Me.Left" + 5 et n'accèpte pas "Me.Right = Me.Right + 5" (donne erreur)?
    Est ce que parce que Me.left est une constante pour Me, et que Me.Right peut changer si la fenêtre est redimensionnable?
    J'apprends la programmation pour le plaisir

  17. #17
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par ACIVE_CS Voir le message
    Bonnes fêtes à tous,

    Ok les gars, si vous voulez un peu plus d'animation:
    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
     
    Public Class Form1
        Dim Key As Boolean = False
     
        Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
            Key = True
        End Sub
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.KeyPreview = True
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.Text = "Appuyez sur une touche pour sortir de cette galère..."
            Dim Vitesse As Integer = 10
            Dim Pos_1 As Integer = Me.Location.X
            Dim Pos_2 As Integer = Me.Location.Y
            Dim Random As New Random(), Rnd As Integer
            Dim Emplac As Point
            Dim SensX As Boolean
            Dim SensY As Boolean
            Do
                Rnd = Random.Next(1, 9)
                If SensX = True Then
                    Emplac = New Point(Me.Location.X + Rnd, Me.Location.Y)
                    If Me.Location.X + Rnd >= (Screen.PrimaryScreen.Bounds.Width - Me.Width) Then SensX = False
                Else
                    Emplac = New Point(Me.Location.X - Rnd, Me.Location.Y)
                    If Me.Location.X - Rnd <= 0 Then SensX = True
                End If
                Me.Location = Emplac
                Application.DoEvents()
                Threading.Thread.Sleep(Vitesse)
                Rnd = Random.Next(1, 9)
                If SensY = True Then
                    Emplac = New Point(Me.Location.X, Me.Location.Y + Rnd)
                    If Me.Location.Y + Rnd >= (Screen.PrimaryScreen.Bounds.Height - Me.Height) Then SensY = False
                Else
                    Emplac = New Point(Me.Location.X, Me.Location.Y - Rnd)
                    If Me.Location.Y - Rnd <= 0 Then SensY = True
                End If
                Me.Location = Emplac
                Application.DoEvents()
                If Key = True Then Exit Do
            Loop
        End Sub
     
    End Class
    Oupsss... j'ai du exagérer sur la bûche de noël, mais elle fondait, il fait 30°C à l'extérieur chez moi...
    Il existe toujours plusieurs méthodes , mais ta boucle ressemble à une usine à gaz (plus de 30 lignes) alors qu'avec le timer 4 lignes suffises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
            If Droite Then If Me.Left < My.Computer.Screen.WorkingArea.Width - Me.Width Then Me.Left = Me.Left + deplacement Else Droite = Not Droite
            If Not Droite Then If Me.Left > 0 Then Me.Left = Me.Left - deplacement Else Droite = Not Droite
            If Descend Then If Me.Top < My.Computer.Screen.WorkingArea.Height - Me.Height Then Me.Top = Me.Top + deplacement Else Descend = Not Descend
            If Not Descend Then If Me.Top > 0 Then Me.Top = Me.Top - deplacement Else Descend = Not Descend
        End Sub
    Le code complet
    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
    Public Class Form1
        Const deplacement As Integer = 10 ' décalage dans le déplacement
        Dim Descend As Boolean = True   ' mouvement vertical
        Dim Droite As Boolean = True    ' mouvement horizontal
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.Left = 0
            Me.Top = 0
            Timer1.Interval = 50
        End Sub
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Me.Timer1.Enabled = Not Me.Timer1.Enabled
        End Sub
     
        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
            If Droite Then If Me.Left < My.Computer.Screen.WorkingArea.Width - Me.Width Then Me.Left = Me.Left + deplacement Else Droite = Not Droite
            If Not Droite Then If Me.Left > 0 Then Me.Left = Me.Left - deplacement Else Droite = Not Droite
            If Descend Then If Me.Top < My.Computer.Screen.WorkingArea.Height - Me.Height Then Me.Top = Me.Top + deplacement Else Descend = Not Descend
            If Not Descend Then If Me.Top > 0 Then Me.Top = Me.Top - deplacement Else Descend = Not Descend
        End Sub
     
    End Class
    Cliquez sur le bouton pour démarrer et arrêter (if you can ).

    [Edit] [mode hors sujet] J'espère que la bûche était bonne. (30° faut que je déménage) [/Edit]
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  18. #18
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    je voudrai savoir si My.Computer.Screen.WorkingArea.Width et Height représentent la résolution de l'écran
    je ne pense pas plutot Screen.PrimaryScreen.Bounds.Width et Screen.PrimaryScreen.Bounds.height

  19. #19
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    stracoma:
    Evite les
    Utilise plutôt:
    Par expérience tu éviteras pas mal de doutes...

    Sinon tu as compris le principe...
    Sache que
    Peut aussi se traduire en vb.net en
    Sinon il est bien au bon endroit dans le timer sauf que t'aurais du faire un 'exit sub' après le stop

    Shayw: pas mal la devinette entre a et z, j'ai du mettre 5 minutes avant de comprendre ce qu tu voulais faire
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  20. #20
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Citation Envoyé par stracoma Voir le message
    Pourquoi le code accepte "Me.Left = Me.Left" + 5 et n'accèpte pas "Me.Right = Me.Right + 5" (donne erreur)?
    Est ce que parce que Me.left est une constante pour Me, et que Me.Right peut changer si la fenêtre est redimensionnable?
    parceque Property 'Right' is 'ReadOnly'

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. timer et boucle
    Par ferarkan dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 26/01/2010, 15h26
  2. choix entre timer et boucle tantque
    Par phil_niv dans le forum Général Python
    Réponses: 1
    Dernier message: 10/10/2008, 13h16
  3. [AJAX] AJAX, timer et boucle while
    Par podidoo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 15/03/2007, 20h36
  4. Réponses: 4
    Dernier message: 08/02/2006, 08h31
  5. [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

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