# RichText :: voller Zugriff auf Inhalt



## bruZard (5. Oktober 2002)

Ich versuche innerhalb einer RichText-Box Syntaxhighlighting zu realisieren. Dazu hatte ich mehrere Ansätze, die aber alle nicht funktionieren. Zum Beispiel versuchte ich die Funktion InStr() dazu zu verwenden, aber im Gegensatz zu anderen Dialekten gibt mir diese Funktion nur zurück ob der gesuchte String gefunden wurde, nicht aber dessen Position im String.

Kennt vielleicht jemand eine Möglichkeit einen String innerhalb eines Strings zu finden und gleichzeitig seine Pos. zu erfahren?

P.S.: Ich teile .Text mit Split auf um den Inhalt der RichText in einzelne Zeilen zu zerlegen.


----------



## Dario Linsky (5. Oktober 2002)

natürlich gibt dir die instr-funktion die position des ersten zeichens vom suchtext zurück. wenn der suchstring nicht gefunden wurde, gibt die funktion 0 zurück.


----------



## bruZard (6. Oktober 2002)

Du hast Recht, dennoch funzt es irgendwie nicht. Ich kenne zwar die Methoden, verstehe aber nicht deren Anwendung. Hier mal ein Beispiel mit einem festen String:

```
Private Sub RichTextBox1_Change()
    Dim pos As Long
    With RichTextBox1
        pos = InStr(.Text, "Hallo")
        If pos Then
            .SelStart = pos - 1
            .SelLength = pos + 5
            .SelColor = vbRed
            .SelText = "Hallo"
        Else
            .SelColor = vbBlack
        End If
    End With
End Sub
```

Es funktioniert einfach nicht. Wie kann ich erreichen daß nur das Wort "Hallo" eingefärbt wird, der restliche Text aber unberührt bleibt und ich normal weiterschreiben kann?


----------



## bruZard (6. Oktober 2002)

P.S: Ich will während der Eingabe bestimmte Schlüsselworte formatieren.


----------



## Dario Linsky (6. Oktober 2002)

eine andere möglichkeit wäre, dass du dich einfach mal mit dem aufbau der rtf-steuerzeichen auseinandersetzt. dann kannst du evtl. jedes vorkommen deines schlüsselwortes mit der replace-funktion anhand der steuerzeichen formatieren.


----------



## bruZard (6. Oktober 2002)

Danke für den Tipp, daran habe ich noch garnicht gedacht.


----------



## Dario Linsky (6. Oktober 2002)

ich hab mir das gerade noch mal etwas durch den kopf gehen lassen und dabei ist noch folgender code rausgekommen. ist keine besonders tolle lösung, aber vielleicht hilft es dir ja etwas weiter:

```
Dim nPos As Long
Dim nStart As Long

nPos = rtf.Find("Hallo", nStart)
Do While nPos >= 0
    If rtf.SelLength > 0 Then
        rtf.SelBold = True
        rtf.SelStart = Len(rtf.Text)
        nPos = rtf.Find("Hallo", nPos + 5)
    Else
        rtf.SelBold = False
    End If
Loop
rtf.SelBold = False
```


----------



## bruZard (7. Oktober 2002)

Nee, sorry. Das funktioniert auch nicht.


----------



## Dario Linsky (7. Oktober 2002)

bei mir funktioniert das, es sind allerdings noch ein paar kleine schönheitsfehler drin. aber es soll auch keine musterlösung sein, sondern ein denkanstoss.


----------



## bruZard (10. Oktober 2002)

Du hattest Recht, es funktioniert sehr gut.

Allerdings denke ich daß es dennoch der falsche Ansatz ist. Einserseits durch die Tatsache daß ständig der gesamte Text durchsucht werden muß, andererseits weil man kaum Kontrolle über das Geschehen hat.
Ich will es nun so versuchen, daß ich einen zzweiten String "mitschleppe" in den ich den geparsten Text packe. Nur will mir kein vernünftiger Ansatz dafür einfallen ... vielleicht jemand eine Idee?
Ich will während der Eingabe des Textes Schlüsselwörter farbig darstellen, nach bestimmten Kombinationen von Schlüsselwörtern den Text einrücken, Tabs soll auch in der nächsten Zeile erhalten bleiben und ich will die Länge der Tabs ständig kontrollieren können ... *phew* ... starker Tobak


----------



## Dario Linsky (10. Oktober 2002)

das problem bei deinem vorhaben ist einfach nur, dass du ja vorher nicht weisst, an welcher stelle der text geändert wird. du könntest dich zwar immer auf die umgebung der aktuellen cursor-position beschränken, aber du weisst auch nicht, wieviel text geändert wird.
also bleibt dir wahrscheinlich nichts andere übrig, als immer den gesamten text zu durchsuchen.
falls mir trotzdem noch eine andere lösung einfällt, meld ich mich nochmal.


----------



## bruZard (12. Oktober 2002)

Ich habe es jetzt folgendermaßen in Angriff genommen: Mit einem Timer hole ich mir alle 125ms die Cursorposition (onChange geht ja nicht, da die Positionierung des Cursors keine Änderung darstellt) und will jetzt bei einer Änderung die komplette Zeile bis zum nächsten vbCrLf rausfinden. Aber genau das ist noch das Problem, irgendwie finde ich nicht heraus wo die Zeile beginnt...


----------



## Dario Linsky (12. Oktober 2002)

du kannst auch die dafür wichtigsten ereignisse nehmen (onclick, onchange, onkeydown, etc.) und miteinander verknüpfen. über die eigenschaft selstart kriegst du die cursorposition im gesamten text der richtextbox raus.
einen timer würde ich für sowas eher vermeiden, weil dadurch zu viele systemressourcen verbraucht werden.

und das problem bei deinem vorhaben ist, dass du immer nur eine zeile bis zum zeilenende parsen würdest. wenn jemand per copy and paste mehrere zeilen einfügt, dann könnte man das highlighting umgehen.


----------

