Sekundenabhängige Losslasung der Taste führt andere Funktion aus

  • VB.NET
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von wasserbaum.

    Sekundenabhängige Losslasung der Taste führt andere Funktion aus

    Hallo zusammen ;)

    bitte entschuldigt meine abstrakte Titelbennenung. So... Jetzt zu meiner Frage. Ich werde mein Vorhaben versuchen ausführlich zu erläutern.
    Ich möchte eine Oberfläche die folgende Funktion ermöglicht.



    Insgesamt 2 Tasten. AG und BB

    Die Tasten sollen zeitabhängige Befehle ausführen

    Kurz im Voraus - Definition
    Zeitabhängige Befehle:

    Drückt man AG und wartet über 1
    Sekunde: (Bedeutet) Taste einmal drücken und direkt loslassen.
    Zeitberechnung erfolgt nach loslassen der Taste und endet beim
    drücken der nächsten Taste.

    Drückt man AG über 1 Sekunde lang:
    (Bedeutet) Taste drücken und gedrückt halten. Zeitberechnung
    erfolgt beim drücken und hört beim loslassen auf.

    Wichtig: Wenn die Taste unter 1 Sekunde
    gedrückt wird oder kurz gedrückt und über 3 Sekunden keine neue
    gedrückt wird, dann gleich erstens „Drückt man AG = 1“

    Drückt man AG = 1

    Zeitabhängiger Befehl: Drückt man AG
    und wartet über 1 Sekunde = 14, Drückt man AG und wartet über 2
    Sekunden = 15, Drückt man AG und wartet über 3 Sekunden = 16

    Zeitabhängiger Befehl: Drückt man AG
    über 1 Sekunde lang = 11, Drückt man AG über 2 Sekunden lang = 12,
    Drückt man AG über 3 Sekunden lang = 13

    Drückt man BB = 2

    Zeitabhängiger Befehl: Drückt man BB
    und wartet über 1 Sekunde = 24, Drückt man BB und wartet über 2
    Sekunden = 25, Drückt man BB und wartet über 3 Sekunden = 26

    Zeitabhängiger Befehl: Drückt man BB
    über 1 Sekunde lang = 21, Drückt man BB über 2 Sekunden lang = 22,
    Drückt man BB über 3 Sekunden lang = 23


    BIS JETZT

    habe ich folgendes gemacht,

    VB.NET-Quellcode

    1. Sub frm_Load() Handles BB.Click
    2. tmr.Interval = 1000
    3. tmr.Enabled = True
    4. End Sub
    5. Sub tmr_Tick() Handles tmr.Tick
    6. Dim N2_0s As Integer
    7. Dim N2_0sOUT As Integer
    8. N2_0s = 2
    9. tmr.Enabled = False
    10. Debug.Print(N2_0s)
    11. End Sub


    Hiermit habe ich nur eine Funktion. Heisst ich drücke, warte 1 Sekunde und dann bekomme ich als Ausgabe 2. Ob ich länger drücke oder gleich loslasse, macht es keinen Unterschied.

    Besten Dank im Voraus

    Grüsse
    Wasserbaum
    hm.. (so ganz kann ich der Sache nicht folgen) :)
    Aber.. schau dir mal Zeile 9 an.
    Da setzt du "n2_0s" direkt auf 2, egal was passiert. Deshalb bekommst du immer die 2 als Ausgabe, weil du sie ja direkt vorgibst.

    evtl. solltest du dich mal mit der StopWatch beschäftigen, die genauer ist.
    Wie gesagt, so ganz habe ich es nicht verstanden, aber die grobe Richtung wäre.
    beim Tastendruck startet Du die Stopwatch.. (bei 2 Tasten, z.B. auch 1 Zeitmesser pro Taste also 2)
    beim Loslassen ermittelst du den Wert, und hast deine Zeit, wie lange sie gedrückt wurde, also deine x1 x2 x3 Sekunden, und je nachdem welche Taste es war,
    kommt halt 10 für Taste 1 oder 20 für Taste 2 dazu.
    hier mal ein Beispiel.
    Auf der Form1 sollte ein Label (label1) für die Anzeige sein, und ein Timer (timer1) der nur dazu dient, die Zeiten anzuzeigen ( Ich habe ihn auf 100 ms).
    Wie zu sehen sein sollte, werden aktuell Taste A und B angefragt.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim TriggerKey1 As Keys = Keys.A
    3. Dim TriggerKey2 As Keys = Keys.B
    4. Dim Stopwatch1 As New Stopwatch
    5. Dim Stopwatch2 As New Stopwatch
    6. Dim Key1IsPressed As Boolean = False
    7. Dim Key2IsPressed As Boolean = False
    8. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    9. KeyPreview = True ' wichtig, damit die Taste auch von der Form abgefragt wird
    10. ' der Timer dient nur zur Anzeige
    11. Timer1.Start() ' hier ist einfach ein Timer auf die Form gezogen mit Intervall 100
    12. End Sub
    13. ' Wenn Taste gedrückt
    14. Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    15. ' dieses Event wird immer wieder ausgelöst, solange die Taste gedrückt wird
    16. ' deshalb den Zustand merken
    17. If e.KeyCode = TriggerKey1 AndAlso Not Key1IsPressed Then
    18. Key1IsPressed = True
    19. Stopwatch1.Reset()
    20. Stopwatch1.Start()
    21. ElseIf e.KeyCode = TriggerKey2 AndAlso Not Key2IsPressed Then
    22. Key2IsPressed = True
    23. Stopwatch2.Reset()
    24. Stopwatch2.Start()
    25. End If
    26. End Sub
    27. ' Wenn Taste losgelassen
    28. Private Sub Form1_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
    29. If e.KeyCode = TriggerKey1 Then
    30. Stopwatch1.Stop()
    31. Key1IsPressed = False
    32. ElseIf e.KeyCode = TriggerKey2 Then
    33. Stopwatch2.Stop()
    34. Key2IsPressed = False
    35. End If
    36. End Sub
    37. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    38. ShowWerte()
    39. End Sub
    40. Private Sub ShowWerte()
    41. ' dient nur zur Anzeige
    42. ' mit ZeitDauer1.TotalSeconds steht drinnen, wiviel sekunden die Taste gedrückt wurde
    43. ' es wäre auch möglich millisekunden abzufragen
    44. Label1.Text = "Taste 1 : " & Stopwatch1.Elapsed.Seconds.ToString & vbCrLf & "Taste 2 : " & Stopwatch2.Elapsed.Seconds.ToString
    45. End


    deine 20 .. 200 und so kannst du nun selber anhand der vergangenen Zeit einstellen.

    Probier dein Glück :)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „RoulettePilot“ ()

    @RoulettePilot
    Danke hat super geklappt. Bekomme aber wie du ja schon erwähnt hast, nur die Sekunden angezeigt. Wo muss ich Parametrierungen vornehmen um, wie du gesagt hast 20 200 ausgewertet zu bekommen ;)

    Sorry im Voraus für die viele Fragen. Vllt sehe ich den Wald vor lauter Bäumen nicht. Schöne Grüße

    ps. kläglich gescheitert (Am Ende) IntCode As Integer geht nicht, da = Operator für Int und Stopwatch nicht möglich ist

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim TriggerKey1 As Keys = Keys.A
    3. Dim TriggerKey2 As Keys = Keys.B
    4. Dim Stopwatch1 As New Stopwatch
    5. Dim Stopwatch2 As New Stopwatch
    6. Dim Key1IsPressed As Boolean = False
    7. Dim Key2IsPressed As Boolean = False
    8. Dim IntCode As Stopwatch
    9. Dim IntCodex As Integer
    10. '.................................
    11. '...........UND..............
    12. '...........AM.................
    13. '..........ENDE..........
    14. Sub Auswertung()
    15. IntCode = Stopwatch1
    16. If IntCode = 1 Then IntCodex = 10
    17. If Stopwatch1.Stop(2) Then IntCode = 100
    18. End If

    Moin Moin.
    Deine Auswertung ist (gelinde gesagt) vermurkst.
    Die Stoppuhr ist ein Komplexes Gebilde. mit Zig Parametern. Tipp doch mal aus Spass Stopwatch1 und ein "." ein.
    Da wirst du stauen, was sich alles dahinter verbirgt. Und uns, besser gesagt dich *g*, interessieren nur die Vergangenen (elapsed) Sekunden.
    Also müssen wir auch ganz genau(!) sagen, welchen Wert wir haben wollen.

    Wenn dich einer nach der Zeit fragt, sagst du auch nicht "Grüner Wecker mit Schwarzen Zahlen und Goldene Glocke", sondern genau diesen einen(!) Wert eben.. die Zeit.



    VB.NET-Quellcode

    1. Dim Result As Integer = 0
    2. If Stopwatch1.Elapsed.Seconds < 1 Then ' von der Stopuhr interessieren uns nur die vergangen Sekunden
    3. Result = 2
    4. ElseIf Stopwatch1.Elapsed.Seconds < 2 Then
    5. Result = 20
    6. ElseIf Stopwatch1.Elapsed.Seconds < 3 Then
    7. Result = 200
    8. Else
    9. Result = 2000
    10. End If