PictureBox random Bildausgabe in Schleife

  • VB.NET
  • .NET 5–6

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    PictureBox random Bildausgabe in Schleife

    Hallo zusammen,
    ich bin grade dabei eine reihe von Bildern in einer PictureBox ausgeben zu lassen.
    Nun möchte ich, dass die Picturebox das Bild nach jedem "i" anzeigt, ist das möglich?

    Vielen Dank schon mal für eure Mühe...

    VB.NET-Quellcode

    1. Sub
    2. For i= 0 To 10
    3. Dim BildNr As Integer = rn.Next(0, 5) 'rn.next(untergrenze, obergrenze +1)
    4. Select Case BildNr
    5. Case 0
    6. PictureBox.Image = My.Resources.Resource1.Image_1
    7. Case 1
    8. PictureBox.Image = My.Resources.Resource1.Image_2
    9. Case 2
    10. PictureBox.Image = My.Resources.Resource1.Image_3
    11. Case 3
    12. PictureBox.Image = My.Resources.Resource1.Image_4
    13. Case 5
    14. PictureBox.Image = My.Resources.Resource1.Image_5 'usw ...
    15. End Select
    16. Next i
    Willkommen im Forum.
    Kleiner Logikfehler in Zeile#14. Zähl nochmal durch ;)
    Deinen Code könnte man durch eine Zeile so abändern, dass das "gewünschte" Ergebnis auftritt. Das Problem ist nur, dass Du nix davon hast, da dann die Bilder in Millisekunden "sichtbar" durchwechseln. Daher: In welchen Zeitabständen soll der Wechsel stattfinden? Oder nur bei bestimmten Ereignissen/Useraktionen?
    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.
    @FHo Willkommen im Forum. :thumbup:
    Kurze Antwort: Ja.
    Lange Antwort:
    Beschreibe das Problem so, dass Du und wir dasselbe darunter verstehen.
    Wenn Du die Bilder in einer Timer-Tick-Prozedur wechselst, kannst Du sie auch alle einzeln sehen.
    Ansonsten erfolgt kein Refresh der Anzeige.
    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!
    ja entschuldige ;)
    also ich möchte eine bilder Slide-Show erstellen. die Bilder sollenl schnell eingeblendet werden und wenn er 10X durch ist, soll das Zufallsbild stehen bleiben :o)


    VB.NET-Quellcode

    1. '
    2. Dim BildNr0 As Integer = rn.Next(0, 4) 'rn.next(untergrenze, obergrenze +1)
    3. Select Case BildNr0
    4. Case 0
    5. PB_ROL1.Image = My.Resources.Resource1.Image_1
    6. Case 1
    7. PB_ROL1.Image = My.Resources.Resource1.Image_2
    8. Case 2
    9. PB_ROL1.Image = My.Resources.Resource1.Image_3
    10. Case 3
    11. PB_ROL1.Image = My.Resources.Resource1.Image_4
    12. Case 4
    13. PB_ROL1.Image = My.Resources.Resource1.Image_5
    14. End Select
    15. 'Kontroll Label

    FHo schrieb:

    die Bilder sollenl schnell eingeblendet werden
    Wenn wenige Millisekunden ok sind, also schneller als Du das sehen kannst, dann bist Du fast am Ziel. 8|

    VaporiZed schrieb:

    In welchen Zeitabständen soll der Wechsel stattfinden? Oder nur bei bestimmten Ereignissen/Useraktionen?


    btw: Der Titel heißt PictureBox rdn Bildausgabe in Schleife. Ist rdn ein Schreibfehler oder was soll das bedeuten?
    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.
    ok nochmal von Vorne :)
    ich bin blutiger Anfänger... tut mir leid ..
    ich möchte eine Reihe von Bildern wie bei einem Geldspielautomaten von schnell bis langsam laufen lassen und ein Zufallsbild soll dann stehen bleiben.

    das rnd war als Random gemeint .. sorry ich gewöhne mich schon an die richtige Syntax :)

    Lieben Gruß
    Frank

    FHo schrieb:

    schnell bis langsam
    Oh, das wird schon etwas anspruchsvoller. Solange es nur um ein Bild geht, kannst Du das tatsächlich mit einem Timer machen, bei dem Du dann in Abhängigkeit von i das Timerintervall verlängerst. Das klappt dann natürlich nicht mit einer For-Schleife, sondern Du müsst dann eben Dim i As Integer außerhalb der Sub schreiben. Im Timer_Tick-EventHandler musst Du dann eben Deinen bisherigen PictureBox-Image-Zuweisungscode packen und dann eben noch wie geschrieben das Timer-Intervall verändern, damit der Timer immer langsamer läuft. Dann natürlich noch i immer um 1 erhöhen. Und wenn i eben 10 ist, dann den Timer anhalten und i wieder auf 0 setzen. Nun hast Du meines Erachtens, um das in Code zu gießen.
    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.
    ich würde das mit Async machen, dabei muss man nicht die For-Schleife auflösen in einen Timer-Gesteuerten Automaten.

    Als erstes bräuchten wir dafür eine Sub - also eine richtige - nicht sowas komisches wie in post#1.
    In diese Sub kann man was einbauen, dass die Schleife einstellbar verlangsamt.

    Aber achtung!
    Ist ein ganz anderer Ansatz als der von Vaporized, du musst entweder oder machen, nicht beides vermischen.
    Nix async.
    @FHo Zieh Dir nen Timer auf die Form, gib ihm als .Interval Deine Verweildauer und zeige in jedem Tick das nächste Bild.
    Sind die Bilder alle, fang wieder bei 0 an.
    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!
    Danke Euch, ich hab es jetzt so gelöst ..

    VB.NET-Quellcode

    1. Public Sub TI_1_Tick(sender As Object, e As EventArgs) Handles TI_1.Tick
    2. TI_1.Interval = 200
    3. TI3 = TI3 + 10
    4. TI2 = TI2 + TI3
    5. TI100 = TI100 - TI2
    6. If TI100 <= 0 Then TI_1.Stop()
    7. '####################################################################################################################
    8. 'Rolle 1 oben links
    9. BildNr0 = rn.Next(1, 5)
    10. Select Case BildNr0
    11. Case 1
    12. PB_ROL1.Image = My.Resources.Resource1.Image_1
    13. Case 2
    14. PB_ROL1.Image = My.Resources.Resource1.Image_2
    15. Case 3
    16. PB_ROL1.Image = My.Resources.Resource1.Image_3
    17. Case 4
    18. PB_ROL1.Image = My.Resources.Resource1.Image_4
    19. Case 5
    20. PB_ROL1.Image = My.Resources.Resource1.Image_5
    21. End Select


    Uiuiui. Kleiner Tipp: Arbeite an der Benennung Deiner Codebestandteile. TI? TI3? TI2? TI100? BildNr0? What?
    Bei rn.Next(1, 5) solltest Du wissen, dass die Obergrenze EXklusive ist, also NIEMALS erreicht wird. Damit wird Case 5 niemals erreicht. Aber das hattest Du Dir ja schon selbst geschrieben, und zwar als Kommentar.
    Jetzt kann Deinem Code gar nicht entnommen werden, ob der Timer überhaupt langsamer tickt. Schließlich änderst Du nirgends das Timer-Intervall.

    ##########

    VB.NET-Quellcode

    1. Private ReadOnly Images As New List(Of Bitmap) From {My.Resources.Bild1, My.Resources.Bild2, My.Resources.Bild3, My.Resources.Bild4, My.Resources.Bild5}
    2. Private CounterForFirstDrum As Integer = 0
    3. Private ReadOnly Random As New Random
    4. Private Sub TmrRotateFirstPictureDrum_Tick(sender As Object, e As EventArgs) Handles TmrRotateFirstPictureDrum.Tick
    5. If CounterForFirstDrum = 10 Then
    6. TmrRotateFirstPictureDrum.Stop()
    7. CounterForFirstDrum = 0
    8. Return
    9. End If
    10. TmrRotateFirstPictureDrum.Interval += 50
    11. Dim CurrentImageIndex = Random.Next(0, 5)
    12. PictureBox1.Image = Images(CurrentImageIndex)
    13. CounterForFirstDrum += 1
    14. End Sub
    15. Private Sub BtnRotateFirstPictureDrum_Click(sender As Object, e As EventArgs) Handles BtnRotateFirstPictureDrum.Click
    16. TmrRotateFirstPictureDrum.Interval = 50
    17. TmrRotateFirstPictureDrum.Start()
    18. End Sub


    ABER: Ein echter Spielautomat zeigt ja pro Walze keine Zufallsbilder. Die Reihenfolge steht ja fest. Nur das Endbild ist Zufall.
    Und: Mein Code wird dann nicht mehr sinnvoll erweiterungsfähig, sobald eine weitere oder gar mehrere Walzen hinzukommen. Da ist dann schon wieder Datenmodellierung angesagt.
    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.

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

    @FHo Wenn Du das Intervall nicht ändern willst, setze es, bevor Du den Timer startest.
    Was für eine Zahlenakrobatik betreibst Du da?
    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!
    wie gesagt ich bin blutiger Anfänger :)
    Danke für eure Antworten ..

    VB.NET-Quellcode

    1. TI_1.Interval = 200

    Die TIx Variablen sind um die Rollen langsamer zu machen .. so war jedenfalls der Plan :)

    Danke, dass Du dir so viel Mühe gemacht hast VaporiZed ;)

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

    FHo schrieb:

    Die TIx Variablen sind um die Rollen langsamer zu machen
    Mach Dir eine geeignete Formel und beende dann das Drehen, z.B.:

    VB.NET-Quellcode

    1. TI_1.Interval = CInt(TI_1.Interval * 1.5) ' den Faktor 1.5 anpassen
    2. If TI_1.Interval >= 5000 Then TI_1.Stop() ' das Endintervall anpassen

    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!