Autor Beitrag
Gagga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95

Win 11
Delphi 12 Athen Pro
BeitragVerfasst: Di 05.05.20 19:52 
Hallo!

Hat jemand einen Tipp, wie ich RTF-Text mit Formatierungscode wieder als lesbaren, formatierten Text in das Richedit bekomme?

Beispiel:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\fswiss\fprq2\fcharset0 Tahoma;}{\f2\fnil\fcharset0 Tahoma;}}
{\colortbl ;\red255\green0\blue0;}
\viewkind4\uc1\pard\ltrpar\nowidctlpar\sa200\sl276\slmult1\b\f0\fs28 Hallo!\par
\b0\fs22 Kann keiner \cf1\b helfen\cf0\b0 ?\b\par
\pard\ltrpar\nowidctlpar\b0\f1\fs16\par
\pard\ltrpar\f2\par
}

Normalerweise sollte das mit lines.loadfromfile klappen, aber in dem Fall nicht. Der Code ist das Ergebnis von

ausblenden Delphi-Quelltext
1:
2:
3:
4:
RE1.Lines.SaveToStream(stream);
str := StringReplace(stream.DataString,'einer''keiner', [rfReplaceAll, rfIgnoreCase]);
RE1.text := str;
RE1.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+ 'test23.rtf');

Ich versuche den Weg über Stream, da im Text formatierte Platzhalter sind, deren Ersetzungen die Formatierungen übernehmen sollen.

Habe alternativ noch eine Routine, in der die Textattribute gespeichert werden, wollte es aber mal auf diese Weise probieren.

Gruß
Gagga

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 06.05.20 08:52 
Funktioniert es denn ohne die Text-Zuweisung?
Und überprüfe mal, ob PlainText weiterhin auf false steht.
Gagga Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95

Win 11
Delphi 12 Athen Pro
BeitragVerfasst: Mi 06.05.20 19:48 
Hallo!
Zitat:
Funktioniert es denn ohne die Text-Zuweisung?
Die Frage verstehe ich nicht.
Zitat:
...überprüfe mal, ob PlainText weiterhin auf false steht.
Ja, steht sie.

Das verrückte ist, dass dann, wenn ich den Inhalt der Datei test23.rtf mit dem Formatierungscode nochmal über einen normalen Text-Editor als Datei speicher - egal mit welcher Endung - kann ich sie im selben Programm als rtf-Datei öffnen - also mit formatiertem Text.

Dann kann doch mit dem Speichern über Lines.SaveToFile... etwas nicht stimmen, oder?

Gruß
Gagga
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 07.05.20 08:33 
Ich meine, wenn du nur SaveToFile aufrufst und dann wieder mit LoadFromFile einliest?

Evtl. stimmt das Encoding nicht beim Abspeichern (den kannst du als 2. Parameter bei beiden Funktionen angeben), s.a. Byte Order Mark (BOM)?!
Gagga Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95

Win 11
Delphi 12 Athen Pro
BeitragVerfasst: Do 07.05.20 12:09 
SaveToFile und LoadFromFile klappt. Aber wenn ich aus dem RichEdit maile, macht er aus € ein ?. Die Zeichen < und > werden ignoriert, da kommen Leerstellen an. Auch das ist ein Thema, dass ich vor Wochen verfolgt hatte, auf charset ISO-irgendwas gestoßen bin, aber erstmal ad acta gelegt habe.

Offensichtlich gibt es da aber einen Zusammenhang. Muss ich meinen Richedit-Inhalt erst einmal in einen anderen Unicode-Zeichensatz wandeln und wenn ja, wie?

Gruß
Gagga

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 07.05.20 13:09 
Ja, das hat dann eindeutig etwas mit dem Encoding (Zeichenkodierung) zu tun.
Probiere mal UTF-8 als Encoding (sowohl für SaveToFile als auch LoadFromFile): Verwendung von TEncoding für Unicode-Dateien

Und beim Mailen mußt du auch noch das Encoding passend angeben (beim Content-Type noch zusätzlich charset=UTF-8): Not able to send UTF-8 email using delphi indy

Edit: Und bei SaveToStream selbstverständlich auch das Encoding angeben (wichtig ist halt, daß du durchgängig ein einheitliches Encoding benutzt).

PS: Ich habe gerade selber einen MDI Text-Editor geschrieben (von ehemals C++ nach C# portiert), mit dem man das Encoding ermitteln bzw. beim Abspeichern ändern kann. ;-)

Für diesen Beitrag haben gedankt: Gagga
Gagga Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95

Win 11
Delphi 12 Athen Pro
BeitragVerfasst: Do 07.05.20 17:38 
Also das zeichenkonforme Mailen klappt mit ContentType := 'text/plain; charset=UTF-8'und ContentType := 'text/html; charset=UTF-8'.

Das Problem mit dem RichEdit-Feld habe ich jetzt auch gelöst, nachdem ich ewig mit den Parametern beim Enconding experimentiert habe. Wie häufig, ist die Lösung ganz trivial. In dem Code im Ausgangspost
ausblenden Delphi-Quelltext
1:
2:
3:
4:
RE1.Lines.SaveToStream(stream);
str := StringReplace(stream.DataString,'einer''keiner', [rfReplaceAll, rfIgnoreCase]);
RE1.text := str;
RE1.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+ 'test23.rtf');

muss PlainText vor dem Speichern auf true gestellt werden und vor dem Laden auf false.

Dann funzzt es.

Wieder einmal herzlichen Dank an Dich, Th69!

Gruß
Rüd