Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Mehrere RTF-Dateien in ein RichEdit laden (unten anhängen) (https://www.delphipraxis.net/131250-mehrere-rtf-dateien-ein-richedit-laden-unten-anhaengen.html)

TheMiller 21. Mär 2009 09:38


Mehrere RTF-Dateien in ein RichEdit laden (unten anhängen)
 
Hallo,

wie einige sicher wissen, hatte ich mit dem Speichern von RTF-Dateien in eine XML-Datei Probleme. Die Steuerzeichen der RTF (wegen der Formatierung) haben sich mit XML nicht vertragen, sodass es immer entweder zu Parser-Problemen in der XML oder zu Einlese-Problemen in das RichEdit kam.

Das konnte ich nun mit großer Hilfe einiger bemühter User hier lösen.

Und zwar wird dafür ein StringStream benutzt, der die RTF einliest. Um sie im RichEdit korrekt darzustellen (so meine Erfahrung), muss über die Funktion

Delphi-Quellcode:
Lines.Add.LoadFromStream
geladen werden und die RTF wird angezeigt.

Nur folgendes Problem. Wenn ich in den StringStream mehrere RTF-Dateien einlese und dann so ins RichEdit kopiere, zeigt er mir immer nur die erste Datei an, obwohl der StringStream nachweislich alle Dateien beinhaltet und die Größe des Streams wächst.

Wenn ich die Position des StringStreams auf das Ende einer RTF-Datei setze und ab da alles bis zum Ende kopiere, zeigt er mir nicht mehr die erste RTF-Datei an, sondern die nächste bis zu deren Ende.

Ich vermute, dass es am Schluss ein Steuerzeichen gibt, was entweder dem StringStream oder der RichEdit eine Art "Stopp-Anweisung" gibt, sodass ich nicht so einfach mehrere RTFs in einem RichEdit untereinander anzeigen lassen kann.

Wie kann ich das umgehen?

Ich bedanke mich - wie immer - im Voraus

PS: Den anderen Beitrag (Formatierung eines RichEdit speichern) habe ich um diese Problematik hier gekürzt und für das neue Problem diesen Thread aufgemacht.

Jürgen Thomas 21. Mär 2009 09:55

Re: Mehrere RTF-Dateien in ein RichEdit laden (unten anhänge
 
Hallo,

tut mir leid, das wird erheblich aufwändiger und ist keinesfalls mit ein paar String-Operationen oder Manipulationen der Lines- oder Text-Eigenschaft zu erledigen.

Ein RTF-Text besteht aus '{' <header> <document> '}'. Du müsstest also sicherstellen, dass sich die header-Bereiche nicht widersprechen. Es gibt Möglichkeiten, innerhalb eines Textes mehrere document-Bereiche zu verknüpfen. Aber dazu musst Du die einzelnen Dateien zunächst analysieren.

Siehe z.B. RTF-Spezifikation. Das ist zwar nicht die aktuellste Version, sollte aber genügend Informationen liefern.

Jürgen

mjustin 21. Mär 2009 10:22

Re: Mehrere RTF-Dateien in ein RichEdit laden (unten anhänge
 
Zitat:

Zitat von DJ-SPM

Nur folgendes Problem. Wenn ich in den StringStream mehrere RTF-Dateien einlese und dann so ins RichEdit kopiere, zeigt er mir immer nur die erste Datei an, obwohl der StringStream nachweislich alle Dateien beinhaltet und die Größe des Streams wächst.

Die EM_STREAMIN message aus der Win32 API ermöglicht es, weitere Inhalte in ein bestehendes RichEdit einzufügen.

Eine Quick & Dirty Lösung wäre die Verwendung der Zwischenablage. - das aber nur der Vollständigkeit halber, manchmal ist Q&D ja auch gut genug :)

Eventuell weitere hilfreiche Informationen gibt es hier:

http://home.att.net/~robertdunn/Yacs.html

Zitat:

TRichEditRawRtf: Need to copy formatted text from one TRichEdit control to another? Want to insert RTF format codes directly into a TRichEdit control? This class makes it simple.
Cheers,

TheMiller 21. Mär 2009 11:08

Re: Mehrere RTF-Dateien in ein RichEdit laden (unten anhänge
 
Hallo,

Q&D wäre ja - in diesem Fall - auch ok. Ist nicht so DAS Projekt ;)

Meinst du also, dass ich den Inhalt der RTFs in die Zwischenablage kopiere und von dort aus in das eigentliche RichEdit. Stimmt's? Also nacheinander und einfach anhängen?

Was die Message angeht: Das hab ich nicht ganz verstanden. Hab es mir in der MSDN angeschaut. Kannst du mir was dazu erklären?

mjustin 21. Mär 2009 11:55

Re: Mehrere RTF-Dateien in ein RichEdit laden (unten anhänge
 
Zitat:

Zitat von DJ-SPM
Hallo,

Q&D wäre ja - in diesem Fall - auch ok. Ist nicht so DAS Projekt ;)

Meinst du also, dass ich den Inhalt der RTFs in die Zwischenablage kopiere und von dort aus in das eigentliche RichEdit. Stimmt's? Also nacheinander und einfach anhängen?

Genau, das ist die billige Lösung ;)
Zitat:

Was die Message angeht: Das hab ich nicht ganz verstanden. Hab es mir in der MSDN angeschaut. Kannst du mir was dazu erklären?
Einen Link kann ich noch angeben:

https://forums.codegear.com/message....essageID=40863

Dort ist auch kompletter Source Code zu finden, der EM_STREAMIN verwendet - jedoch nicht von mir getestet.

Cheers,

TheMiller 21. Mär 2009 12:19

Re: Mehrere RTF-Dateien in ein RichEdit laden (unten anhänge
 
Wow vielen Dank.

Werde beides mal probieren. Allerdings muss ich jetzt ein bissl renovieren *gr*

;)

Danke

mani64 15. Apr 2009 12:43

Re: Mehrere RTF-Dateien in ein RichEdit laden (unten anhänge
 
Zitat:

Zitat von mjustin
Die EM_STREAMIN message aus der Win32 API ermöglicht es, weitere Inhalte in ein bestehendes RichEdit einzufügen.



Genau dies klappt bei mir leider nicht oder ich bekomme es nicht hin.

Ich arbeite mit Delphi5 unter Windows95 - mein Programm soll später allerdings unter WindowsXP laufen.

Ich möchte gerne den Text einer Datei kontinuierlich einlesen. Die Datei selbst ist ein Logfile eines PC-Spieles mit speziellen Formatierungen (Escape-Sequenzen) für Farben etc. Dafür habe ich ein eigenes TConversion erstellt, das auch prima funktioniert - beim ersten Öffnen der Datei.
Mithilfe eines Timers überprüfe ich dann die Dateilänge und möchte eben, sobald das PC-Spiel wieder etwas in den Logfile geschrieben hat, die neuen Zeilen an meine RTF-Datei auf dem Bildschirm einfach unten anhängen, aber das bekomme ich irgendwie nicht hin.

Verwende ich richedit.lines.loadfromstream (diese Prozedur sendet ja eine EM_STREAMIN-Message), dann wird der neue Text nicht angehängt, sondern er ersetzt den vorher eingelesenen.

Ich denke, es gibt die Möglichkeit, die Datei in einem zweiten RichEdit zu öffnen, die hinzu gekommenen Zeilen ins Clipboard zu kopieren und dann in das ursprünglich RichEdit zu übertragen (das hab ich noch nicht ausprobiert). Aber es muss doch auch anders gehen, nach der Aussage von mjustin.

Oder ist es nicht möglich, direkt aus dem Logfile in das Richedit einzulesen? Muss ich erst die neuen Zeilen in ein zweites Richedit einlesen, dann in einem Stream ablegen und danach diesen Stream in das alte Richedit lesen? Das wäre ja so ähnlich wie über das Clipboard. Auch so hab ich es noch nicht ausprobiert.
Meine Befürchtung dabei ist nämlich, dass auch in diesem Fall der Text nicht angehängt wird, sondern den bereits bestehenden ersetzt, wenn ich mit richedit.lines.loadfromstream einlese.
Ich sehe auch keinen großen Sinn darin, eine eigene loadfromstream-Methode zu programmieren, weil ich nicht wüsste, welche Änderungen ich gegenüber der in Delphi bereits vorhandenen machen müsste, um ein anderes Ergebnis zu erzielen.

Wie kann ich die Aufgabe lösen, die neuen Zeilen einfach an den bestehenden Text anzuhängen?

p80286 15. Apr 2009 12:56

Re: Mehrere RTF-Dateien in ein RichEdit laden (unten anhänge
 
Hallo mani64,

das .LoadfromFile liest ja eine vollständige Datei ein und "überschreibt" vorhandene Daten.
Wenn Du nur die letzten x Zeilen dazu addieren willst, solltest Du mit .Lines.Addstrings arbeiten.

Gruß
K-H

mani64 15. Apr 2009 14:51

Re: Mehrere RTF-Dateien in ein RichEdit laden (unten anhänge
 
Hallo,

ja, das scheint wohl so zu sein. Ich verwende zwar loadfromstream, aber die Prozedur wird ja von loadfromfile auch aufgerufen. Allerdings wird in dem von mjustin angeführten Link was anderes behauptet, nämlich es sei möglich, statt über das Clipboard auch über einen MemoryStream und mit loadfromstream Text in eine bestehende Datei einzufügen. Jedoch klappt es auch mit Add oder AddStrings nicht. Zwar wird der Text eingefügt, aber ohne jede Formatierung. Bliebe letztendlich doch nur die Möglichkeit mit dem Clipboard.



Edit:
Es funktioniert tatsächlich! Die Routine unter diesem Link Delphi About.com tut genau das, was ich will. Ich konnte einfach nicht glauben, dass es so gehen kann, weil die Routine genau so aussieht wie loadstream von Delphi. Aber es klappt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz