New Stack(Of Point) -"Fehler"!

  • VB.NET

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

    New Stack(Of Point) -"Fehler"!

    Hallo liebes Forum...

    Und zwar hab ich versucht, das Rectangle Nach für Nach an Positionen zu "animieren" ...

    Also,

    Quellcode

    1. 1|2|3

    , diese Positionen sollen durchlaufen werden...

    Nur ist es so, dass das Rectangle direkt auf eine bestimmte(immer dieselbe) Position springt...

    Hier der Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim Point_ As New Stack(Of Point)
    4. Dim Rec_ As Rectangle
    5. Dim PosX_ As Integer
    6. Dim PosY_ As Integer
    7. Private Sub Loop_()
    8. Do While True
    9. Application.DoEvents()
    10. For Each Location_ As Point In Point_
    11. PosX_ = Location_.X
    12. PosY_ = Location_.Y
    13. Point_.Clear() 'Um Komplikationen zu vermeiden, wird die Liste gelöscht...
    14. 'Und gleichdarauf etwas addiert...
    15. Next
    16. Loop
    17. End Sub
    18. Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    19. Point_.Push(New Point(e.Location.X, e.Location.Y))
    20. Me.Invalidate()
    21. End Sub
    22. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    23. DoubleBuffered = True
    24. Rec_ = New Rectangle(x:=PosX_, y:=PosY_, Width:=20, Height:=20)
    25. e.Graphics.FillRectangle(Brushes.RosyBrown, Rec_)
    26. End Sub
    27. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    28. Me.Focus()
    29. Me.Show()
    30. Loop_()
    31. End Sub
    32. End Class


    Hoffe auf Antworten...

    Mfg.eniking1998

    enIking1998 schrieb:

    VB.NET-Quellcode

    1. Loop_()
    Was soll dieser Aufruf in der Form_Load?
    Was soll hinterher in den Variablen stehen?
    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!
    @enIking1998: Fein.

    RodFromGermany schrieb:

    Was soll dieser Aufruf in der Form_Load?
    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!
    @enIking1998: Beleidigung entfernt bezüglich der Unfähigkeit des TEs entfernt.
    Das ist eine Endlosschleife :!:
    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!

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

    Hi,
    EDIT: HAHAHA klappt:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim Point_ As New Stack(Of Point)
    4. Dim Rec_ As Rectangle
    5. Dim Pos_ As Point
    6. Private Sub Loop_()
    7. For Each Location_ As Point In Point_
    8. Pos_.X = Location_.X
    9. Pos_.Y = Location_.Y
    10. Me.Refresh()
    11. Next
    12. End Sub
    13. Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    14. Point_.Push(New Point(e.Location.X, e.Location.Y))
    15. Loop_()
    16. Point_.Clear()
    17. End Sub
    18. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    19. DoubleBuffered = True
    20. Rec_ = New Rectangle(x:=Pos_.X, y:=Pos_.Y, Width:=20, Height:=20)
    21. e.Graphics.FillRectangle(Brushes.RosyBrown, Rec_)
    22. End Sub
    23. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    24. Me.Show()
    25. End Sub
    26. End Class

    Lösung:
    Beim Mouse-Move-Ereignis, nachdem die Sub Loop_ aufgerufen wurde, die Stack bereinigen...
    Mfg.eniking1998

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „enIking1998“ ()

    heijeijei^^

    Mach das nicht mit einer Endlosschleife vermixt mit .doEvents. Was denkst du wie schnell 1000 Positionen abgearbeitet sind? 2 Milisekunden wenns hochkommt? Das ist also kompletter Unfug - die schleife haut das auf einmal weg.

    Außerdem: .invalide wird afaik nicht sofort ausgeführt (kp wie das genau geregelt ist, auf jeden Fall werden mehrere .invalide-Aufrufe zusammengefasst). Hier der Hinweis, dass .invalide eine Überladung hat die nützlich sein kann. Unterm Strich: bei sehr kleinen Zeitintervallen sind mehrere .invalide nur ein Einziges => es wirkt nicht animiert.

    Zeichne immer neu wenn sich die Daten verändern. Dafür natürlich das Paint-Event benutzen. Wenn du etwas animiert darstellen willst - wozu WinForms eigentlich nicht gedacht sind - benutze einen (1) Timer.

    Edit: an der Stelle Glückwunsch. Refresh wird sofort ausgeführt. Habe mal gewusst wo die genauen unterschiede sind, steht auch auf msdn, habs vergessen. Trotzdem: der Code ist Mist xD (alleine schon mit einer For-Schleife über einen Stack iterieren... muss ein Informatiker-Witz sein? :thumbup: )