KeyPress KeyUp - nur sichtbare Zeichen aus e.keyChar auslesen?

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    KeyPress KeyUp - nur sichtbare Zeichen aus e.keyChar auslesen?

    Hallo Leute!

    Ich möchte in einer Form, unabhängig von Eingabefeldern und anderen Elementen wie Pictureboxen, Buttons etc. die Tastatureingaben des Benutzers abfangen. Dies habe ich soweit mit folgenden Code hinbekommen.

    VB.NET-Quellcode

    1. Private Sub frm_hauptform_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
    2. TastaturPuffer.Append(e.KeyChar)
    3. ' Label1.Text = e.KeyChar
    4. 'Label2.Text = TastaturPuffer.ToString
    5. 'Label5.Text = CStr(e.KeyChar)
    6. End Sub
    7. Private Sub frm_hauptform_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
    8. 'Nur die Enter-Taste gedrückt wurde
    9. If e.KeyCode = Keys.Enter And TastaturPuffer.Length > 0 Then
    10. RichTextBox1.Text += TastaturPuffer.ToString + " - " + CStr(TastaturPuffer.Length) + vbCrLf
    11. TastaturPuffer.Clear()
    12. End If
    13. End Sub


    Da die Eingabe Barcodes und Schlüsselcodes (Kellnerschlösser über HID) sind, die immer mit einem CR+LF (Enter-Taste) abgeschlossen werden, fülle ich den Tastaturpuffer (Variable) im KeyPress Ereignis mit dem gerade getippten Zeichen.

    Im Keyup Ereignis frage ich ab ob die Enter-Taste gedrückt wurde. Wurde diese gedrückt und vorher mindestens 1 gültiges Zeichen getippt, dann wird der Code übernommen (zum Probieren in eine Richtextbox geschrieben mit der Info der Zeichenlänge).

    Nun habe ich aber das Problem, dass JEDE Taste übergeben wird. Also auch Backspace und andere Steuerzeichen. Das möchte ich aber nicht. Ich möchte ausschließlich sichtbare Zeichen übergeben (0-9,a-f,A-F,!-?). Gibt es hier einen "Universalbefehl" um nur "normale" Zeichne zu identifizieren oder muss man mit If/Then oder Case-Abfrage die ungültigen oder gültigen manuell auseinanderpflücken?

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

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

    @dive26:: Die Auswahl der für Dich zulässigen Tasten machst Du in der KeyDown:

    VB.NET-Quellcode

    1. Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    2. Select Case e.KeyCode
    3. Case Keys.A To Keys.Z
    4. Case Else
    5. e.SuppressKeyPress = True
    6. End Select
    7. End Sub
    lässt nur die Tasten a-z | A-Z durch, den Rest nicht.
    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!
    Ich verwende immer den KeyChar
    Ansonsten rufe ich meine Sub auch aus dem KeyDown auf.

    VB.NET-Quellcode

    1. Public Sub NurZahlenZulassen(ByVal e As System.Windows.Forms.KeyPressEventArgs)
    2. 'Eingabe nur für Zahlen zulassen
    3. Select Case Asc(e.KeyChar)
    4. Case 48 To 57, 8, 46 'Zahlen, Backspace und Delete zulassen
    5. Case Else 'alle anderen Eingaben verbieten
    6. e.Handled = True
    7. End Select
    8. End Sub
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    ~blaze~ schrieb:

    vllt. eher
    mal alles ansehen, was der Parameter e und der eine einzige andere Thread im Forum ( :thumbsup: :thumbsup: :thumbsup: ) so bieten.
    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!
    Danke blaze, das war die Lösung :thumbsup: :

    VB.NET-Quellcode

    1. Private Sub frm_hauptform_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
    2. If Not Char.IsControl(e.KeyChar) Then TastaturPuffer.Append(e.KeyChar)
    3. End Sub


    Somit habe ich auch die Groß- und Kleinschreibung berücksichtigt und alle sichtbaren Zeichen können übergeben werden.

    Danke nochmals für die rasche Hilfe.

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

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

    Aufpassen auf Copy&Paste, bspw. damit kann man das umgehen.
    Dazu wäre folgender Lösungsansatz vielleicht geeignet. Halte den SelectionStart-Eintrag in einem Puffer und, sobald eine Änderung vollzogen wird, überprüfe, ob der Text ungültige Zeichen enthält. Entferne diese ggf. und passe SelectionStart entsprechend an:

    VB.NET-Quellcode

    1. Dim selStart As Integer = TextBox.SelectionStart
    2. Dim newText As String = RemoveChars(TextBox.Text, selStart, AddressOf "ungültigeZeichen".Contains)
    3. If newText IsNot Nothing Then
    4. TextBox.Text = newText
    5. TextBox.SelectionStart = selStart
    6. End If

    VB.NET-Quellcode

    1. Shared Function RemoveChars(text As String, ByRef referencePoint As Integer, match As Func(Of Char, Boolean)) As String
    2. If match Is Nothing Then Throw New ArgumentNullException("match")
    3. If text Is Nothing Then Throw New ArgumentNullException("text")
    4. Dim outp As System.Text.StringBuilder
    5. For i As Integer = 0 To text.Length - 1
    6. If match(text(i)) Then 'Chars auslassen, die vom Delegaten abgelehnt werden
    7. If outp Is Nothing Then outp = New System.Text.StringBuilder(text, 0, i, text.Length) 'eine Änderung ist nötig ==> StringBuilder wird dazu verwendet, den neuen String zu konstruieren
    8. If referencePoint <= i Then referencePoint -= 1 'Selektion um 1 nach links verschieben, da 1 Char entfernt wurde
    9. ElseIf outp IsNot Nothing Then
    10. outp.Append(text(i)) 'gültige Chars übernehmen, sofern eine Änderung vollzogen wurde
    11. End If
    12. Next
    13. Return If(outp Is Nothing, Nothing, outp.ToString()) 'den editierten Text oder, sofern keine Änderungen vollzogen wurden, Nothing zurückgeben
    14. End Function

    Kann sein, dass in der Replacement-Funktion ein Fehler drin ist, habe sie nur aus dem Kopf hingeschrieben, das Prinzip sollte aber klar sein (?). Der match-Parameter stellt einen Delegaten bereit, der angibt, ob ein Char ungültig ist. Ungültige chars (==> gibt True zurück) werden entfernt. Statt AddressOf "ungültigeZeichen".Contains kann natürlich auch ein anderer Delegat angegeben werden, wie z.B. AdressOf Char.IsLetter. Das würde dann so aussehen:

    VB.NET-Quellcode

    1. Dim newText As String = RemoveChars(TextBox.Text, selStart, Function(c) Not Char.IsLetter(c))

    bzw. könnte man auch eine Funktion angeben, die genau das invertierte behält, also der Delegat die Chars bereitstellt, die unterstützt werden (einfach nur das Not verwenden):

    Visual Basic-Quellcode

    1. If Not match(text(i)) Then 'Chars behalten, die vom Delegaten nicht gefiltert werden


    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „~blaze~“ () aus folgendem Grund: Einrückung auf Benutzerwunsch hinzugefügt, IsLetter-Beispiel auf Userwunsch eingefügt

    Nein blaze, das ist für mich unbrauchbar - viel zu lang.
    Dein allererster Hinweis passt schon. Und mit der einer Zeile an Code bekomme ich alles was ich möchte.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Was passiert denn, wenn man ungültige Zeichen über Copy & Paste einfügt? Dann enthält die TextBox eben jene, weil sie nicht einzeln über KeyPress eingefügt werden. Damit ist der TextBox-Inhalt falsch und die Funktionalität ausgehebelt. Die Länge eines Codes ist nicht entscheidend, solange sie sinnvoll ist.

    Gruß
    ~blaze~
    Copy & Paste funktioniert über meine Abfragevariante ohnehin nicht, da ich nur KeyPress und KeyUp abfrage, jedoch keine Textbox oder ähnliches.
    Die eine Zeile Code ist daher vollkommen ausreichend.

    Nochmals zur Erinnerung: Die Tastatureingaben aller Elemente auf dem Formular werden in der KeyPress Routine der Form abgefragt. Eingaben von Textboxen etc. werden nicht ausgewertet bzw. gibt es auf der Form keine aktiven Textboxen.

    VB.NET-Quellcode

    1. Private Sub frm_hauptform_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
    2. If Not Char.IsControl(e.KeyChar) Then TastaturPuffer.Append(e.KeyChar)
    3. End Sub


    MyBase.KeyPress
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Ich habe da doch noch eine Frage. Ich komm nicht drauf.

    Ich habe mir einen Button "OK" auf die Form gelegt.
    Wenn ich den Button drücke, dann möchte ich dass frm_hauptform_KeyUp mit dem Keys.Enter aufgerufen wird (also die Enter-Taste simulieren).
    Ich habe keinen Plan, wie ich das Zeichen über KeyEventArgs übergeben soll (Anfänger/Verständnisproblem).
    Gibt es da eine Zeile Code damit der Knoten aufgeht?

    VB.NET-Quellcode

    1. Private Sub frm_hauptform_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
    2. If e.KeyCode <> Keys.Enter Then Exit Sub
    3. '...code hier
    4. End Sub


    VB.NET-Quellcode

    1. Private Sub btn_Ok_Click(sender As Object, e As EventArgs) Handles btn_Ok.Click
    2. SendKeys.Send(Keys.Enter) 'funktioniert nicht
    3. End Sub
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Einfach die AcceptButton-Eigenschaft der Form auf den Button setzen. Aufrufe sollte man in so einem Fall nicht indirekt über SendKeys oder so 'nen Zeug erledigen. Das ist extrem unsauber. Falls das mit AcceptButton nicht das ist, was du möchtest, lege eine eigene Prozedur an und lagere den auszuführenden Code dorthin aus. Diesen rufst du dann von btn_Ok_Click und frm_hauptform_KeyUp direkt auf. Im Normalfall sollte AcceptButton aber ausreichen.

    Gruß
    ~blaze~
    Nein, glaub nicht, dass AcceptButton das ist was ich suche.
    Die Abfrage der Tastatureingaben soll ja ausschließlich über das Form_KeyUp Event laufen.

    Ich möchte diese Funktion direkt aufrufen und dieser den Parameter "Enter-Taste" übergeben.
    Ich hab aber keinen Plan wie ich das machen kann.

    Das Auslagern in eine Prozedur wäre eine Möglichkeit, aber dann wüsste ich immer noch nicht wie man technisch einen Tastendruck an ein Objekt sendet bzw. ein entsprechendes Event auslöst.
    Kann sein, dass ich das auch wo anders noch benötige.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    "Tastendruck" habe ich vielleicht etwas falsch formuliert.
    Ich möchte programmgesteuert das Keypress-Event auslösen und den richtigen char-Wert "Enter / CHR13) mitgeben.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Ich habe es mittlerweile anders gelöst, trotzdem wollte ich wissen, wie das programmtechnisch geht.

    Unter VB6 war das ja noch einfach möglich

    VB.NET-Quellcode

    1. Text1_KeyUp 13, 0
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at