vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 11.02.23 19:10

Hi Ihr,

ich hänge schon den ganzen Tag an einer - wie ich dachte, einafchen Sache fest.

Gegeben ist eine RTF-Box sowie zwei Comboboxen, in welchen ich Schriftart und Schriftgrösse wählen kann.

Das funzt mit folgendem Script auch prima - solange ich nicht Text markiere, der aus unterschiedlichen Schriftarten bzw. Grössen besteht.

Beispiel Cobo Schriftgrösse (cobo Schriftart ist praktisch identisch):
    Private Sub cob_TextEditor_Schriftgrösse_SelectedIndexChanged(sender As _
      Object, e As EventArgs) Handles _
      sym_TextEditor_cob_Schriftgrösse.SelectedIndexChanged
            If LCase(IO.Path.GetExtension(dateiname)) = ".txt" Then
                ' Bei Text-Datei ganzen Text umformatieren
                tsc_TextEditor_RTFBox.Font = New Font( _
                  sym_TextEditor_cob_Schriftart.Text, _
                  sym_TextEditor_cob_Schriftgrösse.Text)
                My.Settings.SchriftTextEditorFont = New Font( _
                sym_TextEditor_cob_Schriftart.Text, CInt( _
                sym_TextEditor_cob_Schriftgrösse.Text))
            Else
                ' Bei RTF-Datei nur selektierten Text umformatieren
                If tsc_TextEditor_RTFBox.SelectionFont IsNot Nothing Then
                    ' alle Zeichen identisch formatiert
                    tsc_TextEditor_RTFBox.SelectionFont = New Font( _
                      tsc_TextEditor_RTFBox.SelectionFont.FontFamily, CInt( _
                      sym_TextEditor_cob_Schriftgrösse.SelectedItem), _
                      tsc_TextEditor_RTFBox.SelectionFont.Style)
                Else
                    ' Selektion mit unterschiedlicher Formatierung
                    ' ???
                End If
            End If
        end sub
Sobald ich einen Text-Bereich mit unterschiedlich formatierten Zeichen markiere, finde ich keinen Weg, diesen dann die aus der Combo Schriftart bzw. Schriftgrösse ausgewählte Umformatierung zu verpassen.

Wie kann ich das hinfummeln, dass das funktioniert?

Beste Grüsse und ein schönes Rest-Weekend
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: BT-Soft
Datum: 13.02.23 13:04

Den markierten Text in ein unsichtbares Textfeld kopieren. Dort markieren und erneut kopieren. Danach in das RTF-Textfeld einfügen und den gewünschten Zeichensatz/größe festlegen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 13.02.23 19:29

Ach herjeh, ist das so aufwendig?

Herzlichen Dank für den Tip.

Nur...

Ich habe ja zwei CoBos - einmal "Schriftart" und einmal "Schriftgrösse".

Wenn ich nun den Caret in einer RTFBox an eine beliebige Stelle plaziere, und in meiner Cobo "Schriftgrösse" eine beliebige Schriftgrösse auswähle, wie bekomme ich da die ab der Textstelle des Caret gültigen Fontnamen (oder bei selektiertem Text den gültigen Fontnamen des ersten selektierten Zeichens) ausgelesen?

Bzw. bei Schriftartauswahl in der CoBo "Schriftart":
Wenn ich nun den Caret in einer RTFBox an eine beliebige Stelle plaziere, und in meiner Cobo "Schriftart" eine beliebige Schriftart auswähle, wie bekomme ich da die ab der Textstelle des Caret gültigen Fontsize (oder bei selektiertem Text die Fontsize des ersten selektierten Zeichens) ausgelesen?


Ich muss ja bei Schriftgrössenwechsel die an der Caret-Position bestehende Schriftart wieder setzen und identisch bei Schriftartwechsel die an der Caret-Position gültige Schriftgrösse unverändert übernehmen.

Dass das so kompliziert sein kann, hätte ich nicht gedacht.
Oder stelle ich mich einfach zu dumm an?
Mit dem Font-Dialog ist es ja auch machbar, ohne Klimmzüge.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Kuno60
Datum: 13.02.23 21:06

Den aktuellen Font an der Einfügemarke oder des ausgewählten Textes, kannst du mit SelectionFont, im Ereignis SelectionChanged, abfragen (mit Größe und Stil).

Was nicht so einfach geht, ist:
Die Schriftgröße ändern, wenn der ausgewählte Text aus verschiedenen Fonts besteht.
Dies ist nur möglich, wenn man den SelectedRtf direkt bearbeitet (\fs.. = Fontsize in doppelter Größe).

Warum bearbeitest du nicht den RTF-Text mit WordPad? Da funktioniert das!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 13.02.23 21:15

Servus Kuno,

Danke Dir für Deinen Ratschlag.

Ja, ich glaube, ich lasse die zwei CoBos weg und setze nur auf den Font-Dialog.
Der funzt immer.

Das Projekt beinhaltet einen TextEditor.
Die Benutzer können auswählen, ob sie den internen (meinen selbstgeschnitzten) oder einen definierbaren externen Texteditor benutzen wollen.
Im selbstgebauten sollten halt soviel wie mögliche Funktionen des Notepads enthalten sein.
Damit die User mein Programm mgl. nicht verlassen müssen.

EDIT: SelectionFont liefert bei mit Nothing, wenn ich unterschiedlich formatierten Text markiert habe.
Das ist eben mein Dilemma.
EDIT2: Daher auch meine Frage nach dem Auslesen der Font und Size des ersten markierten Zeichens.

Beitrag wurde zuletzt am 13.02.23 um 21:19:29 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Kuno60
Datum: 13.02.23 21:21

"EDIT: SelectionFont liefert bei mit Nothing, wenn ich unterschiedlich formatierten Text markiert habe.
Das ist eben mein Dilemma."

Ja genau, deshalb geht das nicht. Das ist bei WordPad genauso. Nur bei WordPad ist es trotzdem möglich die Schriftgröße zu ändern.
Der Font am ersten markierten Zeichen kann in diesem Fall nicht abgerufen werden.

Beitrag wurde zuletzt am 13.02.23 um 21:24:05 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Kuno60
Datum: 13.02.23 21:30

So zum Beispiel kann, nur die Schriftgröße des ausgewählten Textes, mit unterschiedlichem Font oder Stilen, geändert werden:

  'Schriftgröße ändern bei unterschiedlichen Fonts:
  Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) _
    Handles ComboBox1.SelectedIndexChanged
    Dim fg = CInt(ComboBox1.SelectedItem) 'Auflistung von Zahlen
    Dim rtb = RichTextBox1
    If rtb.SelectionLength > 0 Then
      Dim rt = rtb.SelectedRtf
      For Each m As Match In Regex.Matches(rt, "\\fs\d{1,3}", _
        RegexOptions.RightToLeft)
        rt = rt.Remove(m.Index, m.Length).Insert(m.Index, $"\fs{fg * 2}")
      Next
      rtb.SelectedRtf = rt
    End If
  End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 13.02.23 22:09

Wow, danke Dir recht sakrisch, Kuno!

Muss das mal bei Gelegenheit ausprobieren.

Im Moment tendiere ich mehr dazu, den Nutzern nur den Font-Dialog anzubieten.

Mir hätte es halt getaugt, bei SelectChange oder Caret-Positionsänderung in den ComBos die Schriftart und -Grösse anzuzeigen, welche für die Stelle des Carets bzw. der Selektion gilt.
Aber das ist ja nicht lebensnotwendig.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 14.02.23 15:00

P.S. Gibts so ein Tauschscript für den Quelltext vielleicht auch für die Schriftart?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 20.02.23 21:22

Hi Kuno,

ich habe jetzt mal ein Script geknotet, das mir aus dem Plaintext eines RTFs die in dessen Header eingetragenen Schriftarten ausliest und in eine Tabelle einträgt:

        Dim vara As Integer
        Dim beginHeader As Long = plaintext.IndexOf("{\fonttbl{")
        Dim endHeader As Long = plaintext.IndexOf("}}")
        Dim einträge = plaintext.Substring(beginHeader + 9, endHeader - _
          beginHeader - 9).Split("}")
        fontlisteRTFDokument.Clear()
        For vara = 0 To einträge.Length - 1
            Dim beginFont As Long = einträge(vara).IndexOf(" ")
            Dim endFont As Long = einträge(vara).IndexOf(";")
            fontlisteRTFDokument.Rows.Add(einträge(vara).Substring(beginFont + _
              1, endFont - beginFont - 1))
            ' Test der Tabellenübernahme: Debug.Print(einträge(vara).Substring( 
            ' beginFont + 1, endFont - beginFont - 1))
        Next
Jeztzt hänge ich aber daran fest, dass ich das RTF von der SelStart-Position rückwärts bis max. zum Header-Ende nach dem ersten auftretenden "\F"+Zahl durchforsten müsste.
Dann könnte ich mit der Zahl nach dem "\F" aus der generierten Fonts-Tabelle die, für die SelStart gültige Font auslesen.
Aber da komme ich nicht weiter.

Ich wundere mich eh, warum der Header im Txt die Liste der verwendeten Fonts beinhaltet und der Header im RTF aber nur eine Font.
Leider finde ich im Web überhaupt nichts über die Formatierung und Bedienung der RichTexte.
Ist Dir da vielleicht was bekannt, wo ich nachlesen könnte, wie das mit den RTF-Dokumenten und der RichTextBox funktioniert?

Beste Grüsse

Beitrag wurde zuletzt am 20.02.23 um 21:24:14 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Kuno60
Datum: 20.02.23 22:37

Hallo Dideldum,

warum deklarierst du die Variablen als Long? IndexOf() gibt den Typ Integer zurück (NET ist nicht VB6).

https://de.wikipedia.org/wiki/Rich_Text_Format

Wenn es dir nur darum geht, den Font an der SelectionStart-Position zu ermitteln, dann ist das viel einfacher.

Im SelectionChanged-Ereignis, kannst du den SelectionFont abfragen, wenn die Einfügemarke an eine bestimmte Position gesetzt wird oder wenn das Auswählen eines Textes beginnt (also wenn SelectionLength = 0 oder 1 ist). Diesen Font musst du dann zwischenspeichern und auswerten.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 20.02.23 22:58

Hi Kuno,

Danke Dir für Deine Tips

Nur... wenn der Benutzer durch Doppelklick in der RTFBox ein Wort markiert, bekomme ich im SelChange keine .lenght kleiner 2, sondern gleich die Wortlänge und u.U. selFont=Nothing, wenn im Wort unterschiedliche Formatierungen bestehen.

Wie haben die Entwickler vom WordPad dieses Problem denn gelöst?
Da klappt es, wenn ich ein Wort (auch über Formatänderungen hinweg) markiere oder doppelklicke, dass dann FontName und -Size der ersten Selektionsstelle angezeigt werden.

Ich finde das sehr praktisch, wenn dem User in der Cobo_Schriftart und Cobo_Schriftgrösse die für die Caret-Position geltenden Einstellungen angezeigt werden.
Sogar im Font-Dialog fehlen mir diese Eigenschaften, um beim Öffnen des Dialogs in jedem Fall gleich die, an der Caret-Position geltenden Einstellungen anzuzeigen.

Den Wiki-Artikel habe ich auch gelesen. Aber wie viele andere Seiten, welche ich dazu gefunden habe, wird auch dort nicht auf Fontformatierung eingegangen.

Meine Bücher schweigen sich auch über dieses Thema aus.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 21.02.23 04:03

Ah, Korrektur...
Ich benutze eine das Programm "Wordpad+", das ich auf meinen Rechnern anstelle des originalen Wordpads installiert habe.
Nur dieses Programm zeigt bei Markierungen mit unterschiedlichen Formatierungen in der Schriftart-Combo die Font des ersten selektierten Zeichens an.
Das Original-Wordpad zeigt in diese Fall eine leere Combobox.text-Eigenschaft.
Dann scheint das wohl der Standard zu sein.
Und ich verkopfe mich deswegen zwei Tage lang, wie ich das nachahmen kann.

Dann mache ich es so, wie Du vorgeschlagen hast und kann auf das umständliche Header- und Text-Decodieren komplett verzichten.

Ach ja, ich dachte automatisch noch, ich nehme long-Variablen, um auch grosse Text-Objekte verarbeiten zu können.
Alte Denke halt...
Da muss ich mich wirklich noch an die neue Nomenklatur im VB.net gewöhnen.
Integer hat hier ja 4Bytes und nicht nur 2Bytes wie VBasic6.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 21.02.23 19:09

Erfolgsmeldung...

Danke Dir Kuno!

Jetzt funktionieren die Combos so, wie sie sollen.
So langsam wird das Programm tauglich.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 16.03.23 20:07

Hi Kuno,

jetzt habe ich Dein o.g. Schriftgrössen-Script benutzt, um die Schriftschnitte einer Selektion ohne erzwungene Fontänderung der gesamten Selektion setzen zu können.

Aber mit Regex habe ich bis heute noch nie Kontakt gehabt.

Mein Script:

    Private Sub ändereSelectedSchriftschnitt(sSchnitt As Integer)
 
        Dim rtb = tsc_TextEditor_RTFBox
 
        ' Selektion merken
        Dim rtbs = rtb.SelectionStart
        Dim rtbsl = rtb.SelectionLength
 
        If rtb.SelectionLength > 0 Then
 
            Dim rt = rtb.SelectedRtf
 
            ' Bold Start und Ende entfernen
            If (sSchnitt And 1) = 1 Or (sSchnitt And 1) = 0 Then
                For Each m As Match In Regex.Matches(rt, "\\b0", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length)
                Next
                For Each m As Match In Regex.Matches(rt, "\\b\s", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length)
                Next
                For Each m As Match In Regex.Matches(rt, "\\b", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length) 
                Next
            End If
 
            ' Italic Start und Ende entfernen
            If (sSchnitt And 2) = 2 Or (sSchnitt And 1) = 0 Then
                For Each m As Match In Regex.Matches(rt, "\\i0", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length)
                Next
                For Each m As Match In Regex.Matches(rt, "\\i\s", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length)
                Next
                For Each m As Match In Regex.Matches(rt, "\\i", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length) 
                Next
            End If
 
            ' Underline Start und Ende entfernen
            If (sSchnitt And 4) = 4 Or (sSchnitt And 1) = 0 Then
                For Each m As Match In Regex.Matches(rt, "\\ulnone", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length)
                Next
                For Each m As Match In Regex.Matches(rt, "\\ul\s", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length)
                Next
                For Each m As Match In Regex.Matches(rt, "\\ul", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length)
                Next
            End If
 
            ' Strikeout Start und Ende entfernen
            If (sSchnitt And 8) = 8 Or (sSchnitt And 1) = 0 Then
                For Each m As Match In Regex.Matches(rt, "\\strike0", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length)
                Next
                For Each m As Match In Regex.Matches(rt, "\\strike\s", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length)
                Next
                For Each m As Match In Regex.Matches(rt, "\\strike", _
                  RegexOptions.RightToLeft)
                    rt = rt.Remove(m.Index, m.Length) 
                Next
            End If
 
            ' Schriftschnitt am Anfang und Ende der Selektion setzen
            Dim n As Match
            n = Regex.Match(rt, "\\pard")
 
            ' Bold
            If (sSchnitt And 1) = 1 Then
                rt = rt.Insert(n.Index, $"\b") & rt & "\b0"
            End If
 
            ' Italic
            If (sSchnitt And 2) = 2 Then
                rt = rt.Insert(n.Index, $"\i") & rt & "\i0"
            End If
 
            ' Underline
            If (sSchnitt And 4) = 4 Then
                rt = rt.Insert(n.Index, $"\ul") & rt & "\ulnone"
            End If
 
            ' StrikeOut
            If (sSchnitt And 8) = 8 Then
                rt = rt.Insert(n.Index, $"\strike") & rt & "\strike0"
            End If
 
            ' In RTF übernehmen
            rtb.SelectedRtf = rt
 
            ' Selektion erneuern
            rtb.SelectionStart = rtbs
            rtb.SelectionLength = rtbsl
        End If
    End Sub
Ich konnte aber nicht herausfinden, wie ich die jeweils drei Suchbedingungen in den vier Schleifen in je eine Schleife mit der RegEx.matches-Abfrage packen kann.
Kannst Du mir hier vielleicht einen Tip geben?

Beste Grüsse
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: RTFBox Zeichen mit unterschiedlichen Fonts und Sizes selektieren und Font ändern 
Autor: Dideldum
Datum: 16.03.23 21:08

EDIT: "Or (sSchnitt And 1) = 0" muss jeweils natürlich "Or sSchnitt = 0" heissen
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel