Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - JEDI's TJvRichEdit und SelAttributes.UnderlineColor
galagher - Mi 21.08.24 15:41
Titel: JEDI's TJvRichEdit und SelAttributes.UnderlineColor
Hallo!
Bei TJvRichEdit gibt's die Eigenschaft
SelAttributes.UnderlineColor. Das Einstellen einer von der Textfarbe verschiedenen Unterstreichungsfarbe funktioniert zwar grundsätzlich, jedoch bleiben weder Unterstreichung noch Unterstreichungsfarbe dauerhaft erhalten. Aber irgendwie muss TJvRichEdit den dazu nötigen Steuercode ja zumindest während der Darstellung halten!
Wie komme ich an den entsprechenden Steuercode heran, bzw. weiss jemand, wie der aussieht? Gegebenenfalls füge ich ihn eben in den rtf-Code an der richtigen Position ein. So denke ich mir das jedenfalls. Hat jemand so etwas schon gemacht?
//Edit: Das wird tatsächlich nur gezeichnet! Es gibt keinen rtf-Code, der irgendwelche Steuerzeichen enthält, die die Unterstreichung und/oder die Farbe der Unterstreichung darstellt. Es gibt noch nicht mal mehr eine Unterstreichung, sobald man
UnderlineColor anwendet.
Und wozu ist das nun gut? :nixweiss:
Hier
https://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvTextAttributes.UnderlineColor wird genau dieses Verhalten beschrieben:
Zitat: |
If you stream out the text as RTF, underlined text with a color other than ucBlack is streamed out as non underlined text. |
Gibt's da keine Lösung? Wäre zu schön, bunte Unterstreichungen zu haben!
galagher - Do 22.08.24 16:08
Meine JvRichEdit.pas und die Datei aus deinem Link unterscheiden sich: In meiner Datei kommt RICHED20.DLL gar nicht vor, und Zeile 1353 ist eine Leerzeile. (Es gibt noch andere Unterschiede). Aber auch mit der aus deinem Link funktioniert es nicht.
Speichere ich mit Word, klappt es. Beim Öffnen einer mit Word gespeicherten Datei mit meinem Programm funktioniert es ebenfalls.
WordPad erzeugt zwar wesentlich einfacheren rtf-Code als Word, unterstützt aber keine farbigen Unterstreichungen.
Es bleibt dabei: Weder die Steuerzeichen für die Unterstreichung (zB. \ul) noch die Steuerzeichen für die Unterstreichungsfarbe (zB. \ulc5) werden mit SaveToFile abgespeichert.
Für Vorschläge bin ich offen!
galagher - Fr 23.08.24 09:03
Gezeichnet wird es ja, aber nicht in den rtf-Code geschrieben. Schaue ich mir aber heute oder morgen an!
Th69 hat folgendes geschrieben : |
Du benutzt Windows 10 oder 11, oder? Bei mir unter Window 10 hat die "MSFTEDIT.DLL" die Version 8.5. |
Ja, ich habe Windows 10.
Auch die Version meiner MSFTEDIT.DLL sehe ich nach und melde mich dann wieder!
Th69 - Fr 23.08.24 09:29
Da hast du recht, dann sollte es ja auch nicht angezeigt werden.
Dann wird es wohl ein Fehler in der "MSFTEDIT.DLL" sein (evtl. benutzt Word eine andere).
Ich habe (während des Schreibens jetzt) gerade bei mir mal den Test gemacht und die obige "TestDocument2.rtf" mit WordPad geladen und wieder neu abgespeichert (s. Anhang) und tatsächlich sind dann keine "\ulc"-Codes mehr drin.
Da kann ich leider nur "sorry" sagen.
galagher - Fr 23.08.24 10:24
Th69 hat folgendes geschrieben : |
Ich habe (während des Schreibens jetzt) gerade bei mir mal den Test gemacht und die obige "TestDocument2.rtf" mit WordPad geladen und wieder neu abgespeichert (s. Anhang) und tatsächlich sind dann keine "\ulc"-Codes mehr drin. |
WordPad kennt keine vom Text verschiedenfarbige Unterstreichung, also ist es verständlich, dass dann die "\ulc"-Codes fehlen.
Und auch "\ul" ist dann weg. Das deckt sich mit:
Zitat: |
If you stream out the text as RTF, underlined text with a color other than ucBlack is streamed out as non underlined text. |
Mich wundert aber, dass JvRichEdit die Darstellung farbiger Unterstreichungen unterstützt und solche auch aus einer Datei einlesen kann (wenn dort der Code stimmt!), es aber nicht speichert, da es den entsprechenden Code einfach nicht schreibt. \ul und \ulcN allein genügen da nicht, das muss mehr sein.
Deine Beispieldatei funktioniert, wenn ich sie aber speichere, sind \ul und \ulcN weg.
Wie kann ich das umgehen, patchen oder was weiss ich?
Th69 - Fr 23.08.24 11:01
Auch Wordpad verwendet nur die "MSFTEDIT.DLL" (habe ich gerade noch mal mit dem "Process Explorer" überprüft) und dessen Rich Edit Control, genauso wie "TJvRichEdit".
Warum Wordpad die verschiedenen UnderlineColor nicht anzeigt, weiß ich allerdings nicht (evtl. eine Konfigurationseinstellung)?
Aber es scheint eben so zu sein, daß beim Schreiben diese nicht rausgeschrieben wird (wahrscheinlich, weil es von den MS-Produkten nicht verwendet wurde und niemanden dies bisher aufgefallen ist bzw. dieser Bug keine hohe Priorität hat).
Änderungen am TJvRichEdit bringen nichts, da diese ja einfach die Funktionen (per Messages) des Rich Edit Controls aufruft (das Speichern passiert einfach per
SendMessage(..., EM_STREAMOUT, ...) [
https://github.com/project-jedi/jvcl/blob/ded82d43c9f13fd0dfe52a1559d4c01479da936a/jvcl/run/JvRichEdit.pas#L6060]).
galagher - Fr 23.08.24 21:26
Th69 hat folgendes geschrieben : |
Aber es scheint eben so zu sein, daß beim Schreiben diese nicht rausgeschrieben wird (wahrscheinlich, weil es von den MS-Produkten nicht verwendet wurde und niemanden dies bisher aufgefallen ist bzw. dieser Bug keine hohe Priorität hat). |
Ich habe mit Word eine Datei erstellt, mit Text in der Farbe clWindowsText und habe diesen rot doppelt unterstrichen. Dann habe ich die Datei mit Wordpad geöffnet und siehe da: Schwarzer Text, rot unterstrichen. Mit Wordpad gespeichert und damit gleich wieder geöffnet - rot unterstrichener schwarzer Text. Wordpad kann das also doch.
Quelltext
1: 2: 3: 4: 5:
| {\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang3079\deflangfe3079{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}} {\colortbl ;\red255\green0\blue0;} {\*\generator Riched20 10.0.19041}\viewkind4\uc1 \pard\nowidctlpar\sa200\sl276\slmult1\ulc1\uldb\f0\fs22\lang7 Test\par } |
Öffne ich die Datei hingegen mit meine Programm, klappt es nicht. JvRichEdit kann farbig unterstrichenen Text definitiv nicht einlesen. Aber immerhin bleibt die Unterstreichung als solche erhalten, aber eben in der Textfarbe.
Th69 - Sa 24.08.24 08:44
Ja, deine RTF-Datei wird bei mir auch in Wordpad mit andersfarbiger Unterstreichung dargestellt (k.A. was ich bei meiner RTF-Datei anders gemacht habe?).
Aber warum es bei deinem JvRichEdit nicht angezeigt wird, kann ich mir nicht erklären. Irgendwie muß es zwar eine Erklärung für den von dir eingangs zitierten Text geben, aber ich wüsste nicht, warum.
galagher - Sa 24.08.24 10:28
Th69 hat folgendes geschrieben : |
Aber warum es bei deinem JvRichEdit nicht angezeigt wird, kann ich mir nicht erklären. Irgendwie muß es zwar eine Erklärung für den von dir eingangs zitierten Text geben, aber ich wüsste nicht, warum. |
Ich denke, die Zeile für die Unterstreichungsfarbe wird von JvRichEdit ignoriert:
Quelltext
1:
| {\colortbl ;\red255\green0\blue0;} |
Da nun aber die Textfarbe offenbar nirgendwo gespeichert ist, wird eben einfach die Vorgabefarbe clWindowText verwendet. Denn wenn ich die Textfarbe mit Wordpad auf zB. Blau ändere, sieht das so aus:
Quelltext
1:
| {\colortbl ;\red0\green0\blue255;\red255\green0\blue0;} |
Text = blue255, Unterstreichnung = red255
JvRichEdit lädt aber alles in Blau, denn, wie gesagt, die Unterstreichungsfarbe wird ignoriert. Egal, was man macht.
Und jetzt die Frage: Wie könnte eine "Drumherumlösung" aussehen?
Ja, ich weiss, irgendwie abspeichern, was farbig unterstrichen ist und nach dem Öffnen mit JvRichEdit den Text durchgehen, schauen, wo die "gemerkten" Textstellen sind und das dann mit
SelAttributes.UnderlineColor einfärben. Ist aber nicht sehr bequem, denn dann müsste man ja auf jede Änderung des Textes reagieren, damit's wieder übereinstimmt. Naja... Keine sehr attraktive Lösung!
Schönes Wochenende!
Th69 - Sa 24.08.24 11:00
Sorry, ich wüsste keinen eleganten Workaround.
galagher - Mo 26.08.24 20:54
Th69 hat folgendes geschrieben : |
Sorry, ich wüsste keinen eleganten Workaround. |
Ich auch nicht. Wenn es nur nicht geschrieben wird, könnte man den rtf-Code ja reinschummeln, aber es wird ja auch nicht gelesen, und das kann man, so wie's aussieht, nicht beeinflussen.
Jede Lösung mit einer extra Datenstruktur, egal, ob TStringList oder Array, erfordert einem ziemlichen Aufwand, und das nur für bunte Linien!
Ich geb's auf!
galagher - Di 03.09.24 09:56
Eine Möglichkeit besteht darin, im Text sozusagen "verborgen" Zeichen unterzubringen, die den Beginn und das Ende von solcherart unterstrichenem Text angeben. Mit "verborgen" meine ich, 1 Pixel Schriftgröße, Schriftfarbe = Hintergrundfarbe und hochgestellt - also so winzig und unauffällig wie möglich. Also zB. < und > als Beginn und Ende.
Hidden kann man nicht verwenden, da die Zeichen dann ja fehlen.
Besser sind natürlich Sonderzeichen, die im Text normalerweise nicht vorkommen.
Zum Spaß habe ich das jetzt ausgebaut. Nach dem Zeichen für "Beginn" folgt eine Zahl, die die Unterstreichungsfarbe angibt, zB. 5 für rot. Nach dem Einlesen des rtf-Textes diesen Zeichen für Zeichen durchgehen und auf besagte Beginn- und Ende-Zeichen reagieren.
Klappt perfekt!
Zugegebenermassen ist das nicht gerade professionell, man freut sich aber, wenn's dann bunt wird! :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!