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/)
-   -   RichEdit: Inhalt im Speicher halten? (https://www.delphipraxis.net/155551-richedit-inhalt-im-speicher-halten.html)

HJay 28. Okt 2010 10:48

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

DeddyH 28. Okt 2010 10:58

AW: RichEdit: Inhalt im Speicher halten?
 
Vielleicht hilft dieser Thread Dir etwas weiter.

HJay 28. Okt 2010 11:09

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?

DeddyH 28. Okt 2010 11:13

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.

Satty67 28. Okt 2010 11:23

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:
RichEdit1.SelStart := InsertPosition;
RichEdit1.SelText := StringStream.DataString;
€: da man für SelText Attribute definieren kann, wird wohl leider auch nur PlainText eingefügt (mit einem globalen Attribut-Satz)

Zitat:

Zitat von DeddyH (Beitrag 1058311)
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.

Ein Insert wird dann halt etwas kompliziert, wegen der nicht so leicht bestimmbaren Position (ist ja jede Menge Formatierungscode mit im Text). Aber wird wohl die Richtung sein, in der man sich rantasten muss. Ausnahme, die Textblöcke müssen nicht speziell formatiert sein...

HJay 28. Okt 2010 11:52

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:

Zitat von DeddyH (Beitrag 1058311)
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.

Hm, das schaffe ich leider nicht. Ich habe aber auch nicht so viel Erfahrungen mit TMemoryStream. Ich habe es so probiert:

Code:
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;
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?

HJay 28. Okt 2010 12:21

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?

toms 30. Okt 2010 00:51

AW: RichEdit: Inhalt im Speicher halten?
 
2 RichEdits kannst du mittels EM_STREAMOUT, EM_STREAMIN zusammenführen.

Ein Beispiel dafür findest du hier:

Zusätzlich noch diese Zeile ändern, damit der alte Inhalt nicht überschrieben wird:

Delphi-Quellcode:
SendMessage(RichEdit, EM_STREAMIN, SF_RTF, lParam(@EditStream));
ändern zu:

Delphi-Quellcode:
SendMessage(RichEdit, EM_STREAMIN, SF_RTF + SFF_SELECTION, lParam(@EditStream));

DeddyH 30. Okt 2010 10:43

AW: RichEdit: Inhalt im Speicher halten?
 
Aber bitte nicht addieren, sondern verodern.

HJay 31. Okt 2010 17:16

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 08: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