Avatar billede ylwen Nybegynder
04. marts 2011 - 08:02 Der er 9 kommentarer og
1 løsning

xml og timer

Jeg henter noget data ind fra en xml fil. heriblandt en tid og en url.

xmld = New XmlDocument()
        xmld.Load("c:\sampleXML.xml")
        xnodelist = xmld.SelectNodes("/root/webpage")

        For Each Me.xnode In xnodelist
            url = xnode.ChildNodes.Item(0).InnerText
            time = xnode.ChildNodes.Item(1).InnerText

nu ville jeg så gerne have vist url'en i det angivne tidsinterval inden løkken køre videre og først efter tiden er gået køre næste loop. Hvordan gør jeg det?
Avatar billede ylwen Nybegynder
04. marts 2011 - 09:21 #1
Jeg har forsøgt med

  Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        xmld = New XmlDocument()
        xmld.Load("c:\sampleXML.xml")
        xnodelist = xmld.SelectNodes("/root/webpage")

        For Each Me.xnode In xnodelist
            Timer1.Interval = 5000
            url = xnode.ChildNodes.Item(0).InnerText
            WebBrowser1.Navigate(url)
        Next
    End Sub

men der bliver bare vist et tomt browser vindue.
Avatar billede ylwen Nybegynder
04. marts 2011 - 09:21 #2
og ja, jeg har startet timer1 i form_load :)
Avatar billede aaberg Nybegynder
04. marts 2011 - 11:15 #3
Det kan du ikke. Resultatet bliver først sendt tilbage til browseren, når alt din kode er kørt. Så dette er desværre umuligt at gøre med server-kode.

Den eneste mulighed du har for at gøre dette, er ved at lave det i javascript.
Avatar billede ylwen Nybegynder
04. marts 2011 - 11:57 #4
Det er bare underligt at jeg så kan med nedenstående kode i timeren:

        If x = 0 Then
            Timer1.Interval = 1000
            WebBrowser1.Navigate("http://google.dk")
            x = 1
        Else
            Timer1.Interval = 5000
            WebBrowser1.Navigate("http://dr.dk")
            x = 0
        End If
Avatar billede ylwen Nybegynder
04. marts 2011 - 11:58 #5
Med den kode står den fint og skifter mellem de to websider i henholdsvis 1 og 5 sek.
Avatar billede aaberg Nybegynder
04. marts 2011 - 12:39 #6
Jeg ser nu, at det er en windows form applikation du laver, med en embedded web-browser. Jeg troede det var en asp.net side du var i gang med.

Så kan det lade sig gøre.

Jeg skal prøve at lave et eksempel til dig, som virker.
Avatar billede ylwen Nybegynder
04. marts 2011 - 16:55 #7
Ahh, det ville være fedt. Jeg har prøvet mange ting, men kan ikke lige få det til at virke. Så hvis du kunne give mig et hint eller lidt kode ville det være fantastisk.
Avatar billede aaberg Nybegynder
05. marts 2011 - 12:35 #8
Beklager at mit svar kommer så sent, men jeg har ikke haft så meget tid :) Men nu har jeg i hvert fald lavet noget som virker.

Først laver jeg en klasse som hedder UrlTime, som skal indeholde information om Url'er og hvor lang tid Url'erne skal være åbne. Jeg har givet klassen 2 properties; Url og Duration

Public Class UrlTime

    Public Sub New(ByVal url As String, ByVal duration As Integer)
        Me.Duration = duration
        Me.Url = url
    End Sub

    Private _url As String
    Public Property Url() As String
        Get
            Return _url
        End Get
        Set(ByVal value As String)
            _url = value
        End Set
    End Property


    Private _duration As Integer
    Public Property Duration() As Integer
        Get
            Return _duration
        End Get
        Set(ByVal value As Integer)
            _duration = value
        End Set
    End Property


End Class


