[VB] RichText Highlighter

sub7even

Mitglied
Ja hallo,
ich versuche im moment einen keinen Editor mit VB.NET zu schreiben
und ein Highlighter darf da natürlich nicht fehlen...
Jedoch habe ich mit diesem ein problem^^

Jedesmal wenn er die wörter gefärbt hat,
kann ich mit dem Editor nicht weiter arbeiten (er hängt)
wenn ich dan versuche in den editor zu klicken wird der text ausgewählt den er als letztes gefärbt hat...
Wenn ich nun etwas hinein schreibe wird natürlich die auswahl geändert.
wenn diese geändert wird, stürzt das programm sofort ab und es gibt eine fehlermeldung.

Hier mal mein highlighter:
Visual Basic:
Public Sub highlightText(ByVal myword)

        Dim myfont As New Font("Arial", 10, FontStyle.Bold)
        Dim mycolor As Color = Color.Red
        Dim lpos As Integer

        Do While (lpos < RichTextBox2.Text.Length)
            Application.DoEvents()
            RichTextBox2.SelectionStart = RichTextBox2.Find(myword, lpos, RichTextBoxFinds.WholeWord)

            RichTextBox2.SelectionColor = mycolor
            RichTextBox2.SelectionFont = myfont
            lpos = RichTextBox2.Text.LastIndexOf(myword)
        Loop

    End Sub

Und der Fehler:
fm01.jpg

{"InvalidArgument=Value mit dem Wert -1 ist für SelectionStart ungültig. Parametername: SelectionStart"}

Hoffe es kann mir jemand helfen :s
 
Zuletzt bearbeitet:
Ich würde einen Timer nehmen und den starten beim TextChanged Ereignis.
Dazu Beim TextChanged Ereignis noch Uhrzeit merken.

Wenn [aktuelle Zeit] - [gemerkte Zeit] > 500 ms, oder so.
Dann erst Syntax Highlicht neu prüfen/setzen.
Und den Timer wieder inaktiv setzen.

So kann der Nutzer erstmal lang hin tippen ohne direkt mit Wartezeit (lagg) konfrotiert zu werden.

Zum Fehler, lpos ist -1, da musst du vorher prüfen das er größer gleich 0 ist.
 
Also habe das jetzt versucht um zu setzen,
jedoch habe ich dadurch meinen Fehler immernoch nicht behoben.
Das mit dem prüfen ist nemlich irgendwie sinnlos,
da beim debugger die variable beim fehler den wert {0} enthält.

Also jetzt sieht das bei mir folgender maßen aus:
Visual Basic:
    Dim lpos As Integer = 0
    Dim myfont As New Font("Arial", 10, FontStyle.Bold)
    Dim mycolor As Color = Color.Red
    Dim wgot As Integer
    Dim time1 As Date
    Dim time2 As Date
    Dim time3 As TimeSpan

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If (lpos <= -1) Then
            lpos = 0
        End If
        RichTextBox2.SelectionStart = RichTextBox2.Find("insert", lpos, RichTextBoxFinds.WholeWord)

        RichTextBox2.SelectionColor = mycolor
        RichTextBox2.SelectionFont = myfont
        lpos = RichTextBox2.Text.LastIndexOf("insert")
        If ((time3.Milliseconds - wgot) >= 500) Then
            Timer1.Stop()
        End If

    End Sub

    Private Sub RichTextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox2.TextChanged
        time3 = time2.Subtract(time1)
        wgot = time3.Milliseconds
        Timer1.Start()
    End Sub


Sonst noch jemand ideen? :(
 
Die Geschichte mit dem Timer kannst du etwas geschickter lösen. Die Variablen time1/2/3 brauchst du dann nicht:
Stell das Intervall des Timers auf 500 Millisekunden und lass ihn bei jedem TextChanged-Ereignis von vorne anfangen, diese 500 Millisekunden hochzuzählen:
Code:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Timer1.Stop()
    ' ... Jetzt hier deinen Code für Syntax-Highlighting ...
End Sub

Private Sub RichTextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox2.TextChanged
    ' Timer neu starten
    Timer1.Stop()
    Timer1.Start()
End Sub
Zu deinem Fehler: Was für ein Fehler tritt denn an welcher Stelle auf?
 
Jedesmal wenn er die wörter gefärbt hat,
kann ich mit dem Editor nicht weiter arbeiten (er hängt)
wenn ich dan versuche in den editor zu klicken wird der text ausgewählt den er als letztes gefärbt hat...
Wenn ich nun etwas hinein schreibe wird natürlich die auswahl geändert.
wenn diese geändert wird, stürzt das programm sofort ab und es gibt eine fehlermeldung.

Und der Fehler:
fm01.jpg

{"InvalidArgument=Value mit dem Wert -1 ist für SelectionStart ungültig. Parametername: SelectionStart"}

Bei der neuen version tritt der gleiche fehler sofort auf, wenn ich etwas in die richtextbox schreibe >.<
(Ich hatte den Highlighter voher auf einen button gelegt zum testen ob dieser überhaupt etwas bzw. das was er soll macht)
 
Find liefert -1 zurück wenn myword in der Richtextbox nicht gefunden wurde.
SelectionStart selbst erlaubt keinen negativen Wert.
 
Find liefert -1 zurück wenn myword in der Richtextbox nicht gefunden wurde.
SelectionStart selbst erlaubt keinen negativen Wert.

Und wie soll ich dies verhindern? :s

ich habe jetzt schon:
Visual Basic:
If (RichTextBox2.Find("insert", lpos, RichTextBoxFinds.WholeWord) <= -1) Then
            Timer1.Stop()
        End If
versucht stadt dem Selection.Start = ...

jedoch ist das problem das so der fehler trotzdem während der prüfung entsteht...
 
Der Timer ist dafür da damit der User bei Texteingaben nicht ins laggen kommt wegen der Highlight Prüfung.
Dies hatte nichts mit deinem Fehler zu tun.

Um den Fehler abzufangen einfach den Rückgabe Wert der Find Methode in einer Hilfsvariable speichern, mit dieser prüfen und SelectionStart setzen wenn für gut befunden.
Pseudocode:
Code:
Integer hilfsvariable = richTextBox.Find(....);
wenn hilfsvariable > -1
{
       richTextBox.SelectionStart = hilfsvariable;
}
So ungefähr.

Achja, und prüfe ob du wirklich das DoEvents brauchst.
(Ich würds rausnehmen)
 
Habe das jetzt so versucht... jedoch leider ohne erfolg...
Wieder der gleiche fehler während der früfung...

Visual Basic:
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim hilfsvar As Integer = RichTextBox2.Find("insert", lpos, RichTextBoxFinds.WholeWord)
        If (hilfsvar > -1) Then
            RichTextBox2.SelectionStart = hilfsvar
        End If
        RichTextBox2.SelectionColor = mycolor
        RichTextBox2.SelectionFont = myfont
        lpos = RichTextBox2.Text.LastIndexOf("insert")
        If ((time3.Milliseconds - wgot) >= 500) Then
            Timer1.Stop()
        End If

    End Sub

Ich habe beim Fehler im Debugger mal darauf geachtet welchen wert die variable hilfsvar hat beim crash...
Und sie enthält 0.
Kann es sein, dass die Funktion richtextbox.Find() automatisch bei benutzung das SelectionStart macht,
auch wenn man nicht ..SelectionStart = ...Find() hingeschrieben hat?
 
Ich glaube das kannst du einstellen bei der Find Methode ob Highlight mit gesetzt werden soll.
Über den Flag RichTextBoxFinds.

Und kanns sein das lpos -1 an die Find Methode übergibt?
 

Neue Beiträge

Zurück