Results 1 to 8 of 8

vba.net Buchstaben und Umlaute erlauben

  1. #1 Reply With Quote
    Ritter
    Join Date
    May 2009
    Location
    C:/
    Posts
    1,463
    Hallo zusammen,

    ich habe folgendes Problem.
    Ich möchte einer Textbox nur Buchstaben und Umlaute erlauben. Wie ich die Buchstaben erlaube habe ich bereits rausgefunden. Nur klappt es bei mir einfach nicht mit den Umlauten.

    hier der Code bisher: (Nur Buchstaben)

    Code:
     Private Sub txtMitName_KeyDown(sender As Object, e As KeyEventArgs) Handles txtMitName.KeyDown
    
    
            'Erlaubt txtMitname nur Buchstaben
            If Not ((e.KeyValue >= 65 AndAlso e.KeyValue <= 90) OrElse
                (e.KeyCode = Keys.Back OrElse e.KeyCode = Keys.Left OrElse e.KeyCode = Keys.Right OrElse e.KeyCode = Keys.Space OrElse
                 e.KeyCode = Keys.Delete)) Then
                e.SuppressKeyPress = True
            End If


    Hier wäre mein Vorschlag mit Umlauten:

    Code:
    Private Sub txtMitName_KeyDown(sender As Object, e As KeyEventArgs) Handles txtMitName.KeyDown
    
    
            'Erlaubt txtMitname nur Buchstaben
            If Not ((e.KeyValue >= 65 AndAlso e.KeyValue <= 90 AndAlso e.KeyValue = 220) OrElse
                (e.KeyCode = Keys.Back OrElse e.KeyCode = Keys.Left OrElse e.KeyCode = Keys.Right OrElse e.KeyCode = Keys.Space OrElse
                 e.KeyCode = Keys.Delete)) Then
                e.SuppressKeyPress = True
    
    
    
            End If
    220 ist soweit ich weiß der AscII code für Ü.
    Hier die Tabelle:

    Code:
    ä - 228
    ö - 246
    ü - 252
    Ä - 196
    Ö - 214
    Ü - 220

    Wo ist mein Fehler? anstatt AndAlso habe ich auch schon or oder And probiert...
    Quote Originally Posted by Hawke View Post
    ich glaube...dem vorschlag eines users zu urteilen...das ich wirklich der perfekte banger bin...
    Xerotar is offline

  2. #2 Reply With Quote
    Tieftöner  Lookbehind's Avatar
    Join Date
    Dec 2007
    Posts
    14,487
    Vielleicht solltest du statt ASCII auf utf8, oder einen ähnlichen erweiterten Zeichensatz.

    Andererseits frage ich mich, was für eine Art Anwendung du da schreibst, dass du die Zeichen schon beim Tastendruck auswerten möchtest, und dabei auf die verwendeten Zeichen achtest. Irgendwie hab ich das Gefühl, dass da schon konzeptionell was nicht stimmt.

    Edit: Ach ja, statt den Dezimal-Werten kannst du übrigens auch Literale verwenden.
    Lookbehind is offline

  3. #3 Reply With Quote
    Ritter
    Join Date
    May 2009
    Location
    C:/
    Posts
    1,463
    Quote Originally Posted by Lookbehind View Post
    Vielleicht solltest du statt ASCII auf utf8, oder einen ähnlichen erweiterten Zeichensatz.

    Andererseits frage ich mich, was für eine Art Anwendung du da schreibst, dass du die Zeichen schon beim Tastendruck auswerten möchtest, und dabei auf die verwendeten Zeichen achtest. Irgendwie hab ich das Gefühl, dass da schon konzeptionell was nicht stimmt.

    Edit: Ach ja, statt den Dezimal-Werten kannst du übrigens auch Literale verwenden.
    Der Punkt ist halt, dass ich mäßig Ahnung davon habe. Afaik könnte ich das ganze ja auch bei KeyPress coden, und hätte quasi den selben Effekt. Liege ich da richtig?

    meinst du mit den Literalen Oem7 222 - ä etc.?
    Quote Originally Posted by Hawke View Post
    ich glaube...dem vorschlag eines users zu urteilen...das ich wirklich der perfekte banger bin...
    Xerotar is offline

  4. #4 Reply With Quote
    Tieftöner  Lookbehind's Avatar
    Join Date
    Dec 2007
    Posts
    14,487
    Quote Originally Posted by Xerotar View Post
    Der Punkt ist halt, dass ich mäßig Ahnung davon habe. Afaik könnte ich das ganze ja auch bei KeyPress coden, und hätte quasi den selben Effekt. Liege ich da richtig?
    Möglich. Aber eigentlich habe ich eher das Gefühl, dass es unnötig kompliziert ist, für jeden Tastendruck die verwendbaren Zeichen zu filtern. Wofür brauchst du sowas?
    Quote Originally Posted by Xerotar View Post
    meinst du mit den Literalen Oem7 222 - ä etc.?
    Ich meine, dass du statt auf >= 65 auch auf >= 'A' prüfen kannst.
    Lookbehind is offline

  5. #5 Reply With Quote
    Ritter
    Join Date
    May 2009
    Location
    C:/
    Posts
    1,463
    Quote Originally Posted by Lookbehind View Post
    Möglich. Aber eigentlich habe ich eher das Gefühl, dass es unnötig kompliziert ist, für jeden Tastendruck die verwendbaren Zeichen zu filtern. Wofür brauchst du sowas?

    Ich meine, dass du statt auf >= 65 auch auf >= 'A' prüfen kannst.
    Möchte es halt direkt verhindern, dass bei der Neuanlage oder Bearbeitung eines Kunden z.B. im Namensfeld eine Zahl eingegeben werden kann. Weil dort halt keine Zahl stehen sollte. Ich könnte halt jedes mal ne Fehlermeldung coden, aber das sehe ich als mehr Aufwand an, bzw als fehleranfälliger.
    Quote Originally Posted by Hawke View Post
    ich glaube...dem vorschlag eines users zu urteilen...das ich wirklich der perfekte banger bin...
    Xerotar is offline

  6. #6 Reply With Quote
    Lucky 7 Sumpfkrautjunkie's Avatar
    Join Date
    Nov 2004
    Location
    München
    Posts
    7,777
    Quote Originally Posted by Xerotar View Post
    Möchte es halt direkt verhindern, dass bei der Neuanlage oder Bearbeitung eines Kunden z.B. im Namensfeld eine Zahl eingegeben werden kann. Weil dort halt keine Zahl stehen sollte. Ich könnte halt jedes mal ne Fehlermeldung coden, aber das sehe ich als mehr Aufwand an, bzw als fehleranfälliger.
    Für Eingabenvalidierung schau dir mal Regex an:
    https://www.codeguru.com/columns/vb/...ith-vb.net.htm

    Validiere nicht jeden Tastendruck, sondern den String. Das ist wesentlich einfacher und du musst nicht 100e if/else bauen
    Nur Werte, die durch die Validierung positiv gehen, speicherst du dann in deinem Datenmodell, ansonsten machst du den Fehler irgendwie kenntlich (z.B. irgendwas rot färben)
    Sumpfkrautjunkie is offline

  7. #7 Reply With Quote
    Tieftöner  Lookbehind's Avatar
    Join Date
    Dec 2007
    Posts
    14,487
    Was Sumpfi sagt.

    Außerdem, sei nicht zu restriktiv mit den verwendeten Zeichen. Da gibts mehr als nur die klassischen 26 Buchstaben und deutsche Umlaute. Französische Namen enthalten z.B. oft Aktzent-Zeichen. Es gibt Doppelnamen mit Bindestrich. ... Die Welt ist da einfach noch einiges größer.
    Lookbehind is offline

  8. #8 Reply With Quote
    Forschungsreisender  jabu's Avatar
    Join Date
    Jul 2011
    Posts
    4,764
    Dein Vorgehen bringt Unheil, denn die Beziehung zwischen Tastendruck und Buchstabe ist nicht eineindeutig.

    Key-Codes sind keine Buchstaben, auch kein ASCII und stehen auch nicht für solches. Key-Codes stehen für Keys, weiter nichts. Dass ganze Key-Events komplexer als Keys sind, hast du vielleicht schon entdeckt. Windows wertet nicht nur die Keys aus, sondern den ganzen Event (intern eine Message, die weitere Informationen enthalten kann). Und nicht mal das genügt, um daraus ein Zeichen abzuleiten. Manche Zeichen lassen sich erst über Kombinationen aus mehreren Events ableiten. Bei [Alt]+Ziffernblock (hier Näheres dazu) ist das offensichtlich.

    Um ein Zeichen aus Tastatureingaben zu bestimmen, ist also ein komplexer Übersetzungsvorgang nötig, für den das Betriebssystem zuständig ist. Den kannst du nicht mal so eben nachbilden. Manche Zeichen gibt man über zwei Tasten ein, die man nacheinander drückt. Dafür kann es keinen Key-Code geben. Bei mir ergibt [Alt]+[´] und danach [e] das Zeichen é, wie im Namen André. Auch mit [Alt]+130(Nummernblock) erhalte ich é. Und ich kann das Zeichen aus der Zwischenablage einfügen lassen.
    Die Nummern-Tasten des Nummernblocks ergeben andere Key-Codes als die anderen Nummerntasten. Es geht auf dieser niederen Ebene noch um Tasten, nicht um Zeichen! Man kann Nummern natürlich auch anders eingeben.

    Mit ASCII bist du auch auf dem Holzweg. Du hast nur Glück, dass die Key-Codes praktischerweise eine große Überschneidung mit ASCII haben. Deutsche Umlaute kommen jedoch in ASCII gar nicht vor, denn ASCII umfasst nur 7 Bit, nicht 8. Wenn du sagst, Ü entspräche 220, dann handelt es sich um eine Repräsentation durch eine Erweiterung von ASCII, z.B. als ISO-8859-1. Unter Windows ist es üblich, per Codepages unterschiedliche Zeichensätze zu handhaben. Und ganz grundsätzlich gibt es unterschiedliche Tastaturlayouts, wobei jedoch die Key-Codes dieselben bleiben, da es sich, wie gesagt, um eine niedere Ebene (low level) handelt, die vom Betriebssystem erst ausgewertet werden muss.

    Nun solltest du einen groben Überblick darüber erhalten haben, wie vielfältig die Kombinationsmöglichkeiten sind (und warum Sumpfkrautjunkie 100e if/else schrieb). Sie sind praktisch unbeherrschbar, wenn die Lösung wasserdicht sein soll, zumal etwas hinzukommen kann, was bei Erstellung des Programms nicht vorausgeahnt werden konnte. Mit dem Ansatz kann man also nur verlieren.

    Falls du verlieren willst, kannst du z.B. die Taste für Ü speziell bei einem deutschen Tastaturlayout detektieren. Eine Auflistung gibt es hier. Die Konstante Oem1 könnte passen (siehe hier), aber selber habe ich das nicht probiert. Bei ß müsstest du noch andere Tasten abfangen, damit sich weder '?' noch '\' ergibt. Was machst du bei Caps Lock und ß? Das müsstest du auch noch detektieren, wenn du kein '?' haben willst. Schon bei solchen Kleinigkeiten wird es umständlich.

    Im Endeffekt führt das alles nur ins Verderben, zumal dir die damit verschwendete Zeit bei den gescheiten Lösungen fehlt. Gescheit wäre z.B., den Benutzer alle Zeichen eingeben zu lassen, ihm dann aber in Zweifelsfällen eine Korrekturoption anzubieten. Nur in ganz klaren Fällen (deutsche PLZ) würde ich ein Schema erzwingen, aber eben auch erst nach der Auswertung. Falls du Firmennamen nicht getrennt verwaltest, ergibt ein Ausschluss von Ziffern sowie von einigen Sonderzeichen sowieso keinen Sinn. Firmennamen kann man nicht einfach abändern, denn wenn sie in Rechnungen nicht stimmen, kann u.U. der Vorsteuerabzug gefährdet sein, was derbe Verluste bedeuten kann. Der Rechnungsersteller muss auf Anforderung des Rechnungsempfängers eine korrigierte Rechnung erstellen. Schlampereien gehen dort also gar nicht. Bei Namen von natürlichen Personen (nicht jur. Personen, z.B. Firmen, Vereine, Körperschaften) wäre zumindest ein abschließender Test auf Ziffern mit entsprechendem Hinweis sinnvoll, da gehe ich mit. Kategorisch ausschließen würde ich Ziffern dennoch nicht. Man weiß ja nicht, was ausländische Standesämter bereits jetzt erlauben oder irgendwann mal erlaubt haben oder was Standesämter irgendwann erlauben werden (nur mal angenommen, R2-D2 ).
    jabu is offline Last edited by jabu; 15.09.2018 at 04:08.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •