Utiliser un timer dans une form

Résolu
pierrotm777 Messages postés 24 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 27 mai 2013 - 5 janv. 2012 à 12:57
pierrotm777 Messages postés 24 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 27 mai 2013 - 6 janv. 2012 à 15:06
Bonjour,
J'espère que ma question est postée au bon endroit.
J'essaie d'utiliser un timer dans une form men VB.net 2010 express, mais il semblerait qu'il y ai 3 possubilités.
Je pense cependant que celle préconoisée par msdn serait la suivante :
http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx

Mon but est qu'aprés le lancement d'une form dans laquelle j'ouvre un webbrowser,
je puisse , toutes les 2 secondes faire une action, dans mon cas lire des données issues d'une carte google maps affichée dans ma form.

Ma form fonctionne trés bien mais dés que je tente d'utiliser un timer , soit le timer fonctionne et la form ne s'affiche pas soit la form s'affiche et le timer ne fonctionne
pas .
Mon code est le suivant:
Imports System
Imports System.Timers
Imports System.Windows.Forms
Imports System.Windows.Forms.Timer

Public Class GmapsApiForm
    Dim CheckButton, yahooId As HtmlElement
    Dim GoButton, AddMarker As HtmlElement
    Dim ZoomValue As Integer = 100
    Public Collect As Collection
    Dim maPageHtml As HtmlDocument

    Private Shared WithEvents myTimer As New System.Windows.Forms.Timer()
    Private Shared alarmCounter As Integer = 1
    Private Shared exitFlag As Boolean = False
    ' This is the method to run when the timer is raised.
    Private Shared Sub TimerEventProcessor(ByVal myObject As Object, ByVal myEventArgs As EventArgs)
        myTimer.Stop()
        MsgBox("Test", vbOKOnly, "Timer test !!!")
        alarmCounter += 1
        myTimer.Enabled = True

    End Sub

    Private Sub GmapsApiForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        ' Adds the event and the event handler for the method that will
        ' process the timer event to the timer.
        AddHandler MyTimer.Tick, AddressOf TimerEventProcessor
        ' Adds the event and the event handler for the method that will
        ' process the timer event to the timer.
        ' Sets the timer interval to 5 seconds.
        MyTimer.Interval = 5000
        MyTimer.Start()

        ' Runs the timer, and raises the event.
        While exitFlag = False
            ' Processes all the events in the queue.
            Application.DoEvents()
        End While
    End Sub

    Private Sub GmapsApiForm_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        exitFlag = True
    End Sub
    Public Function go(ByVal url)
        go = ""
        'Navigates
        'To use this function just put:
        'go("WEBSITE HERE")
        'or
        'Dim wURL As Object = TextBox1.Text
        'go(wURL)
        If url = "b" Then
            'Goes Back
            'To use put:
            'go("b")
            WebBrowser2.GoBack()
        ElseIf url = "f" Then
            'Goes Forward
            'To use put:
            'go("f")
            WebBrowser2.GoForward()
        ElseIf url = "h" Then
            'Goes Home
            'To use put:
            'go("h")
            WebBrowser2.GoHome()
        ElseIf url = "r" Then
            WebBrowser2.Refresh()
        ElseIf url = "s" Then
            WebBrowser2.Stop()
        ElseIf url = "" Then
            WebBrowser2.Document.All("submit").InvokeMember("click")
        Else
            WebBrowser2.Navigate("" + url + "")
        End If

    End Function

    Public Function ClickOnButton(ByVal IdAtt)
        ClickOnButton = ""
        WebBrowser2.Document.GetElementById(IdAtt).InvokeMember("Click")
        'other possible possibilities
        'WebBrowser1.Document.getAttribute("value").InvokeMember("Click")
        'WebBrowser1.Document.GetElementById("email").SetAttribute("value", "****@***.com")
        'WebBrowser1.Document.GetElementById("pass").SetAttribute("value", "*****")

    End Function

    Public Function GetTextContentOfElementByID(ByVal id As String) As String 'get the value's id element 
        If Not WebBrowser2.Document.GetElementById(id) Is Nothing Then
            Return WebBrowser2.Document.GetElementById(id).InnerText
        Else
            Return ""
        End If
    End Function

    Public Function SetValueinInput(ByVal IdAtt, ByVal Value) 'set a vlue to a id element
        SetValueinInput = ""
        WebBrowser2.Document.GetElementById(IdAtt).SetAttribute("Value", Value)
    End Function


    Private Sub WebBrowser2_NewWindow2(ByVal ppDisp As Object, ByVal Cancel As Boolean)
        'Empèche d'ouvrir le lien dans une nouvelle fenêtre
        Cancel = True
    End Sub

End Class


Merci de votre aide

5 réponses

ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 6
5 janv. 2012 à 23:29
Bonjour pierrotm n°777,

Compliqué ton code, enfin, pour moi?

En prenant des objets physiques et non logiques, on doit pouvoir largement l'amoindrir, ce qui ne peut qu'être mieux pour le lire? Mais peut être as-tu une raison impérieuse de ne pas vouloir mettre d'objets physiques, pourtant il n'en faudrait que deux?

En physique les imports, je ne suis pas certains qu'un seul soit utile, à voire, car moult devrait l'être par défaut.
Une classe en plus, oui c'est permis, mais bon, une classe peut suffire?
Les "private" on peut les sauter, c'est par défaut, et les "shared" je ne sais pas, à voir, moi je n'en mets jamais et chat marche quand même.

Concernant le Timer, il se contente d'un simple objet à mettre (Timer1), puis à s'adresser à lui dans les propriétés (interval) ce qui simplifie le code, puis à mettre dans le code seulement timer1.enabled = false ou true, selon, et c'est tout, le reste, bof, je ne sais pas pourquoi ça existe, peut être pour une utilisation logique ?


Voici le principe général du timer (testé), tu peux copier coller dans un nouveau programme :


' timer exemple
Option Explicit On
Public Class Form1
  Dim avance As Integer
  ' mettre 3 objets : bouton1, timer1, textbox1

  Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Timer1.Interval = 1000 ' peut se mettre dans les propriétés
    Timer1.Enabled = False
    avance = 0 ' variable globale du timer
  End Sub

  Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Timer1.Enabled = True ' lance timer
  End Sub

  Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    TextBox1.Text = avance ' vérif
    If avance > 4 Then
      Timer1.Enabled = False ' arrête le timer, qui peut repartir avec true...
      TextBox1.Text = TextBox1.Text & " FIN"
      Exit Sub
    End If
    avance = avance + 1 ' progression
  End Sub

End Class



Concernant ton problème stricto sensu, je ne sais trop quoi dire car je ne vois même pas où est la procédure du timer, ce qu'elle englobe, etc, pour le webBrowser c'est pareil, je pense que tu fais une déclaration dynamique des objets, ce qui complique le code, en faisant simple avec un timer1 et un webBrowser1 peut être qu'on pourra y voir plus clair?

Généralement le Timer n'est pas en cause, s'il est bien alimenté pour bouger, il bouge ; par contre le code peut le perturber : par exemple si l'exécution du code au sein de sa procédure ou dont elle dépend est plus long à exécuter que l'intervalle, je ne me souviens plus de ce que ça fait dans ce cas, mais ça peut soit faire un bourrage, d'où un ralentissement, ou encore le non respect du pas qui lui est donné?

Au plaisir, cordialement, Joe.
3