Probleme mit übereinander liegenden Pictureboxen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von zauber777.

    Probleme mit übereinander liegenden Pictureboxen

    Hallo zusammen,

    ich hänge mal wieder bei etwas fest.
    ich möchte mir über eine "LED" in meinem Programm anzeigen lassen, ob eine IP-Adresse in meinem Heimnetz verfügbar ist oder nicht.

    Auf meiner Form habe ich ein Panel. Auf dem Panel habe ich 2 Pictureboxen genau übereinander liegen. In einer Picturebox habe ich ein Bild einer roten LED und in der anderen habe ich ein Bild einer grünen LED. Die Abfrage zu der IP lasse ich in einem Backgroundworker in einer Schleife laufen.
    Wenn ich das Programm starte, dann läuft die Abfrage auch super und es blendet die rote oder grüne Picturebox ein. Wenn ich aber dann das zu abfragende Netzwerkgerät vom LAN trenne, dann bekommt mein Programm das auch mit, aber es zeigt mir dann nicht die rote LED an, sondern es ist einfach so, als wenn es keine Picturebox gibt.
    Wenn die beiden Pictureboxen nicht übereinander liegen würden, dann funktioniert das ohne Probleme. Es soll aber so aussehen, als wechselt die LED die Farbe...

    Könnt ihr mir weiterhelfen?

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. Do Until BackgroundWorker1.CancellationPending
    3. Dim host1 As New Net.NetworkInformation.Ping
    4. Dim reply1 As PingReply = host1.Send("192.168.1.74")
    5. If reply1.Status = IPStatus.Success Then
    6. Red_PictureBox.Visible = False
    7. Red_PictureBox.Enabled = False
    8. Green_PictureBox.Enabled = True
    9. Green_PictureBox.Visible = True
    10. Green_PictureBox.BringToFront()
    11. Label1.Text = "erreichbar" 'zu testzwecken ob die Abfrage auch wirklich läuft
    12. Else
    13. Green_PictureBox.Visible = False
    14. Green_PictureBox.Enabled = False
    15. Red_PictureBox.Enabled = True
    16. Red_PictureBox.Visible = True
    17. Red_PictureBox.BringToFront()
    18. Label1.Text = "NICHT erreichbar" 'zu testzwecken ob die Abfrage auch wirklich läuft
    19. End If
    20. Loop
    21. End Sub
    Warum 2 PictureBoxen? Eine reicht doch vollkommen. Einfach das Bild wechseln, sobald sich der Zustand eines Rechners ändert....
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    ...wodurch man das Ganze wahrscheinlich auf das hier eindampfen könnte:

    VB.NET-Quellcode

    1. Dim reply1 = host1.Send("192.168.1.74")
    2. Dim IsOnline = reply1.Status = IPStatus.Success
    3. PictureBox.Image = If(IsOnline, GreenLED, RedLED)
    4. Label1.Text = If(IsOnline, "erreichbar", "NICHT erreichbar")


    btw: BackgroundWorker? Geht doch bestimmt auch (irgendwie/eleganter) mit Async/Await, oder?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @zauber777 Pack das Pingen in einen ca. 2-Sekunden-Timer, da sollte es freundlicher laufen.
    Außerdem solltest Du bei Erfolg mit dem Pingen aufhören.
    ====
    Setze initial das Nicht-Verbunden-Bild.
    Pinge in einem sinnvollen Takt, lass die Bilder in Ruhe.
    Bei Erfolg stell das Pingen ein und
    setze das Verbunden-Bild.
    Feddich.
    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!
    @zauber777 Dann nimm trotzdem einen gemütlichen 1...2-Sekunden-Timer (.Intervall ausprobieren) und keinen BackgroundWorker, der hier eine exzessive Dauerbelastung zu produzieren scheint.
    Merk Dir den aktuellen Zustand und stell nur eine Änderung zum aktuellen Zustand dar.
    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!
    @zauber777 Werde mal konkreter.
    Wenn wir genauer wissen was du vor hast wird es wahrscheinlich eine Ressourcen schonendere Lösung geben.
    Was ist das für ein Gerät und wie kommunizierst du damit?
    ich habe zum Beispiel aktuell einen Drucker, welcher über WLAN angebunden ist in mein Netzwerk. Dieser macht Probleme mit der WLAN Verbindung. Um genaueres heraus zu finden, lasse ich dauer pings laufen um den Fehler zu finden usw.
    da ich aber an dem Drucker stehe und nicht am Rechner und auch nicht immer zu hin und her rennen möchte und ich auch noch zusätzlich was beim programmieren lernen möchte, hatte ich mir dieses Programm einfallen lassen.

    Natürlich bin ich für jede Ressourcen schonendere Lösung offen :)

    Mein Code sieht aktuell wie folgt aus :

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Imports System.Net.NetworkInformation
    3. Public Class VB_Paradise_TestForm
    4. Private Sub VB_Paradise_TestForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Timer1.Start()
    6. End Sub
    7. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    8. Timer1.Enabled = False
    9. BackgroundWorker1.RunWorkerAsync()
    10. End Sub
    11. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    12. Dim host1 As New Net.NetworkInformation.Ping
    13. Dim reply1 = host1.Send("192.168.1.74")
    14. Dim IsOnline = reply1.Status = IPStatus.Success
    15. PictureBox1.Image = If(IsOnline, Image.FromFile("LedGreen.ico"), Image.FromFile("LedRed.ico"))
    16. Label1.Text = If(IsOnline, "erreichbar", "NICHT erreichbar")
    17. End Sub
    18. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    19. Timer1.Enabled = True
    20. End Sub
    21. End Class


    Den Timer habe ich auf 2 Sekunden eingestellt. Ich lasse es alles im Backgroundworker laufen, damit mein Programm nicht "einschläft", da später mal noch einiges mehr im Programm dabei sein soll.

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

    @zauber777 Nutze nur den Timer.
    Schmeiß den BackgroundWorker raus.

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. Timer1.Enabled = False
    3. Dim host1 As New Net.NetworkInformation.Ping
    4. Dim reply1 = host1.Send("192.168.1.74")
    5. Dim IsOnline = reply1.Status = IPStatus.Success
    6. PictureBox1.Image = If(IsOnline, Image.FromFile("LedGreen.ico"), Image.FromFile("LedRed.ico"))
    7. Label1.Text = If(IsOnline, "erreichbar", "NICHT erreichbar")
    8. Timer1.Enabled = True
    9. End Sub
    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!
    @RoadFromGermany danke für den Hinweis.

    Dann habe ich noch eine abschließende Frage zu dem Thema. Bei der aktuellen Nutzung der Picturebox, liegen beide Icons/Bilder im Programmpfad.

    VB.NET-Quellcode

    1. PictureBox1.Image = If(IsOnline, Image.FromFile("LedGreen.ico"), Image.FromFile("LedRed.ico"))


    Ich habe die beiden Icons aber auch in meinen Ressourcen liegen und würde gerne diese verwenden.
    Jedoch werde ich angemeckert dass es so nicht funktioniert (der Wert von Icon kann nicht in Image konvertiert werden). Wo liegt denn mein Denkfehler?!?

    VB.NET-Quellcode

    1. PictureBox1.Image = If(IsOnline, My.Resources.LedGreen, My.Resources.LedRed)

    zauber777 schrieb:

    @RoadFromGermany
    Nix Straße. ;)
    Du musst aus dem Icon ein Image machen:

    VB.NET-Quellcode

    1. PictureBox1.Image = My.Resources.LedRed.ToBitmap()
    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!