Inde i koden til formen har jeg lavet en liste af UrlTime objekter. Denne liste fylder jeg op i Form1_Load metoden, og så sætter jeg i gang timeren. I timerens Tick metode, sætter jeg Interval på timeren, og sætter Url'en i browseren. Her er koden fra formen:
Imports System.Collections.Generic
Imports System.Xml



Public Class Form1

    Private urlTimeIndex As Integer
    Private _urlTimes As List(Of UrlTime)

    Public Property UrlTimes() As List(Of UrlTime)
        Get
            Return _urlTimes
        End Get
        Set(ByVal value As List(Of UrlTime))
            _urlTimes = value
        End Set
    End Property


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

        Dim xmld As XmlDocument
        Dim xnodelist As XmlNodeList

        xmld = New XmlDocument()
        xmld.Load("c:\sampleXML.xml")
        xnodelist = xmld.SelectNodes("/root/webpage")

        Me.UrlTimes = New List(Of UrlTime)
        For Each node As XmlNode In xnodelist
            Dim urlTime As New UrlTime(node.ChildNodes.Item(0).InnerText, Integer.Parse(node.ChildNodes.Item(1).InnerText))
            Me.UrlTimes.Add(urlTime)
        Next

        'Følgende linjer er til test.
        'Me.UrlTimes.Add(New UrlTime("http://www.google.com", 5000))
        'Me.UrlTimes.Add(New UrlTime("http://www.bing.com", 2000))
        'Me.UrlTimes.Add(New UrlTime("http://eksperten.dk", 8000))

        Me.urlTimeIndex = Integer.MaxValue
        Me.Timer1.Interval = 1
        Me.Timer1.Start()
       
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If Me.urlTimeIndex >= Me.UrlTimes.Count Then
            Me.urlTimeIndex = 0
        End If

        Dim current = Me.UrlTimes(Me.urlTimeIndex)

        Me.Timer1.Interval = current.Duration
        Me.WebBrowser1.Url = New Uri(current.Url)

        Me.urlTimeIndex = Me.urlTimeIndex + 1

    End Sub


End Class
Avatar billede ylwen Nybegynder
07. marts 2011 - 11:05 #9
Yes, det funker. Tusinde tak for hjælpen og din tid.

En af de sider jeg skal have vist er lidt langsom om at loade. Det bevirker så at siden kun bliver vist i ganske få sekunder.

Jeg har forsøgt at sætte denne kode ind sidst i timeren

Do
        Loop Until WebBrowser1.ReadyState = WebBrowserReadyState.Complete

men det virker ikke. Den looper bare i en uendelighed.
Kunne man evt. cashe siderne inden de bliver vist første gang??
Avatar billede aaberg Nybegynder
07. marts 2011 - 11:46 #10
Jeg fik timeren til at starte når siden var færdig-loaded, ved at gøre følgende:

Først tilføjede jeg en StatusStrip til siden. På denne StatusStrip tilføjede jeg en label med navn ReadyStateLabel. Dette er så man kan se om siden loader eller er færdig-loadet. Du bestemmer selvfølgelig selv om du vil have den. I min Timer1_Tick metode starter jeg nu med at stoppe timeren, og sætte readyStateLabel = "Loading...". Nu ser Timer1_Tick metoden altså sådan ud:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    Me.Timer1.Stop()
    Me.readyStateLabel.Text = "Loading..."

    If Me.urlTimeIndex >= Me.UrlTimes.Count Then
        Me.urlTimeIndex = 0
    End If

    Dim current = Me.UrlTimes(Me.urlTimeIndex)

    Me.Timer1.Interval = current.Duration
    Me.WebBrowser1.Url = New Uri(current.Url)

    Me.urlTimeIndex = Me.urlTimeIndex + 1

End Sub

Så har jeg tilføjet en handler til WebBrowserens DocumentCompleted event. Denne skal starte timeren igen, og sætte readyStateLabel til "ready".

Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    Me.Timer1.Start()
    Me.readyStateLabel.Text = "Ready"
End Sub

Så skal det virke.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester