![]() |
RichEdit: Inhalt im Speicher halten?
Hi! Ich arbeite gerade zum ersten Mal mit RichEdit und habe zwei Anfängerfragen.
Aufgabensituation: Ich habe etliche RTF-Dateien, die Textbausteine darstellen und der Nutzer des Programms miteinander kombinieren darf. FRAGEN 1) In welcher Struktur empfehlen die Profis hier die RTF-Texte am besten im Speicher zu halten? Ich würde gerne bei Programmstart die kleinen RTFs alle in den Speicher lesen, da sie oft verwendet werden werden. Aber in unsichtbare RichEdits kommt mir blöde vor? Wie kann ich die Formatierungen erhalten, aber letztlich so was ähnliches wie ein TStrings-Objekt je Datei haben? 2) Per Knopfdruck kombiniert der Nutzer dann die Textbausteine, d.h. ich muss die RTF-Zeilen dem sichtbaren RichEdit hinzufügen. Wie kann ich dabei die Formatierung erhalten? Habe ich die nötigen Objekte und Methoden einfach nur nicht in der Hilfe gefunden? Komme mir schon dämlich vor... Danke im voraus! (PS: Delphi 6 Prof.) |
AW: RichEdit: Inhalt im Speicher halten?
Vielleicht hilft
![]() |
AW: RichEdit: Inhalt im Speicher halten?
Ja, prima Idee. Also ich halte einfach eine ObjectList von TStreams vorrätig mit den RichTexts. Das klingt eingängig, werde ich gleich mal probieren.
Wie fügt man nun aber einen Stream einem bestehenden RichEdit so hinzu, so dass der bestehende Inhalt des RichEdits erhalten bleibt udn um die neuen Zeilen erweitert wird? |
AW: RichEdit: Inhalt im Speicher halten?
Den alten Inhalt in einen weiteren Stream laden, dort den vorhandenen Streaminhalt hintendran kopieren und alles wieder zurück ins RichEdit. So würde ich es zumindest versuchen.
|
AW: RichEdit: Inhalt im Speicher halten?
Funktioniert SelText zum Einfügen von formatiertem RTF-Text? Befürchte ja fast nicht, aber falls doch in Kombination mit einem TStringStream:
Delphi-Quellcode:
€: da man für SelText Attribute definieren kann, wird wohl leider auch nur PlainText eingefügt (mit einem globalen Attribut-Satz)
RichEdit1.SelStart := InsertPosition;
RichEdit1.SelText := StringStream.DataString; Zitat:
|
AW: RichEdit: Inhalt im Speicher halten?
Die TMemoryStreams zum Halten der Inhalte klappen gut. Ich kann leicht den Inhalt verschiedener TMemoryStream-Objekte abwechselnd in ein RichEdit laden. Danke!
Zitat:
Code:
Die Prozedur ButtonAddAStream() funktioniert leider nicht. RichEdit enthält hinterher genau den gleichen Inhalt wie vorher, aber keineswegs wie gewünscht zusätzlich den Inhalt von AStream. Was mache ich falsch?
procedure TForm1.ButtonUseAStreamClick(Sender: TObject);
begin // funktioniert: Stellt Inhalt von AStream in RichEdit dar! AStream.Position := 0; RichEdit1.Lines.LoadFromStream(AStream); end; procedure TForm1.ButtonAddAStreamClick(Sender: TObject); var CSTream : TMemoryStream; begin // verändert den Inhalt nicht -- warum? CStream := TMemoryStream.Create; RichEdit1.Lines.SaveToStream(CStream); AStream.Position := 0; AStream.SaveToStream(CStream); CStream.Position := 0; RichEdit1.Lines.LoadFromStream(CStream); CStream.Free; end; |
AW: RichEdit: Inhalt im Speicher halten?
NACHTRAG:
Ich habe inzwischen die Ursache festgestellt: Ein RichText darf nur einmal die Konstruktion {\rtf1 ... enthalten. Beim Zusammenkopieren der beiden RichText-Streams werden aber logischerweise die beiden {\rtf}-Blöcke hintereinander kopiert und der zweite Block wird dann vom RichEdit einfach ignoriert. Daraus schließe ich, dass das bloße Zusammenführen der Memory-Streams nicht klappen wird. FRAGE: Wer hat eine Idee, wie man einfach zwei RTF-Texte, von denen einer in einem RichText-Objekt, der andere in einem TMemoryStream gehalten wird, zusammenzuführen? Am besten sogar an der aktuellen Caret-Positon einzufügen? |
AW: RichEdit: Inhalt im Speicher halten?
2 RichEdits kannst du mittels EM_STREAMOUT, EM_STREAMIN zusammenführen.
Ein Beispiel dafür findest du ![]() Zusätzlich noch diese Zeile ändern, damit der alte Inhalt nicht überschrieben wird:
Delphi-Quellcode:
ändern zu:
SendMessage(RichEdit, EM_STREAMIN, SF_RTF, lParam(@EditStream));
Delphi-Quellcode:
SendMessage(RichEdit, EM_STREAMIN, SF_RTF + SFF_SELECTION, lParam(@EditStream));
|
AW: RichEdit: Inhalt im Speicher halten?
Aber bitte nicht addieren, sondern verodern.
|
AW: RichEdit: Inhalt im Speicher halten?
@toms: Danke! Hat geklappt. Ich kann jetzt direkt einen TMemoryStream in ein TRichEdit hineinkopieren, so dass er an der Cursorposition eingefügt wird. Ich habe noch einige ähnliche Aufrufe im Netz gefunden und eine "eingedampfte" Prozedur erzeugt, die jetzt griffig und geradlinig ist.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz