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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    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?

  2. #2
    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
    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.

  3. #3
    Membre chevronné
    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
    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...

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

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    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?

  5. #5
    Membre émérite

    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
    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

  6. #6
    Membre émérite

    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
    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

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

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    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

  8. #8
    Membre chevronné
    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
    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

  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
    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 émérite

    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
    Par défaut
    Salut Acive

    Le timer c'est pour l'animation

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

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