AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RichEdit: Inhalt im Speicher halten?

Ein Thema von HJay · begonnen am 28. Okt 2010 · letzter Beitrag vom 31. Okt 2010
Antwort Antwort
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#1

RichEdit: Inhalt im Speicher halten?

  Alt 28. Okt 2010, 10:48
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.)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: RichEdit: Inhalt im Speicher halten?

  Alt 28. Okt 2010, 10:58
Vielleicht hilft dieser Thread Dir etwas weiter.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#3

AW: RichEdit: Inhalt im Speicher halten?

  Alt 28. Okt 2010, 11:09
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: RichEdit: Inhalt im Speicher halten?

  Alt 28. Okt 2010, 11:13
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#5

AW: RichEdit: Inhalt im Speicher halten?

  Alt 28. Okt 2010, 11:23
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)

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

Geändert von Satty67 (28. Okt 2010 um 11:38 Uhr)
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#6

AW: RichEdit: Inhalt im Speicher halten?

  Alt 28. Okt 2010, 11:52
Die TMemoryStreams zum Halten der Inhalte klappen gut. Ich kann leicht den Inhalt verschiedener TMemoryStream-Objekte abwechselnd in ein RichEdit laden. Danke!

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?

Geändert von HJay (28. Okt 2010 um 12:21 Uhr)
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#7

AW: RichEdit: Inhalt im Speicher halten?

  Alt 28. Okt 2010, 12:21
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?

Geändert von HJay (28. Okt 2010 um 13:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#8

AW: RichEdit: Inhalt im Speicher halten?

  Alt 30. Okt 2010, 00:51
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:

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

SendMessage(RichEdit, EM_STREAMIN, SF_RTF + SFF_SELECTION, lParam(@EditStream));
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: RichEdit: Inhalt im Speicher halten?

  Alt 30. Okt 2010, 10:43
Aber bitte nicht addieren, sondern verodern.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#10

AW: RichEdit: Inhalt im Speicher halten?

  Alt 31. Okt 2010, 17:16
@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.
  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 04:59 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