1.) Mindestens – aber auch maximal – 4 Sekunden warten 2.) elegant zusammenfassen [gelöst]

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    1.) Mindestens – aber auch maximal – 4 Sekunden warten 2.) elegant zusammenfassen [gelöst]

    Hallo zusammen,
    Folgendes Szenario: Man drückt zum Beispiel die Taste F1 runter. Egal, wie lange man drückt, der Code für das Runterdrücken wird nur einmal ausgeführt. Man kann beliebig lange drücken, aber es muss mindestens 4 Sekunden dauern, bis der Code für das Loslassen ausgeführt werden darf. Egal, ob man so lange gedrückt hat oder nicht, die 4 Sekunden werden gesleept.

    Wenn mindestens 4 Sekunden bereits um sind (also man 4 Sekunden gedrückt hat), darf sofort der Code für das Loslassen der Taste ausgeführt werden. Ansonsten halt warten.

    Das funktioniert auch gut. Allerdings würde ich es gerne hinbekommen, dass, wenn bereits 3 Sekunden um sind, nur noch die 1 Sekunde gewartet werden muss, um die 4 vollzumachen. Und da habe ich gerade einen Knoten im Kopf. Ich habe vorhin schon der Prozedur
    Warten() eine TimeSpan übergeben und diese mit Math.Abs() auf ein positives Vorzeichen gebracht, aber da wurde viel zu wenig gesleept …

    Warum das Ganze? Ich möchte demnächst ein Labornetzteil über die RS232 ansteuern und einem Analogmotor verschiedene Spannungen geben. Der Grund für die Wartezeit ist, dass das Netzteil circa 4 Sekunden braucht, bevor der nächste Befehl kommen kann.

    Lässt sich hier noch etwas zusammenfassen?


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.ControlChars
    2. Public NotInheritable Class FormMain
    3. Private F1_is_pressed, F2_is_pressed, F5_is_pressed, F6_is_pressed, F9_is_pressed, F10_is_pressed As Boolean
    4. Private Zeit1 As Date
    5. Private Zeit2 As Date
    6. Private Sub FormMain_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    7. If e.KeyCode = Keys.F1 AndAlso Not F1_is_pressed Then
    8. F1_is_pressed = True
    9. Zeit1 = Date.Now
    10. Zeit2 = Date.Now
    11. Langsam_vorwaerts_Start()
    12. ElseIf e.KeyCode = Keys.F2 AndAlso Not F2_is_pressed Then
    13. F2_is_pressed = True
    14. Zeit1 = Date.Now
    15. Zeit2 = Date.Now
    16. Langsam_rueckwaerts_Start()
    17. ElseIf e.KeyCode = Keys.F5 AndAlso Not F5_is_pressed Then
    18. F5_is_pressed = True
    19. Zeit1 = Date.Now
    20. Zeit2 = Date.Now
    21. Mittel_vorwaerts_Start()
    22. ElseIf e.KeyCode = Keys.F6 AndAlso Not F6_is_pressed Then
    23. F6_is_pressed = True
    24. Zeit1 = Date.Now
    25. Zeit2 = Date.Now
    26. Mittel_rueckwaerts_Start()
    27. ElseIf e.KeyCode = Keys.F9 AndAlso Not F9_is_pressed Then
    28. F9_is_pressed = True
    29. Zeit1 = Date.Now
    30. Zeit2 = Date.Now
    31. Schnell_vorwaerts_Start()
    32. ElseIf e.KeyCode = Keys.F10 AndAlso Not F10_is_pressed Then
    33. F10_is_pressed = True
    34. Zeit1 = Date.Now
    35. Zeit2 = Date.Now
    36. Schnell_rueckwaerts_Start()
    37. Else
    38. Exit Sub
    39. End If
    40. End Sub
    41. Private Sub FormMain_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
    42. If e.KeyCode = Keys.F1 AndAlso F1_is_pressed Then
    43. F1_is_pressed = False
    44. Zeit2 = Date.Now
    45. Langsam_vorwaerts_Stopp()
    46. ElseIf e.KeyCode = Keys.F2 AndAlso F2_is_pressed Then
    47. F2_is_pressed = False
    48. Zeit2 = Date.Now
    49. Langsam_rueckwaerts_Stopp()
    50. ElseIf e.KeyCode = Keys.F5 AndAlso F5_is_pressed Then
    51. F5_is_pressed = False
    52. Zeit2 = Date.Now
    53. Mittel_vorwaerts_Stopp()
    54. ElseIf e.KeyCode = Keys.F6 AndAlso F6_is_pressed Then
    55. F6_is_pressed = False
    56. Zeit2 = Date.Now
    57. Mittel_rueckwaerts_Stopp()
    58. ElseIf e.KeyCode = Keys.F9 AndAlso F9_is_pressed Then
    59. F9_is_pressed = False
    60. Zeit2 = Date.Now
    61. Schnell_vorwaerts_Stopp()
    62. ElseIf e.KeyCode = Keys.F10 AndAlso F10_is_pressed Then
    63. F10_is_pressed = False
    64. Zeit2 = Date.Now
    65. Schnell_rueckwaerts_Stopp()
    66. Else
    67. Exit Sub
    68. End If
    69. End Sub
    70. Private Sub Langsam_vorwaerts_Start()
    71. Label_Richtung.Text = "Langsam vorwärts Start"
    72. Label_Richtung.Update()
    73. Zeit1 = Zeit1.AddSeconds(4)
    74. If Not Zeit2 > Zeit1 Then
    75. Warten()
    76. End If
    77. End Sub
    78. Private Sub Langsam_rueckwaerts_Start()
    79. Label_Richtung.Text = "Langsam rückwärts Start"
    80. Label_Richtung.Update()
    81. Zeit1 = Zeit1.AddSeconds(4)
    82. If Not Zeit2 > Zeit1 Then
    83. Warten()
    84. End If
    85. End Sub
    86. Private Sub Mittel_vorwaerts_Start()
    87. Label_Richtung.Text = "Mittel vorwärts Start"
    88. Label_Richtung.Update()
    89. Zeit1 = Zeit1.AddSeconds(4)
    90. If Not Zeit2 > Zeit1 Then
    91. Warten()
    92. End If
    93. End Sub
    94. Private Sub Mittel_rueckwaerts_Start()
    95. Label_Richtung.Text = "Mittel rückwärts Start"
    96. Label_Richtung.Update()
    97. Zeit1 = Zeit1.AddSeconds(4)
    98. If Not Zeit2 > Zeit1 Then
    99. Warten()
    100. End If
    101. End Sub
    102. Private Sub Schnell_vorwaerts_Start()
    103. Label_Richtung.Text = "Schnell vorwärts Start"
    104. Label_Richtung.Update()
    105. Zeit1 = Zeit1.AddSeconds(4)
    106. If Not Zeit2 > Zeit1 Then
    107. Warten()
    108. End If
    109. End Sub
    110. Private Sub Schnell_rueckwaerts_Start()
    111. Label_Richtung.Text = "Schnell rückwärts Start"
    112. Label_Richtung.Update()
    113. Zeit1 = Zeit1.AddSeconds(4)
    114. If Not Zeit2 > Zeit1 Then
    115. Warten()
    116. End If
    117. End Sub
    118. Private Sub Langsam_vorwaerts_Stopp()
    119. Label_Richtung.Text = "Langsam vorwärts Stopp"
    120. Label_Richtung.Update()
    121. Zeit1 = Zeit1.AddSeconds(4)
    122. If Not Zeit2 > Zeit1 Then
    123. Warten()
    124. End If
    125. End Sub
    126. Private Sub Langsam_rueckwaerts_Stopp()
    127. Label_Richtung.Text = "Langsam rückwärts Stopp"
    128. Label_Richtung.Update()
    129. Zeit1 = Zeit1.AddSeconds(4)
    130. If Not Zeit2 > Zeit1 Then
    131. Warten()
    132. End If
    133. End Sub
    134. Private Sub Mittel_vorwaerts_Stopp()
    135. Label_Richtung.Text = "Mittel vorwärts Stopp"
    136. Label_Richtung.Update()
    137. Zeit1 = Zeit1.AddSeconds(4)
    138. If Not Zeit2 > Zeit1 Then
    139. Warten()
    140. End If
    141. End Sub
    142. Private Sub Mittel_rueckwaerts_Stopp()
    143. Label_Richtung.Text = "Mittel rückwärts Stopp"
    144. Label_Richtung.Update()
    145. Zeit1 = Zeit1.AddSeconds(4)
    146. If Not Zeit2 > Zeit1 Then
    147. Warten()
    148. End If
    149. End Sub
    150. Private Sub Schnell_vorwaerts_Stopp()
    151. Label_Richtung.Text = "Schnell vorwärts Stopp"
    152. Label_Richtung.Update()
    153. Zeit1 = Zeit1.AddSeconds(4)
    154. If Not Zeit2 > Zeit1 Then
    155. Warten()
    156. End If
    157. End Sub
    158. Private Sub Schnell_rueckwaerts_Stopp()
    159. Label_Richtung.Text = "Schnell rückwärts Stopp"
    160. Label_Richtung.Update()
    161. Zeit1 = Zeit1.AddSeconds(4)
    162. If Not Zeit2 > Zeit1 Then
    163. Warten()
    164. End If
    165. End Sub
    166. Private Shared Sub Warten()
    167. System.Threading.Thread.Sleep(4000)
    168. End Sub
    169. End Class

    ganz grob zusammengefasst:

    Quellcode

    1. KeyDown: Zeit1 festlegen
    2. KeyUp:
    3. Dim ZusätzlicheWartezeit = 4 - (Date.Now - Zeit1).TotalSeconds
    4. Wenn ZusätzlicheWartezeit > 0 Then Warte(ZusätzlicheWartezeit)
    5. FühreNetzteilCodeAus
    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.
    Funktioniert super, danke!

    VB.NET-Quellcode

    1. Private Sub FormMain_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    2. If e.KeyCode = Keys.F1 AndAlso Not F1_is_pressed Then
    3. F1_is_pressed = True
    4. Zeit1 = Date.Now
    5. Langsam_vorwaerts_Start()
    6. ElseIf e.KeyCode = Keys.F2 AndAlso Not F2_is_pressed Then
    7. F2_is_pressed = True
    8. Zeit1 = Date.Now
    9. Langsam_rueckwaerts_Start()
    10. ElseIf e.KeyCode = Keys.F5 AndAlso Not F5_is_pressed Then
    11. F5_is_pressed = True
    12. Zeit1 = Date.Now
    13. Mittel_vorwaerts_Start()
    14. ElseIf e.KeyCode = Keys.F6 AndAlso Not F6_is_pressed Then
    15. F6_is_pressed = True
    16. Zeit1 = Date.Now
    17. Mittel_rueckwaerts_Start()
    18. ElseIf e.KeyCode = Keys.F9 AndAlso Not F9_is_pressed Then
    19. F9_is_pressed = True
    20. Zeit1 = Date.Now
    21. Schnell_vorwaerts_Start()
    22. ElseIf e.KeyCode = Keys.F10 AndAlso Not F10_is_pressed Then
    23. F10_is_pressed = True
    24. Zeit1 = Date.Now
    25. Schnell_rueckwaerts_Start()
    26. Else
    27. Exit Sub
    28. End If
    29. End Sub
    30. Private Sub FormMain_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
    31. Dim zusaetzliche_Wartezeit As Double = 4000.0 - (Date.Now - Zeit1).TotalMilliseconds
    32. If e.KeyCode = Keys.F1 AndAlso F1_is_pressed Then
    33. F1_is_pressed = False
    34. If zusaetzliche_Wartezeit > 0.0 Then
    35. Warten(zusaetzliche_Wartezeit)
    36. End If
    37. Langsam_vorwaerts_Stopp()
    38. ElseIf e.KeyCode = Keys.F2 AndAlso F2_is_pressed Then
    39. F2_is_pressed = False
    40. If zusaetzliche_Wartezeit > 0.0 Then
    41. Warten(zusaetzliche_Wartezeit)
    42. End If
    43. Langsam_rueckwaerts_Stopp()
    44. ElseIf e.KeyCode = Keys.F5 AndAlso F5_is_pressed Then
    45. F5_is_pressed = False
    46. If zusaetzliche_Wartezeit > 0.0 Then
    47. Warten(zusaetzliche_Wartezeit)
    48. End If
    49. Mittel_vorwaerts_Stopp()
    50. ElseIf e.KeyCode = Keys.F6 AndAlso F6_is_pressed Then
    51. F6_is_pressed = False
    52. If zusaetzliche_Wartezeit > 0.0 Then
    53. Warten(zusaetzliche_Wartezeit)
    54. End If
    55. Mittel_rueckwaerts_Stopp()
    56. ElseIf e.KeyCode = Keys.F9 AndAlso F9_is_pressed Then
    57. F9_is_pressed = False
    58. If zusaetzliche_Wartezeit > 0.0 Then
    59. Warten(zusaetzliche_Wartezeit)
    60. End If
    61. Schnell_vorwaerts_Stopp()
    62. ElseIf e.KeyCode = Keys.F10 AndAlso F10_is_pressed Then
    63. F10_is_pressed = False
    64. If zusaetzliche_Wartezeit > 0.0 Then
    65. Warten(zusaetzliche_Wartezeit)
    66. End If
    67. Schnell_rueckwaerts_Stopp()
    68. Else
    69. Exit Sub
    70. End If
    71. End Sub
    72. Private Sub Warten(ByVal zusaetzliche_Wartezeit As Double)
    73. System.Threading.Thread.Sleep(CInt(zusaetzliche_Wartezeit))
    74. End Sub
    Codezusammenfassungsvorschlag:

    VB.NET-Quellcode

    1. Private Sub FormMain_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    2. Check(e.KeyCode, Keys.F1, F1_is_pressed, Sub() Langsam_vorwaerts_Start())
    3. Check(e.KeyCode, Keys.F2, F2_is_pressed, Sub() Langsam_rueckwaerts_Start())
    4. Check(e.KeyCode, Keys.F5, F5_is_pressed, Sub() Mittel_vorwaerts_Start())
    5. Check(e.KeyCode, Keys.F6, F6_is_pressed, Sub() Mittel_rueckwaerts_Start())
    6. Check(e.KeyCode, Keys.F9, F9_is_pressed, Sub() Schnell_vorwaerts_Start())
    7. Check(e.KeyCode, Keys.F10, F10_is_pressed, Sub() Schnell_rueckwaerts_Start())
    8. End Sub
    9. Private Sub Check(ActualKeyCode As Keys, ExpectedKeyCode As Keys, ByRef Condition As Boolean, Action As Action)
    10. If ActualKeyCode <> ExpectedKeyCode OrElse Condition Then Return
    11. Condition = True
    12. Zeit1 = Date.Now
    13. Action()
    14. End Sub

    KeyUp entsprechend

    Else: Exit Sub ist redundant, da eh letzte Anweisung der Prozedur.
    btw: Die Benennung der Variable Zeit1 ist … ausbaufähig. Allein schon deshalb, weil es keine Zeit2 mehr gibt.

    btw: was soll passieren, wenn man 2 F-Tasten gleichzeitig drückt? Darf das sein oder muss es ausgeschlossen werden?
    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.
    @VaporiZed Das ist super. Vor allem, das Action As Action bei der Übergabe und dem damit verbundenen Verhalten kannte ich noch nicht.

    Ich habe es bisher so gemacht. Entspricht dies deinen Vorstellungen?


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.ControlChars
    2. Public NotInheritable Class FormMain
    3. Private F1_is_pressed, F2_is_pressed, F5_is_pressed, F6_is_pressed, F9_is_pressed, F10_is_pressed As Boolean
    4. Private jetzt As Date ' OK?
    5. Private Sub FormMain_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    6. Check(e.KeyCode, Keys.F1, F1_is_pressed, Sub() Langsam_vorwaerts_Start())
    7. Check(e.KeyCode, Keys.F2, F2_is_pressed, Sub() Langsam_rueckwaerts_Start())
    8. Check(e.KeyCode, Keys.F5, F5_is_pressed, Sub() Mittel_vorwaerts_Start())
    9. Check(e.KeyCode, Keys.F6, F6_is_pressed, Sub() Mittel_rueckwaerts_Start())
    10. Check(e.KeyCode, Keys.F9, F9_is_pressed, Sub() Schnell_vorwaerts_Start())
    11. Check(e.KeyCode, Keys.F10, F10_is_pressed, Sub() Schnell_rueckwaerts_Start())
    12. End Sub
    13. Private Sub Check(ActualKeyCode As Keys, ExpectedKeyCode As Keys, ByRef Condition As Boolean, Action As Action)
    14. If ActualKeyCode <> ExpectedKeyCode OrElse Condition Then Return
    15. Condition = True
    16. jetzt = Date.Now
    17. Action()
    18. End Sub
    19. Private Sub FormMain_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
    20. Check2(e.KeyCode, Keys.F1, F1_is_pressed, Sub() Langsam_vorwaerts_Stopp())
    21. Check2(e.KeyCode, Keys.F2, F2_is_pressed, Sub() Langsam_rueckwaerts_Stopp())
    22. Check2(e.KeyCode, Keys.F5, F5_is_pressed, Sub() Mittel_vorwaerts_Stopp())
    23. Check2(e.KeyCode, Keys.F6, F6_is_pressed, Sub() Mittel_rueckwaerts_Stopp())
    24. Check2(e.KeyCode, Keys.F9, F9_is_pressed, Sub() Schnell_vorwaerts_Stopp())
    25. Check2(e.KeyCode, Keys.F10, F10_is_pressed, Sub() Schnell_rueckwaerts_Stopp())
    26. End Sub
    27. Private Sub Check2(ActualKeyCode As Keys, ExpectedKeyCode As Keys, ByRef Condition As Boolean, Action As Action)
    28. If ActualKeyCode <> ExpectedKeyCode OrElse Not Condition Then Return
    29. Condition = False
    30. Dim zusaetzliche_Wartezeit As Double = 4000.0 - (Date.Now - jetzt).TotalMilliseconds
    31. If zusaetzliche_Wartezeit > 0.0 Then
    32. Warten(zusaetzliche_Wartezeit)
    33. End If
    34. Action()
    35. End Sub
    36. Private Sub Langsam_vorwaerts_Start()
    37. Label_Richtung.Text = "Langsam vorwärts Start"
    38. Label_Richtung.Update()
    39. End Sub
    40. Private Sub Langsam_rueckwaerts_Start()
    41. Label_Richtung.Text = "Langsam rückwärts Start"
    42. Label_Richtung.Update()
    43. End Sub
    44. Private Sub Mittel_vorwaerts_Start()
    45. Label_Richtung.Text = "Mittel vorwärts Start"
    46. Label_Richtung.Update()
    47. End Sub
    48. Private Sub Mittel_rueckwaerts_Start()
    49. Label_Richtung.Text = "Mittel rückwärts Start"
    50. Label_Richtung.Update()
    51. End Sub
    52. Private Sub Schnell_vorwaerts_Start()
    53. Label_Richtung.Text = "Schnell vorwärts Start"
    54. Label_Richtung.Update()
    55. End Sub
    56. Private Sub Schnell_rueckwaerts_Start()
    57. Label_Richtung.Text = "Schnell rückwärts Start"
    58. Label_Richtung.Update()
    59. End Sub
    60. Private Sub Langsam_vorwaerts_Stopp()
    61. Label_Richtung.Text = "Langsam vorwärts Stopp"
    62. Label_Richtung.Update()
    63. End Sub
    64. Private Sub Langsam_rueckwaerts_Stopp()
    65. Label_Richtung.Text = "Langsam rückwärts Stopp"
    66. Label_Richtung.Update()
    67. End Sub
    68. Private Sub Mittel_vorwaerts_Stopp()
    69. Label_Richtung.Text = "Mittel vorwärts Stopp"
    70. Label_Richtung.Update()
    71. End Sub
    72. Private Sub Mittel_rueckwaerts_Stopp()
    73. Label_Richtung.Text = "Mittel rückwärts Stopp"
    74. Label_Richtung.Update()
    75. End Sub
    76. Private Sub Schnell_vorwaerts_Stopp()
    77. Label_Richtung.Text = "Schnell vorwärts Stopp"
    78. Label_Richtung.Update()
    79. End Sub
    80. Private Sub Schnell_rueckwaerts_Stopp()
    81. Label_Richtung.Text = "Schnell rückwärts Stopp"
    82. Label_Richtung.Update()
    83. End Sub
    84. Private Shared Sub Warten(ByVal zusaetzliche_Wartezeit As Double)
    85. System.Threading.Thread.Sleep(CInt(zusaetzliche_Wartezeit))
    86. End Sub
    87. End Class



    PS: Wie kann ich ausschließen, dass 2 F-Tasten gleichzeitig gedrückt werden?

    Die ganzen Beschriftungssubs können weg.

    VB.NET-Quellcode

    1. Check(e.KeyCode, Keys.F1, F1_is_pressed, Sub() Langsam_vorwaerts_Start())

    ->

    VB.NET-Quellcode

    1. Check(e.KeyCode, Keys.F1, F1_is_pressed, Sub() ShowInGui("Langsam vorwärts Start"))
    2. '…
    3. Private Sub ShowInGui(Text As String)
    4. Label_Richtung.Text = Text
    5. Label_Richtung.Update()
    6. End Sub


    bzgl. 2 F-Tasten: Nimm statt 6 einzelne Booleans eine List(Of Boolean), hier namens gedrückteFTasten. Dann kannst Du schreiben:

    VB.NET-Quellcode

    1. Private Sub Check(ActualKeyCode As Keys, ExpectedKeyCode As Keys, ByRef Condition As Boolean, Action As Action)
    2. If ActualKeyCode <> ExpectedKeyCode OrElse gedrückteFTasten.Any(Function (x) x) Then Return

    So aus dem Kopf bzw. Bauchgefühl raus.
    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.
    Die ganzen Beschriftungssubs können weg
    In diese Subs kommt noch der Code für das Netzteil, deswegen lasse ich die bestehen. Sind verschiedene Spannungen.

    ============================
    Zwischeneinschub: Zu List(of T).Any() habe ich bei MSDN nachgesehen, und ich habe mir ein Testprojekt gemacht. Sobald ein Element in der Boolean-Liste True wird, gibt das True zurück, sonst nur False. :thumbup:


    ============================


    Daher sieht mein Code nun so aus und funktioniert. (

    VB.NET-Quellcode

    1. ByRef Condition As Boolean
    ) nehme ich noch raus.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.ControlChars
    2. Public NotInheritable Class FormMain
    3. Private F1_is_pressed, F2_is_pressed, F5_is_pressed, F6_is_pressed, F9_is_pressed, F10_is_pressed As Boolean
    4. Private jetzt As Date
    5. ''' <summary>
    6. ''' Dient um zu prüfen, ob nicht 2 F-Tasten gleichzeitig gedrückt werden.
    7. ''' </summary>
    8. Private gedrueckteFTasten As New List(Of Boolean) From {False, False, False, False, False, False}
    9. Private Sub FormMain_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    10. Check(e.KeyCode, Keys.F1, F1_is_pressed, Sub() Langsam_vorwaerts_Start(), 0)
    11. Check(e.KeyCode, Keys.F2, F2_is_pressed, Sub() Langsam_rueckwaerts_Start(), 1)
    12. Check(e.KeyCode, Keys.F5, F5_is_pressed, Sub() Mittel_vorwaerts_Start(), 2)
    13. Check(e.KeyCode, Keys.F6, F6_is_pressed, Sub() Mittel_rueckwaerts_Start(), 3)
    14. Check(e.KeyCode, Keys.F9, F9_is_pressed, Sub() Schnell_vorwaerts_Start(), 4)
    15. Check(e.KeyCode, Keys.F10, F10_is_pressed, Sub() Schnell_rueckwaerts_Start(), 5)
    16. End Sub
    17. Private Sub Check(ActualKeyCode As Keys, ExpectedKeyCode As Keys, ByRef Condition As Boolean, Action As Action, index As Integer)
    18. If ActualKeyCode <> ExpectedKeyCode OrElse gedrueckteFTasten.Any(Function(x) x) Then 'OrElse Condition Then '
    19. Return
    20. End If
    21. gedrueckteFTasten(index) = True 'Condition = True
    22. jetzt = Date.Now
    23. Action()
    24. End Sub
    25. Private Sub FormMain_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
    26. Check2(e.KeyCode, Keys.F1, F1_is_pressed, Sub() Langsam_vorwaerts_Stopp(), 0)
    27. Check2(e.KeyCode, Keys.F2, F2_is_pressed, Sub() Langsam_rueckwaerts_Stopp(), 1)
    28. Check2(e.KeyCode, Keys.F5, F5_is_pressed, Sub() Mittel_vorwaerts_Stopp(), 2)
    29. Check2(e.KeyCode, Keys.F6, F6_is_pressed, Sub() Mittel_rueckwaerts_Stopp(), 3)
    30. Check2(e.KeyCode, Keys.F9, F9_is_pressed, Sub() Schnell_vorwaerts_Stopp(), 4)
    31. Check2(e.KeyCode, Keys.F10, F10_is_pressed, Sub() Schnell_rueckwaerts_Stopp(), 5)
    32. End Sub
    33. Private Sub Check2(ActualKeyCode As Keys, ExpectedKeyCode As Keys, ByRef Condition As Boolean, Action As Action, index As Integer)
    34. If ActualKeyCode <> ExpectedKeyCode OrElse Not gedrueckteFTasten.Any(Function(x) x) Then Return
    35. gedrueckteFTasten(index) = False 'Condition = False
    36. Dim zusaetzliche_Wartezeit As Double = 4000.0 - (Date.Now - jetzt).TotalMilliseconds
    37. If zusaetzliche_Wartezeit > 0.0 Then
    38. Warten(zusaetzliche_Wartezeit)
    39. End If
    40. Action()
    41. End Sub
    42. Private Sub Langsam_vorwaerts_Start()
    43. Label_Richtung.Text = "Langsam vorwärts Start"
    44. Label_Richtung.Update()
    45. 'Hier „Spannung einschalten“ senden
    46. End Sub
    47. Private Sub Langsam_rueckwaerts_Start()
    48. Label_Richtung.Text = "Langsam rückwärts Start"
    49. Label_Richtung.Update()
    50. 'Hier „Spannung einschalten“ senden
    51. End Sub
    52. Private Sub Mittel_vorwaerts_Start()
    53. Label_Richtung.Text = "Mittel vorwärts Start"
    54. Label_Richtung.Update()
    55. 'Hier „Spannung einschalten“ senden
    56. End Sub
    57. Private Sub Mittel_rueckwaerts_Start()
    58. Label_Richtung.Text = "Mittel rückwärts Start"
    59. Label_Richtung.Update()
    60. 'Hier „Spannung einschalten“ senden
    61. End Sub
    62. Private Sub Schnell_vorwaerts_Start()
    63. Label_Richtung.Text = "Schnell vorwärts Start"
    64. Label_Richtung.Update()
    65. 'Hier „Spannung einschalten“ senden
    66. End Sub
    67. Private Sub Schnell_rueckwaerts_Start()
    68. Label_Richtung.Text = "Schnell rückwärts Start"
    69. Label_Richtung.Update()
    70. 'Hier „Spannung einschalten“ senden
    71. End Sub
    72. Private Sub Langsam_vorwaerts_Stopp()
    73. Label_Richtung.Text = "Langsam vorwärts Stopp"
    74. Label_Richtung.Update()
    75. 'Hier „Spannung ausschalten“ senden
    76. End Sub
    77. Private Sub Langsam_rueckwaerts_Stopp()
    78. Label_Richtung.Text = "Langsam rückwärts Stopp"
    79. Label_Richtung.Update()
    80. 'Hier „Spannung ausschalten“ senden
    81. End Sub
    82. Private Sub Mittel_vorwaerts_Stopp()
    83. Label_Richtung.Text = "Mittel vorwärts Stopp"
    84. Label_Richtung.Update()
    85. 'Hier „Spannung ausschalten“ senden
    86. End Sub
    87. Private Sub Mittel_rueckwaerts_Stopp()
    88. Label_Richtung.Text = "Mittel rückwärts Stopp"
    89. Label_Richtung.Update()
    90. 'Hier „Spannung ausschalten“ senden
    91. End Sub
    92. Private Sub Schnell_vorwaerts_Stopp()
    93. Label_Richtung.Text = "Schnell vorwärts Stopp"
    94. Label_Richtung.Update()
    95. 'Hier „Spannung ausschalten“ senden
    96. End Sub
    97. Private Sub Schnell_rueckwaerts_Stopp()
    98. Label_Richtung.Text = "Schnell rückwärts Stopp"
    99. Label_Richtung.Update()
    100. 'Hier „Spannung ausschalten“ senden
    101. End Sub
    102. Private Shared Sub Warten(ByVal zusaetzliche_Wartezeit As Double)
    103. System.Threading.Thread.Sleep(CInt(zusaetzliche_Wartezeit))
    104. End Sub
    105. End Class



    Eine Sache ist mir noch aufgefallen. Wenn das ganze Prozedere für zum Beispiel F1 durch ist (wurde gedrückt und wieder losgelassen), dann muss danach ebenso eine Zeit vergehen. Edit: Erledigt!

    Ok, jetzt sehe ich es auch, bei den Stopp-Subs wird ja immer nur
    „0V“ gesendet, daher könnte ich noch etwas einstampfen. Edit: Erledigt!

    VB.NET-Quellcode

    1. Private Sub Stoppen()
    2. Label_Richtung.Text = "Stopp"
    3. Label_Richtung.Update()
    4. 'Hier „Spannung ausschalten“ senden
    5. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Bartosz“ ()