tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
3249
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    bruZard bruZard ist offline Rookie
    Registriert seit
    Oct 2002
    Beiträge
    9
    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.
     
    be bloxed!

  2. #2
    Registriert seit
    Nov 2001
    Ort
    Gießen
    Beiträge
    4.091
    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.
     
    "You could say that I was too lazy to calculate and so I invented the computer." -- Konrad Zuse

  3. #3
    bruZard bruZard ist offline Rookie
    Registriert seit
    Oct 2002
    Beiträge
    9
    Du hast Recht, dennoch ****t es irgendwie nicht. Ich kenne zwar die Methoden, verstehe aber nicht deren Anwendung. Hier mal ein Beispiel mit einem festen String:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    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?
     
    be bloxed!

  4. #4
    bruZard bruZard ist offline Rookie
    Registriert seit
    Oct 2002
    Beiträge
    9
    P.S: Ich will während der Eingabe bestimmte Schlüsselworte formatieren.
     
    be bloxed!

  5. #5
    Registriert seit
    Nov 2001
    Ort
    Gießen
    Beiträge
    4.091
    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.
     
    "You could say that I was too lazy to calculate and so I invented the computer." -- Konrad Zuse

  6. #6
    bruZard bruZard ist offline Rookie
    Registriert seit
    Oct 2002
    Beiträge
    9
    Danke für den Tipp, daran habe ich noch garnicht gedacht.
     
    be bloxed!

  7. #7
    Registriert seit
    Nov 2001
    Ort
    Gießen
    Beiträge
    4.091
    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:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    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
     
    "You could say that I was too lazy to calculate and so I invented the computer." -- Konrad Zuse

  8. #8
    bruZard bruZard ist offline Rookie
    Registriert seit
    Oct 2002
    Beiträge
    9
    Nee, sorry. Das funktioniert auch nicht.
     
    be bloxed!

  9. #9
    Registriert seit
    Nov 2001
    Ort
    Gießen
    Beiträge
    4.091
    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.
     
    "You could say that I was too lazy to calculate and so I invented the computer." -- Konrad Zuse

  10. #10
    bruZard bruZard ist offline Rookie
    Registriert seit
    Oct 2002
    Beiträge
    9
    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
     
    be bloxed!

  11. #11
    Registriert seit
    Nov 2001
    Ort
    Gießen
    Beiträge
    4.091
    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.
     
    "You could say that I was too lazy to calculate and so I invented the computer." -- Konrad Zuse

  12. #12
    bruZard bruZard ist offline Rookie
    Registriert seit
    Oct 2002
    Beiträge
    9
    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...
     
    be bloxed!

  13. #13
    Registriert seit
    Nov 2001
    Ort
    Gießen
    Beiträge
    4.091
    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.
     
    "You could say that I was too lazy to calculate and so I invented the computer." -- Konrad Zuse

Ähnliche Themen

  1. [VB] RichText Highlighter
    Von sub7even im Forum .NET Windows Forms
    Antworten: 22
    Letzter Beitrag: 13.01.10, 20:58
  2. Antworten: 1
    Letzter Beitrag: 10.07.09, 16:19
  3. Zugriff auf denn Inhalt des div tags
    Von Gerold Kumpfhuber im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 16.11.04, 11:35
  4. Zugriff auf den Inhalt der mysql_fetch_array() Funktion
    Von Ralf Dillenburger im Forum PHP
    Antworten: 2
    Letzter Beitrag: 16.06.04, 15:30
  5. Zugriff auf den Inhalt eines Textfeldes einer OCX
    Von Smuddle im Forum .NET Archiv
    Antworten: 0
    Letzter Beitrag: 11.09.03, 18:46