Picture Box über eine Schleife Zeitverzögert bewegen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von LeoStevens.

    Picture Box über eine Schleife Zeitverzögert bewegen

    Hallo,
    ich möchte mit VB2010 ein Bild (PictureBox) auf dem Formular von unten nach Oben bewegen (von 600 auf 0).
    Wenn ich das über einen CommandButton mache, funktioniert das auch wie erwartet.
    Wenn ich aber versuche das Bild über eine Schleife zu steuern, ist es direkt nach dem Start am Ziel angekommen (klar, das ganze ist halt zu schnell). Jetzt habe ich versucht, das ganze über eine Verzögerung in der Schleife etwas langsamer zu gestalten.
    Das klappt aber leider nicht. Der Versuch über einen Timer ist fehlgeschlagen; der wurde ignoriert. Dann habe ich es noch über System.Threading.Thread.Sleep
    versucht.
    Dabei wird aber das Bild nur von unten Zeile für Zeile "aufgefressen", um kurz danach am Ziel aufzutauchen. Das Bild bewegt sich also nicht wie gewünscht.
    System.Threading.Thread.Sleep ist aber auch nicht die beste Wahl, da während der "Pause" andere CommandButtons nicht mehr nutzbar sind (sind noch nicht eingebaut).

    Hat jemand eine Idee, wie man das elegant lösen kann?

    Mein bisheriger Versuch:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Threading
    3. Public Class Form1
    4. Public i As Integer
    5. Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    6. BildAuto.Location = New Point(BildAuto.Location.X, 600)
    7. Timer1.Interval = 2000
    8. End Sub
    9. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles cmdStart.Click
    10. Call moveIt()
    11. End Sub
    12. Private Sub moveIt()
    13. For i = 600 To 0 Step -1
    14. BildAuto.Location = New Point(BildAuto.Location.X, i) 'BildAuto.Location = New Point(BildAuto.Location.X, BildAuto.Location.Y + i)
    15. TxtWert.Text = CStr(BildAuto.Location.Y)
    16. txtTimer.Text = CStr(Timer1.Interval)
    17. 'Timer1.Start()
    18. System.Threading.Thread.Sleep(10)
    19. Next (i)
    20. End Sub
    21. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    22. ' Timer1.Stop()
    23. End Sub
    24. Private Sub cmdManuell_Click(sender As System.Object, e As System.EventArgs) Handles cmdManuell.Click
    25. BildAuto.Location = New Point(BildAuto.Location.X, BildAuto.Location.Y - 4)
    26. TxtWert.Text = CStr(BildAuto.Location.Y)
    27. End Sub
    28. Private Sub cmdReset_Click(sender As System.Object, e As System.EventArgs) Handles cmdReset.Click
    29. BildAuto.Location = New Point(BildAuto.Location.X, 600)
    30. TxtWert.Text = CStr(BildAuto.Location.Y)
    31. End Sub
    32. End Class

    @LeoStevens Willkommen im Forum. :thumbup:
    Schmeiß das Threading-Zeugs raus!
    Teste dies: Form mit PictureBox und CheckBox.
    Den Begrenzungetest musst Du noch einbauen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    3. Timer1.Enabled = CheckBox1.Checked
    4. End Sub
    5. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    6. Dim loc = PictureBox1.Location
    7. loc.Y += 2
    8. PictureBox1.Location = loc
    9. End Sub
    10. End Class
    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!
    Vielen Dank. Das funktioniert perfekt.

    Zwei kleine Fragen hätte ich noch. Bedeutet das "+=" das gleiche wie
    Picturebox.Location.Y = Picturebox.Location.Y +1 ?

    Kann man diese Variante auch als Zeitverzögerung nutzen, ohne ein Bild zu bewegen?

    Also quasi als zusätzliche Warteschleife...
    Dann könnte ich das Bild in einer Endlosschleife die Strecke "fahren" lassen, und am Endpunkt gibt es eine kleine Pause, bevor es am Startpunkt wieder losfährt.

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

    LeoStevens schrieb:

    Bedeutet das "+=" das gleiche wie
    Ja.
    Zeitverzögerung wahrscheinlich nein.
    Dazu müsstest Du mal sehr präzise und vollständig formulieren, was Dein Plan ist.
    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!
    Ok, danke.

    Naja...momentan habe ich es so, dass das Auto (PictureBox) in einer Endlosschleife von unten nach oben über das Formular fährt. Ich lasse es am oberen Bildschirmrand verschwinden, und wenn es bei -100 ist, taucht es unten wieder auf und das Ganze beginnt von vorne.

    Jetzt würde ich gerne noch eine kleine Pause einbauen. Das Auto soll also erst wieder nach 30 Sekunden "losfahren".
    @LeoStevens Dann mach Dir ein Flag, dass Dein "Auto" wartet (Boolean, True - fährt, False - steht).
    Wenn das Auto steht, zähle im Timer_Tick-Event die erforderlichen Ticks ohne zu fahren. Sind die Warte-Ticks vorbei, invertiere das Flag.
    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!

    LeoStevens schrieb:

    Also quasi als zusätzliche Warteschleife...
    Dann könnte ich das Bild in einer Endlosschleife...

    Deine Begriffe sind falsch, das hatte vmtl. großen Anteil, dass du das Problem nicht selbst lösen konntest.
    Die jetzige Lösung hat mit Schleifen nix zu tun.
    Sondern sie besteht genau in der Alternative zur Schleife, nämlich eventbasiertes Vorrücken.
    Das ist wichtig, dass du dir diese Begriffe klärst, und die Parallelen, aber auch die Unterschiede der beiden Ansätze (Schleife versus TimerTick-Event) klar machst.
    Sonst hätteste hierraus nicht viel gelernt.

    Hihi - Deine Frage ist übrigens genau der Aufhänger, an dem ich dieses Tut aufgehängt hab: Alles über Events