RichTextBox Autovervollständigung

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von QuatschMitSooS.

    RichTextBox Autovervollständigung

    Hey Leute, bin heute schon den ganzen Tag auf der suche nach einer Lösung für eine Autovervollständigung für die RichTextBox.

    Ich möchte nämlich einen kleinen VBS-Editor programmieren.

    Kleines Beispiel: Wenn ich "MsgB" eingebe, dann entsteht automatisch ein "MsgBox("")" da draus.

    Danke für die Antworten im vorraus.

    VB.NET-Quellcode

    1. Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
    2. If RichTextBox1.Text = "MsgB" Then
    3. RichTextBox1.Text = "MsgBox("")"
    4. End If
    5. End Sub


    Das Funktionier so aber nur wenn nur MsgB Drin steht ansonsten fällt mir dazu nur die RegEx methode ein mit der du dann all deine begriffe filtern und ersetzen kannst
    @bigbase Der Code ist wohl kaum hilfreich.

    Du müsstest das letzte Wort dir raussuchen, da sollte die String.Substring-Methode langen, und dann vergleichen ob du in einer Liste von Begriffen Wörter hast, die so beginnen. Bevor du sie dann aber wirklich ersetzt, sollten sie visuell vorgeschlagen werden (kann ja auch mehrere geben) und dann per Tab oder Enger bestätigt. Beachte, dass das alles andere als schnell getan ist und etwas Arbeit kostet.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Obwohl ich vermute, dass @Plexian das impliziert: Du müsstest von der Caretposition (»Textcursor«position) ausgehend im Text rückwärts gehen und nach einem passenden Trennzeichen suchen. Das betrifft VS-mäßig aber nicht nur Leerzeichen und Zeilenumbrüche, sondern eben auch Klammern, Punkte, ...
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi
    die RichTextBox ist in ihrer "Rohform" nicht dazu geeignet Code darzustellen. Man kann Bilder einfügen, eigene Fonts definieren, usw. Stattdessen gibt's einige andere Textboxen, wie bspw. die FastColoredTextBox.

    An sich würde man einfach SelectionStart auswerten und dort das letzte Trennzeichen (Leerzeichen/Punkt/usw.) davor unter Verwendung von String.LastIndexOf suchen und dort dann String.Substring aufrufen. LastIndexOf unterstützt auch Groß-und-Kleinschreibung und es wäre eine der Überladungen zu wählen, die eben einen Index unterstützen, von dem aus gesucht werden soll.
    Statt LastIndexOf kannst du auch eine While-Schleife verwenden, die jeden Char für sich durchgeht und danach sucht. Das ist wahrscheinlich ein besserer Ansatz.

    Edit: Statt Substring kannst du auch direkt die Chars nehmen. Es lohnt sich, eine Art Baumstruktur über den Begriffen aufzuspannen und z.B. eben
    Ast
    Anfang
    Ableitung
    Baum
    Blatt
    Blume

    zu

    A
    -st
    -nfang
    -bleitung
    B
    -aum
    >l
    --att
    --ume

    usw. zu gruppieren oder direkt zu
    A
    -Ast
    -Anfang
    -Ableitung
    B
    -Baum
    >L
    -Blatt
    -Blume
    usw.

    Viele Grüße
    ~blaze~

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

    Hey leute, ich danke euch für die vielen Antworten!
    hab mir jetzt was zurechtgefummelt, was erstaunlicherweise (zumindest für mich lol) geklappt hat:

    VB.NET-Quellcode

    1. Private Sub DuckTextBox_TextChanged(sender As Object, e As EventArgs) Handles DuckTextBox.TextChanged
    2. If DuckTextBox.Text.Contains("Msg ") Then
    3. Dim curpos As Integer = DuckTextBox.SelectionStart
    4. DuckTextBox.Text = DuckTextBox.Text.Remove(DuckTextBox.SelectionStart - 1)
    5. Dim insertText = "Box(" + ControlChars.Quote + "" + ControlChars.Quote + ")"
    6. DuckTextBox.Text = DuckTextBox.Text.Insert(curpos - 1, insertText)
    7. DuckTextBox.SelectionStart = curpos - 3 + insertText.Length
    8. End If
    9. End Sub


    Wenn ich nun "Msg" eingebe, und die Leertaste drücke, wird sofort ein "MsgBox("")" Draus.

    Zusätzlich wird der cursor zwischen die beiden anführungszeichen gesetzt.

    P.S.: Diese "DuckTextBox" ist eine umbenannte RichTextBox.