| |

VB.NET - Ein- und UmsteigerRTFBox 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 |  |
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. |  |
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. |  |
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! |  |
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. |  |
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. |  |
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 |  |
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.  |  |
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? |  |
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. |  |
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. |  |
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. |  |
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. |  |
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. |  |
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 |  |
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  |  |
 | 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 |
  |
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevDTA 3.0 Pro 
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere Infos
|