Sonderzeichen verbieten

  • Allgemein

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

    Edit:
    RegisterHotKey = Geht immer ABER man muss jede Taste einzeln registrieren
    GetAsyncKeyState = Geht immer (Systemweit) bei allen Tasten

    Deswegen bin ich ja auch von RegisterHotKey auf GetAsyncKeyState umgesteigen. ;)

    Aber ein kleines Problem ist doch da: Wenn ich auf "Me.Hide" setze, geht es dennoch nicht. Hat jemand eventuell eine Lösung?

    Gruß

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

    RegisterHotKey funktioniert auch direkt auf der Nachrichtenschleife, sofern das Handle = IntPtr.Zero. Der Code unten über den Nachrichtenfilter sollte auch ohne Fokus funktionieren: [VB.NET] Systemweiten Hotkey registrieren (kein Tastatur Hook)
    Im Normalfall wird Polling nicht benötigt, wenn der Architekt keinen Unfug gebaut hat oder es nicht explizit gefodert wird. Es ist immer geschickter, direkt und sofort auf Ereignisse zu reagieren, statt eben zeitgesteuert nach einer Änderung zu fragen.

    Gruß
    ~blaze~

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

    Okay also gehen beide Systemweit nur muss man beim RegisterHotKey alle Tasten, die man braucht, einzeln Registrieren. Nun mein Problem: Wenn ein Programm auf auf Visible = False ist und dann eine Taste gedrückt wird, so reagiert das Programm nicht. Ich hab mal ein neues Projekt aufgestellt, da ging es aber Problem los! Und eig. war alles gleich eingestellt bei den beiden Projekten.

    Hat jemand einen Plan was ich tun könnte?

    Gruß
    Hey Leute,

    Hab jetzt so ziemlich alle Probleme gelöst. Nur noch 2 Probleme sind da, die mich echt belasten.

    1. Wenn ich bei der TextBox zB. "1:2" aus dem Zwischenspeicher Einfüge, steht da letztendlich nur: "12". Wenn ich aber H:A>L<L/O einfüge, steht da nicht: "HALLO" sonder es kommt eine Fehlermeldung. Wenn ich aber: "H:A:L:L:O" einfüge, steht da "HALLO". Heißt im Klartext, wenn ich etwas aus dem Zwischenspeicher einfüge und es 2 oder mehrere verschiedene InvalidChars beinhaltet, so kommt es zur Fehlermeldung.

    2. Wenn ich den ganzen Text, in der TextBoxm markiert habe und dann zB. ein ">" schreibe, verschwindet der ganze Text. Wenn ich eine RichTextBox benutze, habe ich das Problem allerdings nicht. Ich würde gerne das Problem lösen, ohne eine RichTextBox zu benutzen, da ich da wiederum andere Komplikationen auftauchen.

    Ich habe einen Dummi erstellt und diesen hochgeladen. Dieser beinhaltet nur die TextBox mit den Code, den ich für mein Programm benutze.

    Ich hoffe das ihr mir irgendwie weiterhelfen könnt.

    Gruß
    Jowat
    Dateien
    • Fehler.rar

      (36,63 kB, 49 mal heruntergeladen, zuletzt: )

    Jowat schrieb:

    Ich hoffe das ihr mir irgendwie weiterhelfen könnt.
    Was sollen die Settings da in der Schleife?
    Schmeiß die einfach raus.

    VB.NET-Quellcode

    1. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    2. ToolTip1.RemoveAll()
    3. For Each IllegalChar In InvalidChars
    4. If TextBox1.Text.Contains(IllegalChar) Then
    5. 'My.Settings.cursor = TextBox1.SelectionStart - 1
    6. 'My.Settings.Save()
    7. 'My.Settings.Upgrade()
    8. TextBox1.Text = TextBox1.Text.Replace(IllegalChar, "")
    9. 'TextBox1.SelectionStart = My.Settings.cursor
    10. ToolTip1.SetToolTip(TextBox1, "Fehler")
    11. End If
    12. Next
    13. End Sub
    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!
    Andersrum. Nicht jeden illegalen Char überprüfen, sondern jeden Char der TextBox:

    VB.NET-Quellcode

    1. Dim outp As New System.Text.StringBuilder(input.Length - 1)
    2. Dim c As Integer = 0
    3. Dim src As Integer = TextBox1.SelectionStart
    4. For i As Integer = 0 To input.Length - 1
    5. If IsCharValid(input(i)) Then
    6. If i <= src Then
    7. c += 1
    8. End If
    9. outp.Append(input(i))
    10. End If
    11. Next

    du darfst die noch schöner benennen, aber prinzipiell sollte c dann den neuen SelectionStart-Index enthalten. IsCharValid wäre eben eine Funktion, die den Filter angibt.

    Gruß
    ~blaze~
    @RodFromGermany: Ich brauche das, weil ansonsten der Cursor immer wieder zum Stelle 0 springt. Wenn man zb. in der TextBox: TEST steht und dann zwischen E und S das einfügt: "H:H" steht in der TextBox: "TEHHST" aber der Cursor ist an Stelle 0 und nicht an stelle 4 neben dem H.

    @~blaze~: Es ist doch sinnvoller nur die verbotenen Zeichen abzufangen und zu löschen, als jedes einzelne Zeichen abzufragen und dann dort die verbotenen Zeichen zu entfernen.

    Im Klartext: Mein Problem ist das bei der Funktion: "Replace" der Cursor wieder zur Stelle 0 wandert. Und es ist nicht schön, das ganze mit TextChanged zu machen, aber was bleibt mir schon anderes übrig. =(

    Jowat schrieb:

    Ich brauche das, weil ansonsten der Cursor immer wieder zum Stelle 0 springt.
    Merk Dir das in einer lokalen Variable, nicht aber in den Settings.
    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!
    @Jowat: Ich wüsste jetzt nicht, wie man das schöner lösen könnte. Es müssen ja in beiden Fällen für alle Buchstaben aus dem einen alle Buchstaben des anderen durchgegangen werden. Contains + Replace zu kombinieren halte ich übrigens für völligen Nonsense und statt dem My.Settings-Eintrag legst du einfach per Dim <name> As <Typ> eine neue Variable an. My.Settings ist nur dazu da, Werte festzuhalten, die beim nächsten Programmstart immernoch verfügbar sein sollen.

    Gruß
    ~blaze~
    So hab das ganze mal so versucht:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private InvalidChars As String = "<>:""\/|*?"
    3. Dim cursor As Integer
    4. Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    5. If InvalidChars.Contains(e.KeyChar) Then
    6. e.Handled = True
    7. ToolTip1.SetToolTip(TextBox1, "Fehler")
    8. End If
    9. End Sub
    10. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    11. 'cursor = TextBox1.SelectionStart
    12. TextBox1.Text = TextBox1.Text.Replace(InvalidChars, "")
    13. 'ToolTip1.SetToolTip(TextBox1, "Fehler")
    14. 'TextBox1.SelectionStart = cursor
    15. End Sub
    16. End Class



    So Leute, vielen Dank für eure Hilfe. Und ihr habt recht. Es ist wirklich viel sinnvoller das mit einer lokalen Variable zu machen, als es in die Settings zu speichern.
    Und naja, das mit dem Cursor funktioniert logischerweise nicht. Denn ich habe da wohl was nicht beachtet. Sobald das Replace Ereignis stattgefunden hat, geht der Code ja wieder in TextChanged rein, da der Text geändert wurde. Somit wird wieder 0 als Cursor Position abgespeichert und geht auch wider auf Position 0. =(
    Und warum ist es denn nicht gut, wenn man Contains + Replace hat? Weil so habe ich eine If Abfrage und kann dann als Antwort einen ToolTip ausgeben. Hier kann ich keine If Abfrage starten und somit auch keine Chance einen ToolTip anzuzeigen, wenn man einen InvalidChars einfügt. Dazu funktioniert dieses Code nicht: TextBox1.Text = TextBox1.Text.Replace(InvalidChars, "") Aber warum nicht? Wenn ich das InvalidChars zB. durch "A" ersetze, werden alle A's entfernt. Aber dieInvalidChars bleiben.

    Jowat schrieb:

    Hab jetzt so ziemlich alle Probleme gelöst. Nur noch 2 Probleme sind da, die mich echt belasten.

    1. Wenn ich bei der TextBox zB. "1:2" aus dem Zwischenspeicher Einfüge, steht da letztendlich nur: "12". Wenn ich aber H:A>L<L/O einfüge, steht da nicht: "HALLO" sonder es kommt eine Fehlermeldung. Wenn ich aber: "H:A:L:L:O" einfüge, steht da "HALLO". Heißt im Klartext, wenn ich etwas aus dem Zwischenspeicher einfüge und es 2 oder mehrere verschiedene InvalidChars beinhaltet, so kommt es zur Fehlermeldung.

    2. Wenn ich den ganzen Text, in der TextBoxm markiert habe und dann zB. ein ">" schreibe, verschwindet der ganze Text. Wenn ich eine RichTextBox benutze, habe ich das Problem allerdings nicht. Ich würde gerne das Problem lösen, ohne eine RichTextBox zu benutzen, da ich da wiederum andere Komplikationen auftauchen.
    Kurz zusammengefasst: taugt nicht.

    Vlt. probierstes doch nochmal mit dem, was ich dir gebastelt habe (post#69)
    @ErfinderDesRades: Ich finde diesen Code zwar nahe zu Perfekt und weiß auch das es ein viel bessere Methode ist, als die meine. Aber leider geht dieser nicht unter NF2.
    Was Probleme macht ist diese Zeile:

    VB.NET-Quellcode

    1. If txtbox2.Text.Any(AddressOf _InvalidChars.Contains) Then
    Die Fehler liegen bei Any und Contains. Denn ich bekomme diese Fehlermeldungen:

    1. "Contains ist kein Member von "System.Array".
    2. "Any" ist kein Member von "String".

    Ist kein Copy und Paste Fehler, da ich das ganze zuerst bearbeitet übernommen habe, dann 1 zu 1. Aber bei beiden Varianten der gleiche Fehler. Anscheinend unterstütz NF2 das nicht bzw. nicht bei System.Array, weil Contains geht sonst Problemlos.
    Okay ich werde mich mal ran setzen es mal intensiv versuchen, aber wie schaut's aus mit dem Contains? Dieses ist doch schon vorhanden. Warum dann dieser Fehler? Das kann ich irgendwie nicht nachvollziehen. Oder löst sich das Problem automatisch, wenn Any funktioniert?
    so gehts auch in FW2

    VB.NET-Quellcode

    1. Public Class frmPathInput
    2. Private _Storage As New TextboxStorage
    3. Private WithEvents _HandledTextBox As TextBox
    4. Private _InvalidChars As New List(Of Char)(IO.Path.GetInvalidFileNameChars())
    5. Public Sub New()
    6. InitializeComponent()
    7. _HandledTextBox = TextBox1
    8. End Sub
    9. Private Sub _HandledTextBox_KeyUp(sender As Object, e As KeyEventArgs) Handles _HandledTextBox.KeyUp
    10. _Storage.Store(TextBox1)
    11. End Sub
    12. Private Sub _HandledTextBox_TextChanged(sender As Object, e As EventArgs) Handles _HandledTextBox.TextChanged
    13. If Any(TextBox1.Text, AddressOf _InvalidChars.Contains) Then
    14. _HandledTextBox = Nothing
    15. _Storage.Restore(TextBox1)
    16. _HandledTextBox = TextBox1
    17. End If
    18. End Sub
    19. End Class
    20. Public Class TextboxStorage
    21. Private Text As String
    22. Private Start, Length As Integer
    23. Public Sub Store(tb As TextBoxBase)
    24. Text = tb.Text
    25. Start = tb.SelectionStart
    26. Length = tb.SelectionLength
    27. End Sub
    28. Public Sub Restore(tb As TextBoxBase)
    29. tb.Text = Text
    30. tb.Select(Start, Length)
    31. End Sub
    32. End Class
    33. Public Module Helpers
    34. Public Function Any(Of T)(list As IEnumerable(Of T), predicate As Func(Of T, Boolean)) As Boolean
    35. For Each itm In list
    36. If predicate(itm) Then Return True
    37. Next
    38. Return False
    39. End Function
    40. End Module
    41. Public Delegate Function Func(Of T)() As T
    42. Public Delegate Function Func(Of T1, T)(arg1 As t1) As T
    43. Public Delegate Function Func(Of T1, T2, T)(arg1 As t1, arg2 As t2) As T