Počkať WebBowser loading   zodpovězená otázka

VB.NET, Komponenty, .NET

Spustím program, ktorý načítava do WebBrowseru za určitých podmienok. Ako to urobiť, aby počas toho času sa mi zobrazoval formulár s textom napríklad "Počkajte prosím". Ďakujem za každú odpoveď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        AddHandler WebBrowser1.DocumentCompleted, Sub(sender2 As Object, e2 As EventArgs) Label1.Text = "Hotovo"
        AddHandler WebBrowser1.DocumentTitleChanged, Sub(sender3 As Object, e3 As EventArgs) Me.Text = WebBrowser1.DocumentTitle
        AddHandler WebBrowser1.ProgressChanged, Sub(sender4 As Object, e4 As WebBrowserProgressChangedEventArgs)
                                                    ProgressBar1.Maximum = Math.Max(e4.MaximumProgress, e4.CurrentProgress) ' CurrentProgress občas větší než MaximumProgress
                                                    ProgressBar1.Value = Math.Max(0, e4.CurrentProgress) ' CurrentProgress je občas -1
                                                End Sub
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        WebBrowser1.Navigate(TextBox1.Text)
        Label1.Text = "Načítání"
    End Sub

Dále je možné ošetřit několik dalších událostí kolem WebBrowseru, jako třeba změnu stavového textu, kliknutí na odkaz a zahájení navigace, zahájení stažení souboru, otevření nového okna prohlížeče atp...

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ďakujem za odpoveď, ale nech som čínsky pápež, ak tomu rozumiem. Trošku mi to aj funguje, ale naozaj nerozumiem. Čo sú sender 1, 2 , ... Inak naznačené riešenie vyzerá super.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jedná se o zkrácený zápis, je to lambda funkce (nebo spíš procedura v tomto případě).

Dá se to rozepsat:

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        WebBrowser1.Navigate(TextBox1.Text)
        Label1.Text = "Načítání"
    End Sub

Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As EventArgs) Handles WebBrowser1.DocumentCompleted
    Label1.Text = "Hotovo"
End Sub
Private Sub WebBrowser1_DocumentTitleChanged(sender As Object, e As EventArgs) Handles WebBrowser1.DocumentTitleChanged
    Me.Text = WebBrowser1.DocumentTitle
End Sub
Private Sub WebBrowser1_ProgressChanged(sender As Object, e As WebBrowserProgressChangedEventArgs) Handles WebBrowser1.ProgressChanged
    ProgressBar1.Maximum = Math.Max(e.MaximumProgress, e4.CurrentProgress) ' CurrentProgress občas větší než MaximumProgress
    ProgressBar1.Value = Math.Max(0, e.CurrentProgress) ' CurrentProgress je občas -1
End Sub

Edit: Samozřejmě jsem zapomněl doplnit Handles klauzule všude, v kódu je to už doplněné, omlouvám se, pokud jsem Vás zmátl.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Pán Clarai, napriek tomu že tomu nerozumiem funguje to. Takže skúsim si to naštudovať, ďakujem za odpoveď a túto otázku považujem za uzavretú. Príjemný večer!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je to úplně jednoduché, handler události je nějaká metoda. Když tedy vytvoříte handler pro tlačítko Visual Studio Vám vyrobí něco jako:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

End Sub

Toto je metoda a ta klauzule Handles značí, že když nastane událost Button1.Click, spustí se ta metoda Button1_Click.

Tomuto vztahu mezi tou událostí a metodou se říká přiřazení handleru, kde handler označuje tu metodu Button1_Click.

Handler se dá přiřadit i dynamicky, v době, kdy je program už spuštěn:

AddHandler Button1.Click, AddressOf Button1_Click_Nahradni

Když provedeme tento řádek kódu a pak nastane událost Click objektu Button1, spustí se metoda Button1_Click_Nahradni a pokud jsme nechali tu deklaraci předtím, kdy jsme přiřadili ten handler Button1_Click, spustí se i ten.

To je k ošetřování událostí.

A teď si představte další věc: vnímejte tu metodu jako kdyby to byla proměnná.

Dim mojeMetoda As Action = Sub()
                               'procedura přiřazená do proměnné (typ Action či Action(Of T...Tx) pro proceduru s parametry a typ Func nebo Func(Of T...Tx) pro funkce)
                           End Sub

Pokud je v metodě (proceduře či funkci) jen jeden řádek kódu, můžeme to napsat inlinově a vynechat End konstrukci.

Dim mojeMetoda = Sub() MsgBox("toto je moje metoda")

Toť vše.

Nyní zkombinujeme tyto dvě znalosti a dostaneme se k tomu, že můžeme dynamicky přiřadit handler události, který nemusíme adresovat (AddressOf) na metodu deklarovanou v kódu, ale radši na referenci proměnné typu Action. Následovně:

Dim mojeMetoda = Sub(sender, e) MsgBox(DirectCast(sender,Control).Name
AddHandler Button1.Click, mojeMetoda

A pokud by měla proměnné mojeMetoda sloužit jen k tomuhle a nebyla by potřeba na dalším místě v kódu, můžeme to zkrátit ještě více:

AddHandler Button1.Click, Sub(sender As Object, e As EventArgs) MsgBox("...")

Já předtím ty sendery a ečka pojmenoval s číslenými indexy, protože jsem ty inline metody deklaroval v těle procedury jejíž parametry už se jmenovali sender a e a docházelo tedy ke kolizi jmen více proměnných ve stejné naming scope.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback