Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0117: RTF-Code manipulieren

 von 

Hinweis zum Tippvorschlag  

Der Download dieses Vorschlags wurde gesperrt. Die Begründung für die Sperrung lautet: Enthält Satelitten-Dll, muss von Mitarbeiter ausführlich geprüft werden..

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Fenster

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
RTF, manipulieren, OLE, Formatierung

Der Vorschlag wurde erstellt am: 29.09.2007 18:43.
Die letzte Aktualisierung erfolgte am 30.09.2007 16:48.

Zurück zur Übersicht

Beschreibung  

Eine Klasse, mit deren Hilfe sich RTF-Code manipulieren lässt.
Es können einzelne Schriftattribute geändert werden, und zwar nicht, indem man wie in der RichTextBox ein komplett neues Font-Objekt erstellt, sondern durch direkte Modifizierung des eigentlichen RTF-Codes.
Außerdem kann man mit der Klasse alle (unter Umständen für die Performance hinderlichen) OLE-Objekte aus einem RTF-Text entfernen.
Die Klasse ist zwar nicht direkt von der RichTextBox abhängig, aber auf diese zugeschnitten.
Wenn z.B. in der RTB ein Text mit zwei verschiedenen Fonts markiert wurde, kann man den markierten Text Fett darstellen, ohne den gesamten Text mit ein und derselben Font formatieren zu müssen.
Wenn jemand noch einen Fehler findet, oder einen Vorschlag hat, wie man etwas besser machen kann... immer her damit!
(Es wurden noch einige Fehler verbessert)

Schwierigkeitsgrad

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download nicht freigeschaltet.
' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' ------------ Anfang Projektgruppe RTFWorker.sln ------------
' ----------- Anfang Projektdatei RTFWorker.vbproj -----------
' --------------- Anfang Datei clsRTFWorker.vb ---------------
Public Enum FontChangeType
    Size
    Name
    Bold
    Underline
    Italic
End Enum

Public Class RTFWorker

    Public Shared Function GetObjectEnd(ByVal RTF As String, ByVal ObjectBegin As Integer) As _
        Integer

        ' Diese Funktion gibt die genaue Position innerhalb eines RTF-Textes zurück,
        ' an der ein OLE-Objekt, das bei 'ObjectBegin' beginnt, aufhört.
        Dim Z As Integer = ObjectBegin + 1
        Dim KD As Integer = 1

        Do Until KD = 0

            Dim I As Integer = RTF.IndexOf("{", Z)
            Dim I2 As Integer = RTF.IndexOf("}", Z)

            If I < I2 And I > -1 Then
                KD += 1
                Z = I + 1

            Else

                KD -= 1
                Z = I2 + 1
            End If

        Loop

        Return Z

    End Function

    Public Shared Function RemoveObjects(ByVal RTF As String) As String

        ' Diese Funktion gibt einen RTF-Text zurück, aus dem alle OLE-Objekte
        ' entfernt wurden.
        If RTF Is Nothing Then
            Return RTF
        End If

        Do

            Dim Begin As Integer = RTF.IndexOf("{\obj")

            If Begin = -1 Then

                Exit Do

            End If

            RTF = RTF.Remove(Begin, GetObjectEnd(RTF, Begin) - Begin)
        Loop

        Return RTF

    End Function

    Public Shared Function EditRTF(ByVal RTF As String, ByVal ChangeType As FontChangeType, _
        ByVal Value As Object) As String

        Select Case ChangeType

            Case FontChangeType.Bold

                If Value = True Then

                    ' Einen Bold-Tag einzetzen
                    RTF = RTF.Insert(RTF.IndexOf("\pard") + 5, "\b")

                    ' Alle EndBold-Tags entfernen
                    RTF = RTF.Replace("\b0 ", "")
                    RTF = RTF.Replace("\b0", "")

                ElseIf Value = False Then

                    ' Alle Bold-Tags entfernen
                    ' Hinweis: Wenn es innerhalb des RTF-
                    ' Textes eine Liste mit Schriftfarben gibt,
                    ' darf diese beim Entfernen des Strings "\b"
                    ' nicht mit einbezogen werden, da sie so aussehen kann:
                    ' {\colortbl ;\red0\green0\blue255;\red128\green0\blue0;}
                    ' Andernfalls würde sie nämlich beschädigt werden
                    Dim SI As Integer = RTF.IndexOf("{\colortbl")

                    If SI > -1 Then

                        Dim ObjEnd As Integer = GetObjectEnd(RTF, SI)
                        Dim T As String = RTF.Substring(ObjEnd, RTF.Length - ObjEnd)

                        RTF = RTF.Substring(0, ObjEnd) & T.Replace("\b", "")

                    Else

                        RTF = RTF.Replace("\b", "")
                    End If
                End If

            Case FontChangeType.Italic

                ' Funktioniert wie bei 'Case Bold'
                If Value = True Then
                    RTF = RTF.Insert(RTF.IndexOf("\pard") + 5, "\i")
                    RTF = RTF.Replace("\i0 ", "")
                    RTF = RTF.Replace("\i0", "")

                ElseIf Value = False Then

                    RTF = RTF.Replace("\i", "")
                End If

            Case FontChangeType.Underline

                ' Funktioniert wie bei 'Case Bold'
                If Value = True Then
                    RTF = RTF.Insert(RTF.IndexOf("\pard") + 5, "\ul")
                    RTF = RTF.Replace("\ulnone ", "")
                    RTF = RTF.Replace("\ulnone", "")

                ElseIf Value = False Then

                    RTF = RTF.Replace("\ul", "")
                End If

            Case FontChangeType.Name

                ' Die FontList suchen...
                Dim I As Integer = RTF.IndexOf("{\fonttbl")

                If I <> -1 Then

                    ' ...sie entfernen...
                    RTF = RTF.Remove(I, GetObjectEnd(RTF, I) - I)

                    ' ...die neue FontList mit der neuen Font als
                    ' einzigem Element einsetzen
                    RTF = RTF.Insert(I, "{\fonttbl{\f0\fmodern\fcharset2 " & Value & ";}}")
                End If

            Case FontChangeType.Size

                ' Hinweis: ein Tag für die Schriftgröße 10
                ' sieht so aus: \fs20
                Dim LI As Integer = RTF.IndexOf("\fs") + 3
                Dim FI As Integer = LI - 3

                ' Die Schleife entfernt alle FontSize-Tags
                Do

                    Dim SI As Integer = LI - 3
                    Dim C As Char

                    Do
                        C = RTF.Substring(LI, 1)
                        LI += 1
                    Loop Until (Char.IsNumber(C) = False)

                    If SI > -1 Then
                        RTF = RTF.Remove(SI, LI - SI - 1)
                    End If

                    LI = RTF.IndexOf("\fs", LI) + 3
                Loop Until (RTF.Contains("\fs") = False)

                ' An der Stelle des ersten FontSize-Tags wird
                ' ein anderer mit der neuen Schriftgröße einge-
                ' setzt.
                If FI > -1 Then
                    RTF = RTF.Insert(FI, "\fs" & (Value * 2))
                End If

        End Select

        Return RTF

    End Function

End Class

' ---------------- Ende Datei clsRTFWorker.vb ----------------
' ------------ Ende Projektdatei RTFWorker.vbproj ------------
' ------------- Ende Projektgruppe RTFWorker.sln -------------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.