pierrotm777
Messages postés24Date d'inscriptionvendredi 10 octobre 2008StatutMembreDernière intervention27 mai 2013
-
5 janv. 2012 à 12:57
pierrotm777
Messages postés24Date d'inscriptionvendredi 10 octobre 2008StatutMembreDernière intervention27 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
ehjoe
Messages postés728Date d'inscriptionsamedi 4 avril 2009StatutMembreDernière intervention30 mars 20144 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é?
pierrotm777
Messages postés24Date d'inscriptionvendredi 10 octobre 2008StatutMembreDernière intervention27 mai 2013 6 janv. 2012 à 15:03
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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?