Textbox: letztes Wort löschen

  • VB.NET

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

    Textbox: letztes Wort löschen

    Hallo,

    ich bin neu hier und hab ne Frage. Ich programmiere an einem Texteditor und will, dass wenn man einen Button drückt, das letzte Wort im Text gelöscht wird. Aber wirklich nur das letzte.

    Nach langer Recherche im internet hab ich diesen Code gefunden:

    VB.NET-Quellcode

    1. If TextBox2.Text.Trim.Length > 0 ThenDim wörter() As String = TextBox2.Text.Trim.Split(" "c)
    2. TextBox2.Text = TextBox2.Text.Remove(wörter.Length - 1)
    3. End If

    Meinen wenigen Kenntnissen nach müsste das auch funktionieren. Aber es wir in fast allen Fällen immer mehr als nur das letzte Wort gelöscht, meist mindestens der halbe Text. Aber ich weis nicht, woran es liegt, denn die Wörter werden richtig unterteilt, wenn ich das letzte Wort ausgeben lasse, gibts keine Probleme.
    Gibts noch andere Möglichkeiten, das letzte Wort im Text zu löschen, egal, aus wie vielen Zeichen es besteht?
    Vielen Dank für jede hilfe im voraus. greenhorn
    Wenn Du wirklich nur das letzte Wort löschen willst, solltest Du auch wirklich nur das letzte Wort sichen, nicht aber alle einzelnen Wörter Deines Textes.
    - Lösche alle angehängten WhiteSpaces (TrimEnd)
    - finde das letzte Wort (LastIndexOf)
    - lösche es (Replace)
    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!
    Sagte Rod doch...
    Dein Code ist einfach nicht Option Strict On *hust*

    Da der Code sowieso schon gepostet wurde, poste ich ihn wenigstens noch Option Strict On:

    VB.NET-Quellcode

    1. Dim DerGanzeText As String = "Das ist ein ganz normaler String."
    2. Dim AlleWörter() As String = DerGanzeText.Trim.Split(CChar(" "))
    3. Dim WortIndex As Integer = AlleWörter.Count - 1
    4. DerGanzeText = DerGanzeText.Replace(AlleWörter(WortIndex), "")
    5. MessageBox.Show("Der neue Text lautet: " & DerGanzeText)


    Mfg Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    Jannik Schüttler schrieb:

    Ja, und wo ist bei dir jetzt der Unterschied außer dass du jeweils noch den Variabelntyp deklarierst und einmal noch CChar davorschreibst.

    Mein Code funktioniert genauso wie deiner. 8-)

    Unterschied?
    Das er OPTION STRICT ON ist!! :cursing:
    = Keine Laufzeitfehler
    = Schöner Code
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Das allerdings ist interessant, aber leicht^^

    So gehts:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim DerGanzeText As String = "Das ist ein ganz normaler" & vbCrLf & "String."
    2. Dim AlleWörter() As String = DerGanzeText.Trim.Split(CChar(vbCrLf))
    3. Dim WortIndex As Integer = AlleWörter.Count - 1
    4. DerGanzeText = DerGanzeText.Replace(AlleWörter(WortIndex), "")
    5. MessageBox.Show("Der neue Text lautet: " & DerGanzeText)


    Mfg Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dancger“ ()

    Soll ich also in Zukuft immer schön die Typen der einzelnen Variabeln deklarieren?

    Ich denke bloß immer, da bei mir keine Fehler und nichts angezeigt werden und auch keine Laufzeitfehler auftreten, dass es ordentlicher und übersichtlicher aussieht, wenn man nicht so viel schreibt. Werde aber in Zukunft daran denken.

    LG Jannik
    Ok, ich bin ja fies. 8-)

    Und vbTab?

    Man muss schon alle möglichen Delimiter testen.
    Oder nach einer Funktion suchen, die alles kann.



    Vielen Dank an alle für die Hilfe. Ich hab den Code von Dancger probiert und es funktioniert wunderbar.


    Glücksache.
    Wie gesagt, die Funktion ist nicht allgemein gültig.
    Um dich auch noch glücklich zu machen ;)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim DerGanzeText As String = "Das ist ein ganz normaler" & vbTab & "String."
    2. DerGanzeText = DerGanzeText.Replace(vbTab, " ")
    3. Dim AlleWörter() As String
    4. If DerGanzeText.Contains(vbCrLf) Then
    5. AlleWörter = DerGanzeText.Trim.Split(CChar(vbCrLf))
    6. Else
    7. AlleWörter = DerGanzeText.Trim.Split(CChar(" "))
    8. End If
    9. Dim WortIndex As Integer = AlleWörter.Count - 1
    10. DerGanzeText = DerGanzeText.Replace(AlleWörter(WortIndex), "").Trim
    11. MessageBox.Show("Der neue Text lautet: """ & DerGanzeText & """")

    Mfg Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Ich müsste mich jetzt auch erst hinsetzen und suchen.
    Aber ich nehme mal an, dass die Regex-Spezialisten eine Idee haben.

    Man müsste erst alle Delimiter gegen Leerzeichen tauschen, und danach
    die erst genannte Funktion verwenden.

    Was gibt es alles an Delimiter?

    vbTab
    Leerzeichen
    CR
    LF
    CRLF

    wie behandelt man einen Trenn/Bindestrich
    und all die Sonderzeichen / ; : etc. ?
    Manche schreiben vielleicht mal einen Text mit einem Komma
    am Ende der Zeile, und der Editor macht einfach einen Umbruch.
    Und die Person schreibt einfach weiter ohne ein Leerzeichen
    einzufügen.

    Kein Wunder, dass Word so teuer ist. :rolleyes:
    Hi
    Besser ists, wenn mans mit Remove macht. Zum Beispiel so:

    VB.NET-Quellcode

    1. Dim text As String = "dies ist ein fieser text mit " & Environment.NewLine & "Zeilenumsprung."
    2. Dim lastNonWhitespaceChar As Integer = text.Length - 1
    3. 'Whitespace-Buchstaben am Ende ueberspringen
    4. While (lastNonWhitespaceChar >= 0 AndAlso Char.IsWhiteSpace(text(lastNonWhitespaceChar)))
    5. lastNonWhitespaceChar -= 1
    6. End While
    7. 'Wenn charStart nicht kleiner als 0 ist, ist das letzte Wort nicht der gesamte String
    8. If lastNonWhitespaceChar >= 0 Then
    9. '10 = carriage return, 9 = tab (glaub ich), 13 = line feed
    10. For i As Integer = lastNonWhitespaceChar - 1 To 0 Step -1
    11. 'Nach Whitespace-Charaktaeren suchen
    12. If Char.IsWhiteSpace(text(i)) Then
    13. 'letztes Wort loeschen
    14. text = text.Remove(i, text.Length - i)
    15. Exit For
    16. End If
    17. Next
    18. Else
    19. text = String.Empty 'Letztes Wort ist einziges Wort im Text
    20. End If
    21. MessageBox.Show(text)


    Übrigens, wenn du mich glücklich machen willst, verwendest du kein Split. Das ist total der Overkill. Das ist, wie wenn man die Anzahl der Auftritte eines bestimmten Buchstabens mit Split messen würde, statt alle Buchstaben mit einer schönen Schleife durchzulaufen.

    Edit: Zusätzlich zu IsWhiteSpace kannst du natürlich noch z.B. IsSymbol einbauen.

    Gruß
    ~blaze~

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

    Hallo Dancger,
    Siehe oben, würde ich sagen ;).
    IsWhiteSpace überprüft auf die Buchstaben mit ASCII-Code 10 (Carriage return), 13 (Line feed), 9 (Tab, glaub zumindest, dass Tab 9 war) und halt das Leerzeichen, wenns nicht noch mehr gibt.
    IsSymbol sollte noch für mögliche Symbole überprüfen, wobei wahrscheinlich IsPunctuation besser gewählt wäre, da das sowohl ';', als auch '.' und ',' auswertet.

    Somit ergibt sich:

    VB.NET-Quellcode

    1. Dim text As String = "dies ist ein fieser text mit " & Environment.NewLine & "Zeilenumsprung."
    2. Dim lastChar As Integer = text.Length - 1
    3. 'Whitespace-Buchstaben und Punkte am Ende ueberspringen
    4. While (lastChar >= 0 AndAlso (Char.IsWhiteSpace(text(lastChar))) OrElse Char.IsPunctuation(text(lastChar)))
    5. lastChar -= 1
    6. End While
    7. 'Wenn charStart nicht kleiner als 0 ist, ist das letzte Wort nicht der gesamte String
    8. If lastChar >= 0 Then
    9. '10 = carriage return, 9 = tab (glaub ich), 13 = line feed
    10. For i As Integer = lastChar - 1 To 0 Step -1
    11. 'Nach Whitespace-Charaktaeren suchen
    12. If (lastChar >= 0 AndAlso (Char.IsWhiteSpace(text(i))) OrElse Char.IsPunctuation(text(i))) Then
    13. 'letztes Wort loeschen
    14. text = text.Remove(i, text.Length - i)
    15. Exit For
    16. End If
    17. Next
    18. Else
    19. text = String.Empty 'Letztes Wort ist einziges Wort im Text
    20. End If
    21. MsgBox(text)


    Hab' oben aus Versehen einmal text.Length statt lastNonWhitespaceChar verwendet.

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ () aus folgendem Grund: c in Dancger doppelt erwischt

    Naja, die Benennung der Variablen sei jetzt mal dahingestellt. ;) Ich hab das jetzt mehr oder weniger schnell hingeschrieben. Ich hab normalerweise kein Problem mit kleinen Unsauberkeiten, aber Split ist eingentlich ein echtes Unding, wenns nicht wirklich benötigt wird. Da das Resultat n Einträge lang ist, werden auch n Strings im Speicher abgelegt. Die werden später aber gar nicht benötigt, sondern zum Beispiel bei der Messung der Buchstabenhäufigkeit wird nur das n selbst benötigt. Da gehts schneller, wenn man die Suche direkt als Schleife gestaltet und halt jeden Buchstaben des Strings durchgeht und überprüft, ob das dem gesuchten Buchstaben entspricht.

    Gruß
    ~blaze~
    Gute Idee ~blaze~ mit den Char Methoden.
    Auch dass du nicht den ganzen Text splittest ist natürlich sinnvoll.

    Habe grade mal geschaut, da gibt es eine spezielle

    Char.IsSeparator-Methode

    Möglicherweise ist diese ja ausreichend.

    ...Nein, Steuerzeichen muss man wohl extra behandeln.
    Also sozusagen besetzt ein Split die Anzahl der Werte (n) [z.B. 8 Ergebnisse = 8 * SpeicherplatzWert]?

    Also irgendwie tönt das logisch, mit einer Schleife pickt man ja nur den Wert heruas, denn man benötigt.

    Aber gibts da nicht sowas wie Redim?
    Oder wieso kommt mir das gerade in den Kopf..

    Mfg Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...