Wie löscht man Text in der Textbox per Befehl wie mit der Entf-Taste?

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Nixsager.

    Wie löscht man Text in der Textbox per Befehl wie mit der Entf-Taste?

    Hi

    Wie löscht man Text in der Textbox per Befehl wie mit der Entf-Taste?

    Vorher hatte ich das folgerndermaßen gelöst:

    VB.NET-Quellcode

    1. If Textbox.SelectionLength > 0 Then
    2. Textbox.SelectedText = ""
    3. Else
    4. Textbox.SelectionLength = 1
    5. Textbox.SelectedText = ""
    6. End If

    Nur leider ist SelectedText nicht per Undo rückgängig zu machen.

    Gruß vom Nixsager
    Wie löscht man Text in der Textbox per Befehl wie mit der Entf-Taste?
    Hohl dir das KeyPressed Event und überprüf ob es die Entf-Taste war, wenn ja -> Löschen.

    Nur leider ist SelectedText nicht per Undo rückgängig zu machen.
    Speicher den SelectedText eben ab?
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Ich glaube du hast mich nicht verstanden.

    Wenn ich in der TextBox die Entf-Taste drück wird das Zeichen rechts neben dem Cursor gelösch und ist Text markiert wurden, wird ja dieser gelöscht.

    Und dies Funktion will ich per Befel nutzen, so wie bei dem Windows-Editor im Bearbeiten-Menü, nur das dort der ausgewählte Text gelöscht wird.
    Das heißt, du willst einfach einen Menüpunkt: Ausgewählen Text löschen?
    Wenn ja:

    Gather schrieb:

    Nur leider ist SelectedText nicht per Undo rückgängig zu machen.
    Speicher den SelectedText eben davor ab? Also Zwischenspeichern
    Wenn du den selected Text dann noch raussplittest, sollte das dein Problem lösen.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Zwischenspeicher einmal deinen Selected Text,
    und dann, wie du es schon gesagt hast mach:

    VB.NET-Quellcode

    1. TextBox1.SelectedText = ""


    Sollte eigentlich so funktionieren.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Wie du an meinen ersten Post sehen kannst, hatte ich das so gemacht.

    Aber 1. kann ich Undo nicht anwende, und 2.will ich diese Funktion über einen Knopf oder Menü aufrufen können und es soll TextBox.Undo-Fähig sein.

    Sonst bräuchte ich ein Routine der überprüft wie der Text gelöscht wurde, und erst dann den TextBox.Undo-Befehl aufruft oder den Zwischengespeicherten Text wieder einfügt.
    Nur leider ist SelectedText nicht per Undo rückgängig zu machen.
    Speicher den SelectedText eben davor ab? Also Zwischenspeichern

    VB.NET-Quellcode

    1. Dim LastUndo As String
    2. 'Das ganze ist relativ schlicht, da es auf die schnelle gemacht worden ist.
    3. Private Sub ButtonRemove_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. LastUndo = RichTextBox1.Text
    5. RichTextBox1.SelectedText = ""
    6. End Sub
    7. Private Sub ButtonUndo_Click(sender As Object, e As EventArgs) Handles Button2.Click
    8. RichTextBox1.Text = LastUndo
    9. End Sub

    Ich bin grad eigentlich im Zeitdruck. Aber das sollte auf die schnelle funktionieren.
    Wenn das zu unschön ist, bitte korregiert mich.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Nicht hetzen!
    Ich habe Zeit.:D

    Also wenn ich es richtig verstehe, umgehst(ignorierst du den TextBox.Undo-Befehl, und schafft einen eigenen?

    Ist auch einen Lösung.
    Aber bei dieser Lösung muss man noch die Cursor-Position und den Text in eine globale (weiß nicht ob das richtig ist) speichern.

    Wie gesagt, ich glaube man braucht nocht ein Routine zum vergleich des welcher Undo-Befehl genutzt wird.

    Also irgendwie verfranse ich mich gerade.
    Ich versuche mal dein Lösung anzupasse und poste sie dann hier.
    Ich habe mal meine Code angepasst und deine Idee übernommen.

    VB.NET-Quellcode

    1. Case "Delete"
    2. If Textbox.SelectionLength > 0 Then
    3. UndoText = TextBox.Text
    4. UndoCursorPos = TextBox.SelectionStart
    5. TextBox.SelectedText = ""
    6. Else
    7. UndoText = TextBox.Text
    8. UndoCursorPos = TextBox.SelectionStart
    9. TextBox.SelectionLength = 1
    10. Textbox.SelectedText = ""
    11. End If
    12. Case "Undo"
    13. If UndoText = "" Then
    14. TextBox.Undo()
    15. Else
    16. TextBox.Text = UndoText
    17. UndoText = ""
    18. TextBox.SelectionStart = UndoCursorPos
    19. UndoCursorPos = 0
    20. MainTab_TextBox.ScrollToCaret()
    21. UndoUse = 1
    22. End If

    Die Variabeln UndoText und UndoCursorPos habe ich global im dem Formular gesetzt (Wie heßt das richtig?).
    Aber trotzdem bin ich nicht zufrieden.
    Wenn man mehrmal den Undo-Befehl aufruft, wechselt er zwischen dem alten und neuem Zustand.
    Dafür müsste ich den Text zusätzlich zwischenspeichern.
    Schon ein bisschen danach gegoogelt?
    Wie gesagt eig. "lern" ich nebenbei und hab wenig zeit, jedoch morgen oder so kann ich dir da weiterhelfen.

    Wenn bis dahin dein Problem nochnicht gelöst worden ist.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Nixsager schrieb:

    VB.NET-Quellcode

    1. Case "Delete"
    2. Case "Undo"
    Das schreit aber nach einem Enum.
    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!

    VB.NET-Quellcode

    1. Public Enum Action As Integer
    2. Delete = 1
    3. Undo = 2
    4. End Enum
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Nixsager schrieb:

    Wiese Enume?
    Ist Case jetzt etwas nicht .NET-Konform?
    In einem Case einen String zu untersuchen ist extrem inperformant und aufgrund der Case-sensitivity fehleranfällig.
    Ein Enum ist da einfach elegant.
    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!

    Nixsager schrieb:

    Also wenn ich es richtig verstehe, umgehst(ignorierst du den TextBox.Undo-Befehl, und schafft einen eigenen?
    Jo, so habichs auch mal gemacht, in c#, und war sehr anspruchsvoll. Ich musste einen Stack schreiben, auf dem man Kommandos ablegen konnte, das DeleteKeyCommand war nur eines - hinzu kamen BackKeyCommand, TypeTextCommand und weitere, speziellere.
    Son Command besteht intern aus 2 Kommandos, nämlich der eiglichen Ausführung, und ihrer Rückgängigmachung. Die User-Eingaben werden dann überwacht, und entsprechende Commands generiert und auf den Stack gepackt, mit denen sich eine solche User-Eingabe reproduzieren/rückgängig machen liesse.
    Das ist übrigens einer der beiden Pattern, mit denen Undo realisiert wird: entweder Command- oder Memento-Pattern.

    Jedenfalls als ich anfing mit dem Theater, war ich ziemlich enttäuscht von Richtextbox, dass die zwar Undo-Funktionalität beinhaltet, aber leider nix vorgesehen scheint, dass man diese Undo-Funktionalität auch codeseitig nutzen kann.
    Also von VB bin ich entäuscht.
    VB ist nicht VB, und ich muss jetzt das bisschen was ich kann umlernen.

    Und dabei programmiere nur ab und zu, und wenn ich mal wieder was schreibe, habe ich das meiste wieder vergessen.

    @RodFromGermany
    Mit Enum meinst du wohl die Optionen die man bei den Befehlen auswählen kann.
    Das hatte ich mal bei VB5 Control Creation Edition genutzt, aber wie das jetzt läuft, davon habe ich nur eine Ahnung.
    Aber das mit der Groß/kleinschreibung kann man ja umgehen Mit dem ToLower-Befehl.
    Aber da das Programm ja nur für mich einen nutzen hat, ist es ja egal.
    Posten darf ich es ja nicht.