Problem mit Tastenabfrage

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Goldwing Studios.

    Problem mit Tastenabfrage

    Hallo,

    ich habe ein Frage bezüglich der Tastenabfrage in VB.

    Ich arbeite mit VB 2008 und hatte vor mit meinem Freund ein kleines "Spielchen" zu machen in dem es darum geht eine Schneeballschlacht auszutragen. Ich weiß die Idee is nicht die schärfste abere naja is ja nur ein "Test", wir sind noch Anfänger.

    Nun zum Code der mir Kopfschmerzen bereitet:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim oben As Double = 2
    3. Private Sub Spieler_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Spieler.Click
    4. If (Keys.Up) Then
    5. Spieler.Location.Y += oben
    6. End If
    7. If (Keys.Down) Then
    8. Spieler.Location.Y -= oben
    9. End If
    10. If (Keys.Left) Then
    11. Spieler.Location.X -= oben
    12. End If
    13. If (Keys.Right) Then
    14. Spieler.Location.X += oben
    15. End Sub
    16. End Class

    Wir hatten uns überlegt zum Test einen button zu nehmen und ihn Spieler zu nennen jetzt wollten wir per Pfeiltastendruck zu der momentanen Position den Wert 2 hinzutun, also das der Button sich bewegt.

    Doch VB unterstreicht uns den Text aus einem mir nicht erkenntlichen Grund.

    Vielleicht kann mir ja jemand weiterhelfen.
    MFG
    Und die Lösung des Problems ist...

    ...*Trommelwirbel*...

    ->>> Das richtige Event nutzen!

    Da ihr die Tasten abfragen möchtet, eignet sich hier natürlich das Event, das auf Tastendrücke reagiert - KeyDown! So gut wie jedes Control (auch die Form) hat dieses Event und genau darin kannst du winderbar arbeiten.

    Und zwar folgendermaßen:

    VB.NET-Quellcode

    1. Private Sub PB1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles PB1.KeyDown
    2. 'Oben wird von einem Parameter "e" gesprochen, das offensichtlich mit "Key"s zu tun hat.
    3. 'Ja, "e" gibt Auskunft darüber, welcher Key (=Taste) gedrückt wurde -Zum Beispiel so:
    4. If e.KeyCode = Keys.Right Then MessageBox.Show("Immer geht's rechts rum...")
    5. 'Diese If-Abfrage oben könnt ihr euren anpassen und voilá! Es funktioniert.
    6. End Sub


    MfG,
    X-Zat / Momo

    Edit: Einer ist immer schneller
    Dankeschonmal dir das du dich so schnell gemeldet hast, aber das Event e.KeyCode wir bei mir nur unterstrichen und dann steht da das es kein Member von System.EventArgs ist

    auserdem habe ich immernoch keine Lösung für
    If (Keys.Up) Then
    Spieler.Location.Y += oben
    End If

    denn bei mir wird das Spieler.Location.X unterstrichen, aber wieso?
    Setz dich mal bitte mit den Grundlagen auseinander 8|

    Jedes Control hat mindestens ein Event. Diese werden "(ab)gefeuert"/ausgeführt, wenn etwas bestimmtes passiert.
    Wenn du nun im Designer das Control (hier am besten Form) anklickst, das Eigenschaften-Fenster betrachtest und dort auf die Event-Anzeige umschaltest (das Symbol mit dem Blitz), wirst du eine Auflistung aller Events sehen - Darunter dann auch das KeyDown.
    Diese Auflistung ist eine Liste mit zwei Spalten - Eine beinhaltet den Namen, die andere, falls schon geschrieben, der Name der dazugehörigen Methode im Code.
    Wenn der linke Eintrag leer ist, du dazu also noch nichts geschrieben hast, doppelklicke einfach darauf und dir wird ein neuer Sub erstellt.

    Jedes Event hat seine Parameter, das KeyDown-Event hat eben Key-spezifische.

    MfG,
    X-Zat / Momo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „X-Zat“ ()

    Wie von den anderen schon erklärt, solltest du die Tastenabfrage im entsprechenden Event stattfinden lassen, also zum Beispiel im KeyDown Event deiner Form.
    Die KeyPreview - Eigenschaft der Form sollte dazu auf True gesetzt sein.

    Spoiler anzeigen
    Hier ein kurzer Beispielcode, falls dir unklar ist, wie das gemeint ist.

    VB.NET-Quellcode

    1. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    2. 'Pfeiltasten abfragen
    3. Select Case e.KeyCode
    4. Case Keys.Right
    5. 'rechts
    6. Case Keys.Left
    7. 'links
    8. Case Keys.Up
    9. 'hoch
    10. Case Keys.Down
    11. 'runter
    12. End Select
    13. End Sub

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

    Danke für eure zahlreichen antworten, aber es funktioniert nicht so wie ihr es mir versucht zu erklären :D

    VB.NET-Quellcode

    1. Select Case e.KeyCode
    2. Case Keys.Right
    3. 'rechts
    4. Spieler.Location = New Point(Spieler.Location.X + 10, Spieler.Location.Y + 0)
    5. Case Keys.Left
    6. 'links
    7. Spieler.Location = New Point(Spieler.Location.X - 10, Spieler.Location.Y + 0)
    8. Case Keys.Up
    9. 'hoch
    10. Spieler.Location = New Point(Spieler.Location.X + 0, Spieler.Location.Y + 10)
    11. Case Keys.Down
    12. 'runter
    13. Spieler.Location = New Point(Spieler.Location.X + 0, Spieler.Location.Y - 10)
    14. End Select


    Irgendwie hab ich ne Sperre drin :D
    es klappt nicht :D
    Viel wichtiger ist dieser Teil:

    VB.NET-Quellcode

    1. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    2. End Sub

    Das ist das Event, wo der Code reinmuss. Und wie gesagt, in den Eigenschaften der Form solltest du KeyPreview = True einstellen.

    Sollte das dann immer noch net klappen, könnte irgendein anderes Steuerelement die Tastaturabfrage blockieren. Hatte sowas auch mal, als ich Textboxen für die Ausgabe meiner Statusinformationen benutzt habe. Solltest du sowas benutzen, ersetze sie vllt mal durch Label. Ansonsten kann ich da auch net weiterhelfen, ohne das Projekt selbst zu sehen.

    Also bei mir funzt das mit deinem Code, abgesehen davon dass hoch und runter vertauscht sind.

    Berichtigt:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. End Sub
    4. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    5. 'Spieler ist in diesem Beispiel der Name eines Labels, welches mit den Pfeiltasten gesteuert wird
    6. Select Case e.KeyCode
    7. Case Keys.Right
    8. 'rechts
    9. Spieler.Location = New Point(Spieler.Location.X + 10, Spieler.Location.Y + 0)
    10. Case Keys.Left
    11. 'links
    12. Spieler.Location = New Point(Spieler.Location.X - 10, Spieler.Location.Y + 0)
    13. Case Keys.Up
    14. 'hoch
    15. Spieler.Location = New Point(Spieler.Location.X + 0, Spieler.Location.Y - 10)
    16. Case Keys.Down
    17. 'runter
    18. Spieler.Location = New Point(Spieler.Location.X + 0, Spieler.Location.Y + 10)
    19. End Select
    20. End Sub
    21. End Class

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

    bei mir funktioniert garnix :D

    Gesamter Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    3. ' If e.KeyCode = Keys.Right Then
    4. ' Spieler.Location = New Point(Spieler.Location.X + 10, Spieler.Location.Y + 0)
    5. ' End If
    6. ' If e.KeyCode = Keys.Left Then
    7. ' Spieler.Location = New Point(Spieler.Location.X - 10, Spieler.Location.Y + 0)
    8. 'End If
    9. 'If e.KeyCode = Keys.Up Then
    10. ' Spieler.Location = New Point(Spieler.Location.X + 0, Spieler.Location.Y + 10)
    11. 'End If
    12. 'If e.KeyCode = Keys.Down Then
    13. ' Spieler.Location = New Point(Spieler.Location.X + 0, Spieler.Location.Y - 10)
    14. 'End If
    15. 'Pfeiltasten abfragen
    16. Select Case e.KeyCode
    17. Case Keys.Right
    18. 'rechts
    19. Spieler.Location = New Point(Spieler.Location.X + 10, Spieler.Location.Y + 0)
    20. Case Keys.Left
    21. 'links
    22. Spieler.Location = New Point(Spieler.Location.X - 10, Spieler.Location.Y + 0)
    23. Case Keys.Up
    24. 'hoch
    25. Spieler.Location = New Point(Spieler.Location.X + 0, Spieler.Location.Y + 10)
    26. Case Keys.Down
    27. 'runter
    28. Spieler.Location = New Point(Spieler.Location.X + 0, Spieler.Location.Y - 10)
    29. End Select
    30. End Sub
    31. End Class



    Das isn screeny vom Entwurfsblatt