Fragen zur RichTextBox

Kyrodust

Erfahrenes Mitglied
Hi Leute!

Ich möchte gerne das in einer RichTextBox alle Wörter die zB zwischen "" stehen in einer anderen Farbe stehen. Wie kann ich das machen?
 
Nach dem doppelten Hochkomma suchen, Position merken (selStart), nach dem nächsten suchen, Position von der ersten Position abziehen (selLen), und dann den markierten Teil bearbeiten.

/edit:

Folgendes Beispiel sucht den ersten String der in doppelten Hochkommata steht und färbt ihn rot ein.
Um alle folgenden auch einzufärben musst du nur die Suche mit der neuen Startposition wiederholen.

Code:
Dim Zeichen As String
Dim Pos1 As Long
Dim Pos2 As Long

Private Sub cmdHighlight_Click()
    Pos1 = InStr(Pos1, RTF.Text, Zeichen)
    Pos2 = InStr(Pos1 + 1, RTF.Text, Zeichen)
    RTF.SelStart = Pos1
    RTF.SelLength = Pos2 - Pos1 - 1
    RTF.SelColor = vbRed
End Sub

Private Sub Form_Load()
    Zeichen = Chr(34) 'Doppeltes Hochkomma
    Pos1 = 1
    Pos2 = 1
End Sub

Und natürlich sollte man alle Möglichkeiten abfanen, also wenn nichts gefunden wird, etc.
 
Zuletzt bearbeitet:
Das funktioniert schon mal super. Kann ich es irgendwie machen, dass wenn ich auf die Schaltfläche klicke, der Cursor an die letzte Stelle gesetzt wird. Oder zumindest in die nächste Zeile ohne das der veränderte Text markiert wird.
 
Cursor ans Textende setzen:
Code:
RTF.SelStart = Len(RTF.Text)
SelStart ist die Position des Cursors, Len gibt die Länge eines Strings zurück, und RTF.Text den Text im RTF-Steuerelement.
 
Um alle folgenden auch einzufärben musst du nur die Suche mit der neuen Startposition wiederholen.

Kannst du mir das mal bitte genauer erklären. Habe leider von der Programmierung mit RTF nicht viel Ahnung, aber ich würde es dringend brauchen.
 
Du führst einfach den Code nochmal aus, nur mit einem neuen Wert in Pos1.
In Pos1 und 2 werden ja die Positionen von dem gesuchten Zeichen gespeichert, Anfang und Ende.
Wenn du jetzt das nächste Paar suchst musst nur beim ersten InStr(...) die Variable Pos1 auf die zuletzt gefundene Position + 1setzten.

Aber das Vorgehen hat nix mit RTF an sich zu tun, wenn du eine Funktion schreiben willst wie Suchen/AlleErsetzen geht man ähnlich vor.

Gibt vielleicht ne elegantere Lösung, aber damit funktionierts für den ganzen Text:
Code:
Dim Zeichen As String
Dim Pos1 As Long
Dim Pos2 As Long

Private Sub cmdHighlight_Click()
    Pos1 = 1
    Pos2 = 1
    Do
        Pos1 = InStr(Pos1, RTF.Text, Zeichen)
        Pos2 = InStr(Pos1 + 1, RTF.Text, Zeichen)
        If Pos1 <> 0 And Pos2 <> 0 Then
            RTF.SelStart = Pos1
            RTF.SelLength = Pos2 - Pos1 - 1
            RTF.SelColor = vbRed
            Pos1 = Pos2 + 1
        End If
        DoEvents
    Loop While Pos1 <> 0 And Pos2 <> 0
End Sub

Private Sub Form_Load()
    Zeichen = Chr(34) 'Doppeltes Hochkomma
    Pos1 = 1
    Pos2 = 1
End Sub
Sieht aus als willst du einen Quellcodeeditor mit Syntaxhighlighting machen.
Bei meinem Beispiel kanns evtl. Probleme geben wenn die Wörter schon markiert sind und dann noch Hochkomma eingefügt werden und die Sub nochmal läuft.
Um das zu vermeiden könntest du z.B. vor dem Durchlauf die Textfarbe zurücksetzten.
Code:
'Färbt den kompletten Text schwarz:
RTF.SelStart = 1
RTF.SelLength = Len(RTF.Text)
RTF.SelColor = vbBlack
Den Teil dann am Anfang der Sub cmdHighlight_Click() ausführen.

/Edit:

Wenn du die Hochkommata mit einfärben willst, also nicht nur den Text der innen steht, musst du nur die Position bisschen ändern:
Code:
RTF.SelStart = Pos1-1
RTF.SelLength = Pos2 - Pos1 +1
RTF.SelColor = vbRed
 
Zuletzt bearbeitet:
Jup du hast es erfasst, dass ich einen Quelltexteditor machen will. Naja ich wollte das aber nicht unbedingt auswerfen aber naja, jetzt ist es eh raus. Es ist aber nicht für BASIC.

Jetzt noch eine andere Frage: Ich will auch eine Zeilennummerierung machen. Die funktioniert ja schon mal. Wenn ich auf Enter drücke, dann wird Links neben der RTF ein Zeilennummer ausgegeben. Jetzt habe ich folgendes Problem: Wie kann ich es machen, dass, wenn ich ein Return lösche, eine Zeilenzahl verschwindet.
 
Mehr oder weniger primitiv.

Ich habe neben dem Textfeld ein Labelfeld aufgezogen und gesagt, wenn ich in der Textbox (oder RTF) die Taste Enter drücke soll er im Labelfeld in die nächste Zeile gehen und einfach die Zeichenkette fortsetzen.

Das ist eine primitive Methode, aber wenn du eine bessere Methode kennst, sag sie mir bitte.
 
Es gibt eine API-Funktion womit du feststellen kannst, wie viele Zeilen in einer Textbox sind. Dürfte auch für eine Richtextbox funzen... Und die API heißt: SendMessage!

Also so dürfte es funktionieren:
Code:
Const EM_GETLINECOUNT = &HBA

Private Function LineCount() as Integer
          LineCount = SendMessage(txtEingabe.hwnd, EM_GETLINECOUNT, 0, 0&)
End Function

Wenn du nun die Anzahl der Zeilen weißt wird es kein Problem sein die links in einem Gutter anzuzeigen.

mfg Grimreaper

P. S. Wir erwarten natürlich den Link für das fertige Produkt ;)
 
Zurück