Sonderzeichen verbieten

  • Allgemein

Es gibt 189 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Nein:

    VB.NET-Quellcode

    1. Array.IndexOf(dasArray, dasZuSuchendeElement)

    Der Index i ist normal eine positive Zahl, das i-te Element anspricht. IndexOf ermittelt eben den Index des Eintrags, dessen Wert dem rechten Teil entspricht. Wenn kein Element gefunden wird, wird -1 zurückgegeben. Daher ist <> -1 eine Abfrage auf Existenz.

    Gruß
    ~blaze~
    @Jowat: Findest Du's nicht ein bisschen Sinnfrei, e.Handled zweimal zuzuweisen?

    Array.IndexOf(<ZuDurchsuchendesArray>, <ZuSuchenderWert>) ist die korrekte Methode.
    Da <ZuDurchsuchendesArray> ein Char-Array ist, muss <ZuSuchenderWert> ein Char sein.

    (Nebenbei: "1" ist kein Char, sondern ein String mit der Länge 1.)


    Edit: Jo, wie ~blaze~ geschrieben hat.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Verstehst du folgenden Code besser?

    VB.NET-Quellcode

    1. Public Shared Function IndexOf(ByVal array() As Char, value As Char) As Integer
    2. For i As Integer = 0 To Array.Length -1 'von 0 bis Array-Laenge hochzaehlen
    3. If array(i) = value Then Return i 'und das Array am Index i mit value vergleichen. Wenn gleich, den Index zurueckgeben
    4. Next
    5. Return -1 'das Element war nicht im Array enthalten
    6. End Function

    Genau das tut Array.IndexOf - nur halt für beliebige eindimensionale Arrays.

    Gruß
    ~blaze~
    @Jowat:
    Zu e.Handled:

    Du setzt es zwei mal.
    Beim ersten Mal verwendest Du die Static-Variable.
    Beim zweiten Mal verwendest Du die Variable "Flag", welche eine Zeile vorher direkt von System.IO.Path.GetInvalidFileNameChars kommt.

    Im Endeffekt kommt das Selbe raus. Entscheide Dich für eins von beiden.
    Ich würde da auf ~blaze~ hören und die Lösung mit der Static-Variable verwenden.


    Edit:
    Lass uns das Ganze etwas übersichtlicher gestalten:
    Wir lagern das Prüfen auf ein ungültiges Zeichen in eine eigene Funktion aus.

    VB.NET-Quellcode

    1. Private Function IsInvalidChar(CheckChar As Char) As Boolean
    2. Static InvalidChars As Char() = System.IO.....
    3. Return Not Char..... AndAlso .....
    4. End Function
    (Ich lass Dich mal den Rest selbst einfügen.)

    Das bedeutet, dass die KeyPress-Sub schlanker wird:

    VB.NET-Quellcode

    1. Dim Flag = IsInvalidChar(e.KeyChar)
    2. e.Handled = Flag
    3. If Flag Then
    4. '...
    5. Else
    6. '...
    7. End If


    Ich denke, dadurch sollte besser klar sein, was wofür zuständig ist.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Also gut, ich hab das ganze jetzt so gemacht:

    VB.NET-Quellcode

    1. Public Shared Function IndexOf(ByVal array() As Char, value As Char) As Integer
    2. For i As Integer = 0 To array.Length - 1
    3. If array(i) = value Then Return i
    4. Next
    5. Return -1
    6. End Function
    7. Private Function IsInvalidChar(CheckChar As Char) As Boolean
    8. Static InvalidChars() As Char = System.IO.Path.GetInvalidFileNameChars
    9. Return Not Char.IsControl(e.KeyChar) AndAlso InvalidChars.IndexOf(InvalidChars, "a") <> -1
    10. End Function
    11. Private Sub CheckImportantKeyDown(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    12. Dim Flag = IsInvalidChar(e.KeyChar)
    13. e.Handled = Flag
    14. If Flag Then
    15. ToolTip1.SetToolTip(TextBox1, "Ungültiges Zeichen")
    16. Else
    17. ToolTip1.RemoveAll()
    18. End If
    19. End Sub


    Jedoch steht das e nicht deklariert wurde. Als was soll ich es denn deklarieren. "e" gehört doch zu KeyDown oder?

    Ansonsten sollte der Buchstabe a jetzt gesperrt sein oder?

    Jowat schrieb:

    Jedoch steht das e nicht deklariert wurde.
    Grundlagen.
    Du übergibst e.KeyChar an Deine Routine, dort wird ein Parameter namens CheckChar empfangen.
    Wenn Du "<", ">" eingibst, kommt das durch.
    Lies Dir lieber mal die Beiträge von Leuten durch, die Dir richtigen Code gepostet haben.
    Und wenn Du saxchon was zusammensetzt, teste das.
    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 denke, es hat hier wenig Sinn, an dieser Stelle weiterzumachen.

    @Jowat:
    Es ist ein gewisses Grundlagenwissen vonnöten, damit Du verstehen kannst, was wir Dir sagen.
    Du hast im Code in Post #47 so viele Dinge, die ich mit Worten nicht beschreiben kann drin, dass offensichtlich ist, dass Dir dieses Grundlagenwissen fehlt.
    Beispiele:
    • InvalidChars.IndexOf(InvalidChars, ...) -> Post #39
    • "a" -> Post #43 (Nebenbei möchtest Du doch wissen, ob das zu prüfende Zeichen verboten ist, und nicht, ob "a"c verboten ist)
    • Public Shared Function IndexOf(ByVal array() As Char, value As Char) As Integer -> Wenn es Dir hilft, diese Funktion zu verwenden, dann verwende sie, aber Du verwendest Sie im Code nirgends.
    • Oder wie Du selbst erwähnt hast: e.KeyChar ist nicht vorhanden. Ist auch klar. In der Funktion IsInvalidChar gibt's den Parameter CheckChar. Den musst Du verwenden.


    Ich würde Dir an dieser Stelle zu Herzen legen, ein Buch zu lesen. Da lernst Du das, was Du wissen musst.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hey,

    Also ich dachte jetzt das ich den Code ändern sollte weil VB die Ungültigen Zeichen schon kennt!

    VB.NET-Quellcode

    1. Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    2. Static InvalidChars() As Char = System.IO.Path.GetInvalidFileNameChars
    3. If TextBox1.Text.Contains(InvalidChars) Then MsgBox("Fehler")
    4. End Sub


    Müsste dann dieser Code nicht funktionieren?
    In InvalidChars sind doch jetzt die ungültigen Zeichen. Und wenn die TextBox eines der Zeichen enthält soll die MessageBox erscheinen. Denn wenn ich die verbotenen Zeichen sowieso auflisten muss, kann ich es ja auch so machen:

    VB.NET-Quellcode

    1. Private InvalidChars as String="/><etc..."
    2. Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    3. If InvalidChars.Contains(e.KeyChar) Then
    4. e.Handled = True
    5. End If
    6. End Sub


    Und ja ich bin noch ein ziemlicher Anfänger. Ich habe früher auch Teile aus dem Buch C# - Galileo OpenBook gelesen. Jedoch habe ich da noch mit C# programmiert.
    Nein, Contains arbeitet auf Strings, nicht auf Char-Array. War das nicht eine explizite Typumwandlung mit CType, um von Char-Array auf String zu kommen? Wenn ja, hast du Option Strict an?

    Der 2. Code ist genau das, was funktionieren sollte. Ob es jetzt ein String oder ein Char-Array ist, ist letztendlich egal, aber es gibt trotzdem Unterschiede zwischen den beiden, insbesondere, da GetInvalidFileNameChars ein Char-Array zurückgibt, keinen String.

    Gruß
    ~blaze~

    Jowat schrieb:

    Also ich dachte jetzt das ich den Code ändern sollte
    Du allein entscheidest, was in Dein Programm geschrieben wird.
    Hier bekommst Du Hinweise, was ggf. falsch und was ggf. richtig ist.
    Du musst natürlich selbst herausfinden, was für Dich gut ist und was nicht, was allerdings bei so vielen unterschiedlichen Meinungen nicht immer einfach ist.
    Und nicht jeder, der hier einen Post anhängt, hat Dein Problem voll durchstiegen.
    Das rauszukriegen liegt allerdings bei Dir.
    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!
    Okay. Aber an die Leute die diese Methode nicht gut finden: Was genau spricht denn gegen den Code? Der ist leicht zu verstehen und funktioniert und ist sogar sehr kurz. Denn so müsste ich nur noch was gegen das Einfügen durch STRG und V von den illegalen Zeichen tun. Da würde ich es dann so machen, dass wenn jemand STRG und V drückt soll der Text im Arbeitsspeicher gelesen werden und wenn dieser ein verbotenes Zeichen enthält, sollten diese Zeichen entfernt werden.

    Hier nochmal der Code:

    VB.NET-Quellcode

    1. Private InvalidChars As String = "<>:""\/|*?"
    2. Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    3. If InvalidChars.Contains(e.KeyChar) Then
    4. e.Handled = True
    5. ToolTip1.SetToolTip(TextBox1, "Fehler")
    6. End If
    7. End Sub
    Das KeyPress-Event ist suboptimal.
    Tastendrücke (einzelne Zeichen) werden bei KeyDown abgefangen, C&P in TextChanged (ganze Texte).
    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!
    Hmm also ist der Code scheiße und es wäre besser wenn ich das mit KeyDown mache? Aber da geht es doch schlecht mit KeyDown. Da kriege ich ja nämlich nur die Codes der einzelnen Tasten. Das wäre doch umständlicher oder etwa nicht?
    Ich verweise an dieser Stelle nochmal auf Post #49

    Um im TextChanged-EventHandler den Text der TextBox zu ändern, muss man wissen, was Events sind. Man muss wissen, wie man Events abboniert und deabboniert.
    Und man sollte nebenbei auch wissen, was eine rekursion ist, und warum dabe eine StackOverflowException auftritt.

    Das sind wieder Dinge, die sich nicht einfach mal so erklären lassen. Zumindest nicht so, dass Du das auch wirklich verstehst.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich würde ja ehrlich gesagt eher beim TextChanged-, Validating- oder Validated-Event abfragen, ob die Eingabe gültig war und entsprechende Gegenmaßnahmen einleiten.
    Eine mögliche Reaktion auf TextChanged wäre bei mir z.B. Button.Enabled = False, Validating wäre, den Fokus in der TextBox zu behalten. Bei Validating/Validated könnte man dann eben einen ToolTip anzeigen oder einen ErrorProvider (vmtl. aber eher ersteres).

    Gruß
    ~blaze~
    Also mit Events kenn ich mich schon ein wenig aus. Das ist in etwa so:
    Wenn etwas passiert werde ich darüber berichtet wenn ich es abonniert habe ansonsten nicht. So überprüfe ich ja auch bei KeyDown/KeyPress ob etwas gedrückt wurde
    So ich hab das jetzt einfach so gemacht, da hier alle 3 Möglichkeiten behandelt werden:

    1. Das drücken von Verbotenen Zeichen
    2. Das einfügen per Rechtsklick von Verbotenen Zeichen
    3. Das einfügen per STRG und V von verbotenen Zeichen:

    VB.NET-Quellcode

    1. Private InvalidChars As String = "<>:""\/|*?"
    2. Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    3. If InvalidChars.Contains(e.KeyChar) Then
    4. e.Handled = True
    5. ToolTip1.SetToolTip(TextBox1, "Ungültiges Zeichen")
    6. End If
    7. End Sub
    8. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    9. For Each IllegalChar In InvalidChars
    10. If TextBox1.Text.Contains(IllegalChar) Then
    11. TextBox1.Text = TextBox1.Text.Replace(IllegalChar, "")
    12. ToolTip1.SetToolTip(TextBox1, "Ungültiges Zeichen")
    13. End If
    14. Next
    15. End Sub


    Dazu ist der Code sehr kurz und funktioniert sehr gut. Ich weiß auch das es nicht der beste ist, aber nun gut. Ich hätte dazu aber noch drei kleine Fragen:

    1. Wenn ich ein verbotenes Zeichen eintrage per STRG und V geht der (ich sag mal blinkender Strich) zurück. Wie mache ich das, das es weiterhin dort bleibt wo er war?
    2. Wenn der ganze Text markiert ist und ich dann ein verbotenes Zeichen eintrage per STRG und V, wird dann der ganze Text entfernt. Ist es möglich das der Text dann nicht entfernt wird OHNE den ganzen Code zu ändern?
    3. Der TooTip funktioniert nicht. Nur selten wird er mal angezeigt. Woran liegt das?

    Über Hilfe würde ich mich Freuen.
    1. Speichere die Position des Cursors und setze sie anschließend wieder mit dem Index des Strings.

    VB.NET-Quellcode

    1. Dim pos As Integer = Cursor.Positon
    2. 'Danach:
    3. TextBox1.SelectionStart = pos

    2. Mit ner RTB ;)
    3. Geht nur wenn die TextBox nicht fokusiert ist.

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