Function wird nicht ausgeführt Wo liegt mein Fehler ?

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von xtts02.

    Function wird nicht ausgeführt Wo liegt mein Fehler ?

    Hallo Community,
    ich bin hier neu auf dem Board und neu was VB anbelangt.
    Seit gestern probiere ich dieses kleine Mini-Programm dass eigentlich nichts machen soll ausser bei einer bestehenden Internetverbindung eine PictureBox in grün anzuzeigen oder bei keiner Verbindung eine PictureBox in rot.


    Dazu habe ich 2 Boxen erstellt: 1 grün + 1 rot und beide zu Programmstart ausblenden lassen.


    Die Verbindung soll mit dem Programmstart erfolgen. Irgendwie habe ich das Gefühl dass die function nicht ausgeführt wird, aber warum ?

    Kann mir jemand bei diesem mini Problem helfen ?


    Hier mein Quellcode:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Function TestInternetConnection()
    3. Try
    4. My.Computer.Network.Ping("8.8.8.8")
    5. Return 1
    6. Catch ex As Exception
    7. Return 0
    8. End Try
    9. End Function
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. End Sub
    12. Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
    13. If TestInternetConnection() = 1 Then
    14. PictureBox1.Visible = True
    15. Else
    16. PictureBox1.Visible = False
    17. End If
    18. End Sub
    19. Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click
    20. If TestInternetConnection() = 0 Then
    21. PictureBox2.Visible = True
    22. Else
    23. PictureBox2.Visible = False
    24. End If
    25. End Sub
    26. End Class




    gruß

    Spakolowe
    Hey,

    mach OPTION STRICT ON und nutze keine Funktionen aus dem My-NameSpace, abgesehen von My.Settings.

    Die Klasse Ping bietet zahlreiche Funktionen.

    Abgesehen davon ist My.Compter.Network.Ping() ohnehin eine Funktion, die True oder False zurück gibt. Auch solltest Du vorsichtig mit Try-Catch sein.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SpaceyX“ ()

    Spakolowe schrieb:

    Irgendwie habe ich das Gefühl dass die function nicht ausgeführt wird

    So irgendwie-Geschichten sind inne Programmierung irgendwie ungünstig ;)

    Hier ist auch (Haltepunkt) eine Handreiche dabei, wie du bei sowas sicher gehen kannst: Visual-Studio richtig nutzen
    Hab ma was gebastelt.

    Due funktion ist eigentlich nicht nötig aber ich hab sie gemacht da du eine wolltest.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. If testConnection() Then
    3. PictureBox1.Visible = True
    4. Else
    5. PictureBox1.Visible = False
    6. End If
    7. End Sub
    8. Function testConnection() As Boolean
    9. If My.Computer.Network.Ping("www.google.ch") Then
    10. Return True
    11. Else
    12. Return False
    13. End If
    14. End Function
    oder nur mit der my-namespace:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. If My.Computer.Network.Ping("www.google.de") = True then
    3. PictureBox1.Visible = True
    4. PictureBox2.Visible = False
    5. Else
    6. PictureBox1.Visible = False
    7. PictureBox2.Visible = True
    8. End If
    9. End Sub
    @All \ ErfinderDesRades:
    Bitte nicht in die Form_Load, sondern in eine Button_Click.
    Wenn in der Function eine Exception kommt, so wird die Form_Load ggf. nicht weiter ausgeführt, sondern abgebrochen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habs jetzt mit eurer Hilfe hinbekommen =)

    Dieses Try-Catch brauch ich, da bei abgeschalteter Internetverbindung das Programm erst garnicht ausgeführt wird. ?!?!

    @Affrop

    Deine Variante habe ich auch probiert allerdings hatte ich da wieder das Problem mit meinem Programm dass es nicht ausgeführt wird bei deaktiviert Internetverbindung

    @Lingo
    Vielen dank !

    @Rest
    Vielen Dank für eure supper schnellen Antworten


    Mein Quellcode schaut jetzt so aus

    VB.NET-Quellcode

    1. Public Class Form1
    2. Function TestInternetConnection()
    3. Try
    4. My.Computer.Network.Ping("8.8.8.8")
    5. Return True
    6. Catch ex As Exception
    7. Return False
    8. End Try
    9. End Function
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. If TestInternetConnection() = True Then
    12. PictureBox1.Visible = True
    13. PictureBox2.Visible = False
    14. Else
    15. PictureBox1.Visible = False
    16. PictureBox2.Visible = True
    17. End If
    18. End Sub
    19. Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
    20. End Sub
    21. Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click
    22. End Sub
    23. End Class
    ist die bestehende internetverbindung bedingung dafür, dass das programm gestartet wird oder wie?
    in meiner variante sollte die form trotzdem geladen und angezeigt werden, auch wenn keine internetverbindung besteht.
    wenn du aber willst, dass das programm nicht gestartet wird, wenn keine internetverbindung besteht füge einfach me.close() hinzu.

    sollte dein problem weiterhin bestehen, füge den code nicht im Form_Load sondern im Form_Shown-event ein. dann wird in jedem fall erstmal die form geladen und angezeigt bevor irgendwas andres passiert.
    Das Programm braucht nur bedingt eine Internetverbindung.

    Ziel ist es, einen Art Launcher zu erstellen.
    Damit soll der Benutzer ein Spiel starten können, einen bestimmten Ordner löschen können, das spiel reparieren lassen können.
    Der Wichtigste Punkt ist es aber, dass man das Spiel über einen Download Button dann downloaden kann ( Deshalb die Internetverbindung). Als kleines "feature" habe ich mir gedacht, eine Image anzeigen zu lassen wenn die Verbindung steht ( natürlich könnte ich das auch komplett weg lassen).

    Da ich bis jetzt keine Ahnung von VB habe, wollte ich erstmal jede Funktion was das Programm tun soll einzeln programmieren und verstehen was ich da genau anstelle und warum das so ist.

    Grobe Basics verstehe ich ( habe vor Jahren Java und C gelernt ).
    @Spakeolowe

    Dein Code hat noch einige schönheitsfehler hab sie dir ausgebessert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Function TestInternetConnection() As Boolean
    3. If My.Computer.Network.Ping("8.8.8.8") Then ' Try Catch ist dazu da Fehler abzufangen
    4. Return True
    5. Else
    6. Return False
    7. End If
    8. End Function
    9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. If TestInternetConnection() Then 'Da die Funktion true oder false zurück gibt wird = true nicht mehr benötigt
    11. PictureBox1.Visible = True
    12. PictureBox2.Visible = False
    13. Else
    14. PictureBox1.Visible = False
    15. PictureBox2.Visible = True
    16. End If
    17. End Sub
    18. Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
    19. End Sub
    20. Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click
    21. End Sub
    22. End Class


    Try Catch benötigst du in deinem Codebeispiel nicht da wenn keine Internetverbindung besteht kein Fehler ist sondern ein Zustand.
    Deswegen das ganze mit einer if Abfrage.

    @affrop

    Application.exit

    Lingo schrieb:

    ' Try Catch ist dazu da Fehler abzufangen
    wird aber oft dazu verwendet, Fehler zu verschleiern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ Lingo: wenn Form1 nicht das Startformular ist, ansonsten würde es auch mit .Close() gehen, hast aber recht Application.Exit sieht auch einfach besser aus ;)

    @ Spakolowe: schiebe die funktion in das Form_Shown-event dann wird in jedem fall erstmal die form geladen. nutze stat ping den networkinterface

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. End Sub
    3. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    4. If Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable = True Then
    5. PictureBox1.Visible = True
    6. PictureBox2.Visible = False
    7. Else
    8. PictureBox1.Visible = False
    9. PictureBox2.Visible = True
    10. Exit Sub
    11. End If
    12. End Sub


    das geht aber nur, wenn deine einzige netzwerverbindung die direkte zum internet ist, wenn bspl. noch ein router dazwischen ist, gibt die funktion true zurück, obwohl du nicht im internet bist.
    für die internetverbindung kannste dann auch sowas hier machen:

    VB.NET-Quellcode

    1. Public Shared Function CheckForInternetConnection() As Boolean
    2. Try
    3. Using client = New Net.WebClient()
    4. Using stream = client.OpenRead("http://www.google.com")
    5. Return True
    6. End Using
    7. End Using
    8. Catch
    9. Return False
    10. End Try
    11. End Function

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „affrop“ ()

    @Lingo und Keybladmaster

    Ich hab das Bild unten eingefügt.


    @Affrop

    Mal ne Frage zu diesem Networkinterface:

    Was ist wenn die Verbindung local ( also im Lan ) geht aber nur die Verbindung ins Internet nicht funktioniert.

    Der Befehl sieht für mich aus , als würde er nur überprüfen ob eine Netzwerkverbindung aktiv ist, nicht aber eine Verbindung ins Internet



    :D War klar dass du dein Post überarbeitet hast in der Zeit wo ich meine Antwort verfasse :thumbsup:

    Somit sehe ich also den Ping Befehl in meinem Beispiel als bessere Variante.
    Bilder
    • Fehler.jpg

      240,68 kB, 1.431×807, 109 mal angesehen
    Es gibt einen absolut sicheren Weg, um festzustellen, ob Internet verfügbar ist oder nicht. Kein Try-Catch, kein WorkAround. Ein einfacher API-Aufruf genügt.

    VB.NET-Quellcode

    1. <DllImport("wininet.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    2. Private Shared Function InternetGetConnectedState(ByRef lpdwFlags As Int32, dwReserved As Int32) As Boolean
    3. End Function


    Kapseln kann man das Ganze in einer Klasse. Z. B. so:

    VB.NET-Quellcode

    1. Public Class InternetConnectionTest
    2. <DllImport("wininet.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    3. Private Shared Function InternetGetConnectedState(ByRef lpdwFlags As Int32, dwReserved As Int32) As Boolean
    4. End Function
    5. Public Shared Function TestConnection() As InternetConnectionTestResult
    6. Dim flags As Int32 = 0
    7. Dim result As Boolean = InternetGetConnectedState(flags, 0)
    8. Return New InternetConnectionTestResult(result, flags)
    9. End Function
    10. End Class
    11. Public Class InternetConnectionTestResult
    12. Private _internetAvailable As Boolean
    13. Private _connectedVIA As ConnectionStates
    14. Public ReadOnly Property InternetAvailable As Boolean
    15. Get
    16. Return _internetAvailable
    17. End Get
    18. End Property
    19. Public ReadOnly Property ConnectedVIA As ConnectionStates
    20. Get
    21. Return _connectedVIA
    22. End Get
    23. End Property
    24. Public Enum ConnectionStates
    25. Modem = &H1
    26. LAN = &H2
    27. Proxy = &H4
    28. RasInstalled = &H10
    29. Offline = &H20
    30. Configured = &H40
    31. End Enum
    32. Public Sub New(result As Boolean, flags As Int32)
    33. _internetAvailable = result
    34. 'Hier wurden die "nicht relevanten" Stati nicht berücksichtigt.
    35. Select Case True
    36. Case (flags And ConnectionStates.LAN) = ConnectionStates.LAN
    37. _connectedVIA = ConnectionStates.LAN
    38. Case (flags And ConnectionStates.Modem) = ConnectionStates.Modem
    39. _connectedVIA = ConnectionStates.Modem
    40. Case (flags And ConnectionStates.Proxy) = ConnectionStates.Proxy
    41. _connectedVIA = ConnectionStates.Proxy
    42. Case Else
    43. _connectedVIA = ConnectionStates.Offline
    44. End Select
    45. End Sub
    46. End Class


    Hier ein Beispiel für den Aufruf:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim result As InternetConnectionTestResult = InternetConnectionTest.TestConnection()
    4. PictureBox1.BackColor = If(result.InternetAvailable, Color.Green, Color.Red)
    5. Label1.Text = result.ConnectedVIA.ToString()
    6. End Sub
    7. End Class


    Gibt sogar zurück, auf welche Weise man verbunden ist. Die unwichtigen Stati habe ich nicht berücksichtigt.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SpaceyX“ ()