Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2532
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 21.08.24 15:41 
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 wiki.delphi-jedi.org...butes.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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4788
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 22.08.24 08:59 
Das Steuerzeichen für Underline Color ist "\ulcN" (wobei N dann der Farbcode ist).

Es wird seit mind. RTF 1.6 unterstützt, s. Zeile 4780.

Die von dir zitierte Einschränkung kann ich allerdings nicht nachvollziehen, denn laut TJvRichEdit wird "Rich Edit 3.0" verwendet (die Versionsnummer hat nichts mit der RTF-Version zu tun) und laut Informationen zu Rich Edit-Steuerelementen unterstützt Rich Edit Version 3.0 dieses Steuerzeichen:
Zitat:
Unterstreichung
Unterstrichener Text kann mit einer von 15 Dokumentoptionen für Unterstrichsfarben markiert werden.

Und laut JvRichEdit.pas (s. Zeile 1353 und Zeile 7750) wird einfach die auf dem System befindliche "MSFTEDIT.DLL" geladen (also mindestens die "Rich Edit Version 4.1"). Und nur, wenn diese nicht geladen werden kann, wird auf "RICHED32.DLL" bzw. "RICHED20.DLL" zurückgegriffen (es sollten alle 3 DLLs unter Windows/System32 vorhanden sein).

Edit: Ich habe mal selber eine RTF-Datei erzeugt (und dann händisch angepaßt), s. Anhang (mußt nur ".txt" nach dem herunterladen wieder entfernen).
Die verschiedenen Underline-Typen werden (getestet mit WordPad) unterstützt, aber die UnderlineColor wird nicht angezeigt (sondern entspricht immer der Textfarbe).

Edit2: Ich habe es gerade mal mit dem aktuellen Word ausprobiert, und da sehe ich die verschiedenen UnderlineColors!
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2532
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4788
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 23.08.24 08:59 
Kannst du denn die JvRichEdit.pas debuggen und schauen, was bei TJvTextAttributes.SetUnderlineColor passiert? Evtl. wird bei dir die falsche DLL geladen und die Abfrage
ausblenden Delphi-Quelltext
1:
2:
if RichEditVersion < 3 then
  Exit;

führt dazu, daß der weitere Code nicht ausgeführt wird. Und danach dann in InitRichEditDll schauen, welche DLL wirklich geladen wird.

Du benutzt Windows 10 bzw. 11, oder? Bei mir unter Windows 10 hat die "MSFTEDIT.DLL" die Version 8.5.


Zuletzt bearbeitet von Th69 am Fr 23.08.24 09:04, insgesamt 2-mal bearbeitet
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2532
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 23.08.24 09:03 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Kannst du denn die JvRichEdit.pas debuggen und schauen, was bei TJvTextAttributes.SetUnderlineColor passiert? Evtl. wird bei dir die falsche DLL geladen
Gezeichnet wird es ja, aber nicht in den rtf-Code geschrieben. Schaue ich mir aber heute oder morgen an!

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4788
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
Einloggen, um Attachments anzusehen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2532
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 23.08.24 10:24 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4788
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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, ...)).


Zuletzt bearbeitet von Th69 am Sa 24.08.24 07:36, insgesamt 2-mal bearbeitet
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2532
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 23.08.24 21:26 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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.

ausblenden 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.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4788
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2532
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 24.08.24 10:28 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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:
ausblenden 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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4788
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 24.08.24 11:00 
Sorry, ich wüsste keinen eleganten Workaround.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2532
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 26.08.24 20:54 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2532
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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! :)

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!