AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Mehrere RTF-Dateien in ein RichEdit laden (unten anhängen)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von TheMiller · begonnen am 21. Mär 2009 · letzter Beitrag vom 15. Apr 2009
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

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

  Alt 21. Mär 2009, 09:38
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

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.
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

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

  Alt 21. Mär 2009, 09:55
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#3

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

  Alt 21. Mär 2009, 10:22
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,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#4

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

  Alt 21. Mär 2009, 11:08
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?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#5

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

  Alt 21. Mär 2009, 11:55
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,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#6

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

  Alt 21. Mär 2009, 12:19
Wow vielen Dank.

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



Danke
  Mit Zitat antworten Zitat
mani64

Registriert seit: 8. Apr 2009
49 Beiträge
 
Delphi 5 Professional
 
#7

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

  Alt 15. Apr 2009, 12:43
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?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

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

  Alt 15. Apr 2009, 12:56
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
  Mit Zitat antworten Zitat
mani64

Registriert seit: 8. Apr 2009
49 Beiträge
 
Delphi 5 Professional
 
#9

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

  Alt 15. Apr 2009, 14:51
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 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