Utiliser un timer dans une form [Résolu]

pierrotm777 24 Messages postés vendredi 10 octobre 2008Date d'inscription 27 mai 2013 Dernière intervention - 5 janv. 2012 à 12:57 - Dernière réponse : pierrotm777 24 Messages postés vendredi 10 octobre 2008Date d'inscription 27 mai 2013 Dernière intervention
- 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
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 5 janv. 2012 à 23:29
3
Merci
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.

Merci ehjoe 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de ehjoe
pierrotm777 24 Messages postés vendredi 10 octobre 2008Date d'inscription 27 mai 2013 Dernière intervention - 6 janv. 2012 à 11:22
0
Merci
Merci beaucoup,
J'ai adapté à mon besoin et je comprend maintenant comment fonctionne le timer dans une form .
Commenter la réponse de pierrotm777
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 6 janv. 2012 à 11:38
0
Merci
Bonjour pierrotm n°777,

Content d'avoir pu t'être utile, alors ?

Tu as mis un objet Timer1 + WebBrowser1, ou tu maintiens ton codage virtuel qui fait le double ?

Je l'ai toujours dit : il n'y a pas de bonne réponse sans un exemple qui fonctionne

Au plaisir, cordialement, Joe.
Commenter la réponse de ehjoe
pierrotm777 24 Messages postés vendredi 10 octobre 2008Date d'inscription 27 mai 2013 Dernière intervention - 6 janv. 2012 à 15:03
0
Merci
He bien j'ai ajouté un objet timer , puis cliqué dessus et enfin ai ajouté votre code !
Où est le doublon svp ?
J'ai donc modifié le code ainsi !
Option Explicit On

Public Class GmapsApiForm
    'Dim SDK As Object = CreateObject("RideRunner.SDK")
    Dim MainPath As String = Application.ExecutablePath 'SDK.GetInfo("=$PLUGINSPATH$") & "RRGoogleMapsTools"
    Dim INI As New INIReader(MainPath & "RRGoogleMapsTools.ini")
    Dim gps()
    Dim avance As Integer

    Public Sub GmapsApiForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Interval = CInt(INI.ReadString("Timer1", "delay", "")) ' peut se mettre dans les propriétés
        Timer1.Enabled = False
        avance = 0 ' variable globale du timer
    End Sub

    Public Function go(ByVal url)
        go = ""
        If url = "b" Then
            WebBrowser2.GoBack()
        ElseIf url = "f" Then
            WebBrowser2.GoForward()
        ElseIf url = "h" Then
            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

    Public Sub WebBrowser2_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser2.DocumentCompleted
        'If e.Url.Host = "www.yahoo.com" Then
        'WebBrowser2.Navigate("http://www.youtube.com")
        'End If
        'If e.Url.Host = "www.youtube.com" Then
        'MsgBox("HELLO WORLD !!!", vbOKOnly, "Info")
        'End If
    End Sub

    Public 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

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If WebBrowser2.IsBusy Then Return ' <=== tihs is an important test
        If LCase(SDK.GetInfo("RRSCREEN")) "rrgooglemapstools.skin" Or LCase(SDK.GetInfo("RRSCREEN")) "rrgooglemapstools_full.skin" And SDK.GetInd("online") = "True" Then
            If (WebBrowser2.ReadyState = WebBrowserReadyState.Complete) Then ' <== so is this important critiera
                Select Case WebBrowser2.Url.OriginalString
                    Case MainPath & "gmaps_gpstoadd.html" 'carte gps vers adresse
                        'gps = Split(Replace(GetTextContentOfElementByID("latlng"), "(", "").Replace(")", ""), ",")
                        'SDK.SetUserVar("GPSLATCLIP", CStr(Math.Round(Val(gps(0)), 6)))
                        'SDK.SetUserVar("GPSLONCLIP", CStr(Math.Round(Val(gps(1)), 6)))
                        'SDK.SetUserVar("ADDRESSCLIP", GetTextContentOfElementByID("formatedAddress"))
                        'SDK.SetUserVar("ZOOMCLIP", GetTextContentOfElementByID("zoom_level"))
                        commande1()
                    Case MainPath & "gmaps_countries.html" 'carte des pays
                        'SDK.SetUserVar("ADDRESSCLIP", GetTextContentOfElementByID("country"))
                        commande2()
                    Case MainPath & "gmaps_geolocatewifispot.html" 'geolocalisation d'un spot wifi ou d'une connexion internet
                        'SDK.SetUserVar("ADDRESSCLIP", GetTextContentOfElementByID("info"))
                        command3()
                    Case MainPath & "gmaps_panoramio.html"
                        'SDK.SetUserVar("ADDRESSCLIP", GetTextContentOfElementByID("photoPanel"))
                        command4()
                End Select
            Else
                'SDK.SetUserVar("GPSLATCLIP", "GPS OFF")
                'SDK.SetUserVar("GPSLONCLIP", "GPS OFF")
                command5()
            End If
        End If

        'SDK.execute("SETVAR;URL;" & WebBrowser2.Url.AbsoluteUri)
        If avance > 4 Then
            'If SDK.getind("GMAPS_STATUSTIMER1") = "False" Then
            Timer1.Enabled = False ' arrête le timer, qui peut repartir avec true...
            Exit Sub
        End If
        avance = avance + 1
    End Sub

End Class

(Ne pas tenir compte des lignes SDK.)
Dans le timer je voudrais lancer une commande en fonction de la page ce touvant chargée dans la form !
Commenter la réponse de pierrotm777
pierrotm777 24 Messages postés vendredi 10 octobre 2008Date d'inscription 27 mai 2013 Dernière intervention - 6 janv. 2012 à 15:06
0
Merci
oops,
J'ai oublié de remplacer la ligne:
Timer1.Interval = CInt(INI.ReadString("Timer1", "delay", ""))
par
Timer1.Interval = 2000

Je pense que mon problème maintenant se situe au niveau de la ligne:
Select Case WebBrowser2.Url.OriginalString
Commenter la réponse de pierrotm777

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.