Zeilen in RTB einfärben

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von finni.

    Zeilen in RTB einfärben

    Hallo, nach googeln und Forumssuche habe ich zu meinem Problem nichts passendes gefunden. Ich liste in einer RTB Dateien auf.
    Ordnerpfade beginnen in der jeweiligen Zeile mit "[" und enden mit "]"
    Dateipfade setze ich mit vbtab in den zeilen zurück.
    Ich möchte die Ordnerpfade blau markieren.
    Mein Code macht das, markiert aber ab und zu auch Dateipfade. Was mache ich falsch?

    VB.NET-Quellcode

    1. Private Sub formatieren()
    2. Dim lines() As String
    3. lines = rtb.Lines
    4. For i As Integer = 0 To lines.Count - 1
    5. If lines(i).StartsWith("[") = True AndAlso lines(i).StartsWith(vbTab) = False Then 'AndAlso lines(i).EndsWith("]") Then
    6. rtb.Select(rtb.GetFirstCharIndexFromLine(i), rtb.Lines(i).Length) ' Von Index, Länge
    7. rtb.SelectionColor = Color.Blue
    8. rtb.SelectionFont = New Font("Courier", rtb.Font.Size, FontStyle.Bold Or FontStyle.Italic)
    9. Else
    10. rtb.Select(rtb.GetFirstCharIndexFromLine(i), rtb.Lines(i).Length) ' Von Index, Länge
    11. rtb.SelectionColor = Color.Black
    12. rtb.SelectionFont = New Font("Tahoma", rtb.Font.Size, FontStyle.Regular)
    13. End If
    14. Next
    15. End Sub

    Kann mir jemand einen Tipp geben?

    finni schrieb:

    VB.NET-Quellcode

    1. If lines(i).StartsWith("[") = True AndAlso lines(i).StartsWith(vbTab) = False Then
    Was versuchst Du mit dieser Zeile festzustellen?
    Wenn eine Zeile anfängt mit "[" und wenn sie gleichzeitig nicht mit vbTab anfängt?
    Dass sie mit "]" endet, testest Du nicht.
    Probier mal den hier:

    VB.NET-Quellcode

    1. If lines(i).StartsWith("[") AndAlso AndAlso lines(i).EndsWith("]") Then
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Problem ist, dass nicht alle Ordnerpfade gefärbt werden. Manchmal auch Zeilen der Dateipfade(teilweise) und manche Ordnerpfade nicht. Auch dein Vorschlag mit einem andalso weniger ändert das nicht. So hatte ich es ursprünglich, wollte deshalb mit Startswith(vbtab) eine weitere Bedingung setzen. Aufgelistet wird nach [VB.NET] Dateisystem protokollieren - nach Systemneustart fortfahren Post 16 mit rtb.Text &= "[" & l1.FullName & "]" & vbCrLf bzw. rtb.Text &= vbTab & File.FullName & vbCrLf

    MfG finni
    @finni:: Dann poste mal einen solchen nicht funktionierenden RTB-Inhalt, dann kann ich es nachvollziehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @finni:: :rolleyes:
    Bitte den Text in Textform, am besten als txt-Datei.

    RodFromGermany schrieb:

    dann kann ich es nachvollziehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @finni:: OK, die rtb.Lines-Property ist nicht kompatibel zu rtb.GetFirstCharIndexFromLine(i)

    MSDN schrieb:

    GetFirstCharIndexFromLine returns the first character index of a physical line. The physical line is the displayed line, not the assigned line. The number of displayed lines can be greater than the number of assigned lines due to word wrap. For example, if you assign two long lines to a RichTextBox control and set Multiline and WordWrap to true, the two long assigned lines result in four physical (or displayed lines).

    Ziehe die Form (und mit ihr die RTB) so breit, dass kein WordWrap auftritt, dann geht es.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Ziehe die Form (und mit ihr die RTB) so breit, dass kein WordWrap auftritt, dann geht es.

    Das ist doch nur eine Behandlung des Symptoms und keine wirkliche Lösung des Problems. Dabei ist die Lösung doch so naheliegend:
    Einfach den echten Zeilenbeginn rausfinden und nicht den des Layouts. Entweder über Regex oder noch einfacher so:

    VB.NET-Quellcode

    1. Dim pos = 0
    2. For i As Integer = 0 To lines.Count - 1
    3. If lines(i).StartsWith("[") AndAlso lines(i).EndsWith("]") Then
    4. rtb.Select(pos, rtb.Lines(i).Length) ' Von Index, Länge
    5. rtb.SelectionColor = Color.Blue
    6. rtb.SelectionFont = New Font("Courier", rtb.Font.Size, FontStyle.Bold Or FontStyle.Italic)
    7. Else
    8. rtb.Select(pos, rtb.Lines(i).Length) ' Von Index, Länge
    9. rtb.SelectionColor = Color.Black
    10. rtb.SelectionFont = New Font("Tahoma", rtb.Font.Size, FontStyle.Regular)
    11. End If
    12. pos += lines(i).Length + 1 ' +1 wegen Zeilenumbruch
    13. Next


    Funktioniert auch bei WordWrap.

    markus.obi schrieb:

    keine wirkliche Lösung des Problems.
    War auch nicht der Plan, ich wollte lediglich den Effekt verdeutlichen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!