Mehrere Pictureboxen prüfen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Counterbug.

    Mehrere Pictureboxen prüfen

    Hallo zusammen,
    ich hoffe ich drücke mich nicht allzu dämlich aus und Ihr versteht mein Anliegen. ;)

    Ich habe in einer Form 8 PictureBoxen.
    Picturebox 1 bis 3 spielen keine Rolle.
    4 bis 8 sind relevant.
    Je nach Bedingung werden diese mit einem Bild gefüllt (my.resources.red_light oder my.resources.green_light)
    Wie bekomme ich es nun hin, das z.B. eine msgbox erscheint wenn ALLE (picbox 1 bis 8) mit dem green_light ausgestattet sind?

    Ich bin blutiger VB-Anfänger und quäle mich schon den ganzen Abend durch's Netz auf der Suche nach Lösungen - Leider vergebens. Hoffe hier Hilfe zu bekommen.
    Danke.

    Ach ja: VB 2010 Express nutze ich.
    Kann dir leider nur ne C#-Lösung geben.
    Kannste aber einfach zu VB.NET umschreiben.

    C#-Quellcode

    1. bool AllLightsGreen () {
    2. foreach (Control ctrl in Controls) {
    3. var pic = ctrl as PictureBox;
    4. if (pic == null)
    5. continue;
    6. if (pic.Image != My.Resources.Green_Light)
    7. return false;
    8. }
    9. return true;
    10. }


    Diese Methode funktioniert allerdings nur, wenn die 8 Pictureboxen die einzigen sind.
    Wenn noch andere Pictureboxen auf der Form existieren, musst du sie manuell überprüfen.

    Edit: Habe mal versucht, es nach VB.NET zu übersetzen.

    VB.NET-Quellcode

    1. Function AllLightsGreen As Boolean
    2. For Each ctrl As Control In Me.Controls
    3. Dim pic As PictureBox = TryCast (ctrl, PictureBox)
    4. If pic Is Nothing Then
    5. Next ctrl
    6. End If
    7. If pic.Image IsNot My.Resources.Green_Light Then
    8. Return False
    9. End If
    10. Next ctrl
    11. Return True
    12. End Function

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SplittyDev“ ()

    @Hannebambel Willkommen im Forum.
    Du musst Dir neben den Bildern merken, welches Bild angezeigt wird. Dazu eignet sich ein Enum, das dieselben Bezeichnungen wie die Bilder haben kann.
    Mach Dir eine geeignete Bild-Setz-Prozedur, bei der Du den index der PictureBox und das Enum des Bildes übergibst, beim setzen wirsd dann gleich alles geprüft, was geprüft werden muss.
    Feddich.
    @SplittyDev Du solltest Dir noch mal genau überlegen, was Du da verzapft hast. ;)
    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!
    @RodFromGermany war gerade erst aufgestanden als ich das geschrieben habe, kann aber auf die schnelle nix falsches mit meinem Code erkennen.
    Ich gebe false zurück falls eine PictureBox der Form nicht das Green_Light bild hat und true andernfalls.
    Sieht für mich richtig aus. Falls ich da nen groben Logikfehler drin habe, hab' ich natürlich nichts dagegen, dass du mich korrigierst :)
    Ach das. Sollte eigentlich einfach zu beheben sein.
    @RodFromGermany, hast natürlich recht, ich hätte das vorher testen sollen.
    Das Prinzip funktioniert aber immernoch.
    Im Endeffekt lässt sich eine Bitmap zu nem Image casten und das ganze funktioniert wieder.

    SplittyDev schrieb:

    zu nem Image casten
    Du hast es leider nicht verstanden. ;(
    Hier würden Instanzen, nicht aber Werte, miteinander verglichen.

    VB.NET-Quellcode

    1. If Me.PictureBox1.Image IsNot My.Resources.Option2 Then
    wäre zwar syntaktisch richtig, logisch aber bedenklich, falls die Bilder gecloned werden.
    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!

    RodFromGermany schrieb:

    Du hast es leider nicht verstanden. ;(

    Oh, tut mir leid. Ich komme von nem C# Hintergrund und hab das ausem Kopf nach VB.NET übersetzt. Dachte der Compiler meckert aufgrund des Typs.
    In C# ist das is Schüsselwort was ganz anderes, dachte daher dass <> richtig sei.
    Vielen Dank für die Aufklärung, ich werde meinen Post oben anpassen.

    Edit: Mit dem Logikproblem hast du theoretisch recht.
    Ich gehe aber nicht davon aus dass er noch irgendwas anderes mit dem Bild macht als es direkt der PictureBox zuzuweisen.
    Und falls doch, wird er sich bestimmt beschweren, dann lässt sich immernoch eine andere Lösung suchen :)
    Ich hielt es trotz der Risiken für eine bessere Idee durch die Controls zu iterieren, als 8 If-Statements zu schreiben.
    Eure Denkweise ist falsch rum.
    Das Messagebox-Problem hat nix mit Pictureboxen zu tun, bzw. besteht darin, im Kopf(!) Daten und Oberfläche zu trennen.
    Es gibt 8 Zustände ja oder nein, also 8 Booleans. Und wenn alle 8 auf True stehen soll die Messagebox kommen - ist doch eine Kleinigkeit:

    VB.NET-Quellcode

    1. [Imports System.Linq]
    2. [...Private _GreenLights(7) As Boolean]
    3. '...
    4. If _GreenLights.All() then Messagebox.Show("green")

    Parallel dazu werden Bilder in 8 Pictureboxen geladen, rote oder grüne

    VB.NET-Quellcode

    1. [private _Pictureboxes(7) As Picturebox]
    2. '...
    3. for I=0 To _GreenLights.Length - 1
    4. _Picturesboxes(i).Image = If(_Greenlights(i), My.Resources.Green, My.Resources.Red)
    5. Next
    (achtung! - ungetesteter pseudoCode aussem Kopf)

    ErfinderDesRades schrieb:

    Eure Denkweise
    Gugst Du Post #3.
    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!

    ErfinderDesRades schrieb:

    Eure Denkweise ist falsch rum.
    Das Messagebox-Problem hat nix mit Pictureboxen zu tun, bzw. besteht darin, im Kopf(!) Daten und Oberfläche zu trennen.

    Ich hab' das Problem bisschen anders Verstanden, kann natürlich auch gut sein dass er es so meint.
    Jedenfalls hat er jetzt genug Lösungen um es so oder so zu machen
    Mal ne Frage am Rande.

    @SplittyDev hat das ja so gemacht:

    VB.NET-Quellcode

    1. For Each ctrl As Control In Me.Controls
    2. Dim pic As PictureBox = TryCast(ctrl, PictureBox)
    3. [...]
    4. Next

    Ich mache das immer so:

    VB.NET-Quellcode

    1. For Each pic As PictureBox In Me.Controls.OfType(Of PictureBox)
    2. [...]
    3. Next

    Gibt es da einen Unterschied?

    Grüße
    Väinämö

    Vainamo V schrieb:

    Unterschied
    Die 1. Variante knallt, wenn da ein Button vorbeikommt und dies nicht explizit abgefangen wird.
    In der 2. Variante kommt kein Button vorbei. ;)
    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!

    Vainamo V schrieb:

    weniger Problemanfällig
    wenn Du nur über eine Sorte Controls iterieren willst.
    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!
    Ist aber grundsätzlich scheißegal, da TryCast. Splitty prüft das ja nachher. OfType ist einfacher, aber ich kann mir nicht vorstellen dass es sonst einen Unterschied macht (mal abgesehen von Performance, das wird in dem Fall aber wohl keine Rolle spielen).
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    ähm - SplittyDevs Code wird garnet funzen, weil Bilder, die man vonne Resourcen abruft werden immer neu generiert. Die Vergleiche werden also niemals zutreffen.
    Und sein Vb ist syntaxwidrig.
    Also der TE sollte sich besser nicht auf diesen Ansatz konzentrieren, sondern wie gesagt post#9/#3: Logic bedenken, nicht Pictureboxen.
    @ErfinderDesRades Es ging mir hier ausschließlich um das Iterieren über bestimmte Controls. Von VB-Syntax sowie Abgleich mit Resourcen habe ich keine Ahnung, da muss ich passen. Aber interessant zu wissen.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    @ErfinderDesRades Vielen Dank für deine Antwort. Wusste nicht, dass das Bild aus der Ressource neu generiert wird.
    Jetzt wo ich darüber nachdenke macht das auch Sinn, is ja schließlich ein Ressourcen-Stream.

    Es gibt btw noch ne andere Möglichkeit als eine Boolean-Liste anzulegen, auf die ich aber auch erst jetzt gekommen bin:
    Jede PictureBox hat eine Tag-Property.
    Man könnte also bei jeder PictureBox einfach den Tag auf True oder False setzen und das so lösen.

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

    @SplittyDev Nein, wie kommst du darauf? GreenLights hält Bools, das Image wird einfach nur neu gesetzt.
    Edit: Nach Edit seitens Splitty kontextlos. Siehe nächster Post.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

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