![]() |
Mit SaveToFile Daten an eine Datei anhängen?
Bin immer noch bei RichEdit :?
Ist es möglich, mit SaveToFile den Inhalt eines Richedit-Feldes an eine vorhandene Datei anzuhängen? Und wenn nein, wie könnte ich das sonst realisieren? Mit append hab ichs schon versucht, leider habe ich es so aber noch nicht hinbekommen, dass die Formatierungen mitgespeichert werden. Dank im Voraus! :) |
Re: Mit SaveToFile Daten an eine Datei anhängen?
Öffne einen TFileStream mit der Datei, mach ein Seek ans Ende und benutze SaveToStream.
|
Re: Mit SaveToFile Daten an eine Datei anhängen?
Das wird nicht gehen (denke ich). Ich glaube, Du musst den Inhalt der Datei in ein TRichMemo einlesen, den Text hinten ran kleben und dann alles wieder abspeichern... Du kannst Dir auch die RTF-Datei parsen (naja, die Präambel extrahieren reicht), dann den Text hintenran und alles mit der Präambel zusammen wieder abspeichern: RTF ist ja nur Text...
|
Re: Mit SaveToFile Daten an eine Datei anhängen?
:wiejetzt: Bitte, bitte, könnt ihr das nochmal etwas genauer erklären? Am besten mit Delphi-Code?
|
Re: Mit SaveToFile Daten an eine Datei anhängen?
Hallo :hi:
Von welchen Typ ist denn die Datei, an die du den Text aus deinem RichEdit ranhängen möchtest. Das wäre auch noch recht hilfreich. :) MfG freak |
Re: Mit SaveToFile Daten an eine Datei anhängen?
:hi: Hallo zurück freak4fun
Es handelt sich um eine RTF-Datei. |
Re: Mit SaveToFile Daten an eine Datei anhängen?
.... uuups, das hab' ich ja voll verpeilt.
Du nimmst am besten ein zweites RichEdit-Control (versteckt) und diese Routine:
Delphi-Quellcode:
Und dann gehst du etwa wie folgt vor (Pseudocode):
uses
RichEdit; // Hilfsroutine für AddRtfFromStream function _AddRtfCallback(dwCookie: Longint; pbBuff: PByte; cb: Longint; var pcb: Longint): Longint; stdcall; begin try Result := 0; pcb := TStream(dwCookie).Read(pbBuff^, cb); except Result := 1; end; end; // Ersetzt die aktuelle Auswahl durch den Inhalt des Streams procedure AddRtfFromStream(RichEdit: TCustomRichEdit; Stream: TStream); var EditStream: TEditStream; begin EditStream.dwCookie := LongInt(Stream); EditStream.dwError := 0; EditStream.pfnCallback := @_AddRtfCallback; RichEdit.Perform(EM_STREAMIN, SF_RTF + SFF_SELECTION, LongInt(@EditStream)); if EditStream.dwError <> 0 then raise Exception.Create('RichEdit operation fehlgeschlagen!'); end;
Delphi-Quellcode:
RichEdit2.LoadFromFile(DieAlteDatei);
RichEdit1.SaveToStream(TemporärerMemoryStream); AddRtfFromStream(RichEdit2, TemporärerMemoryStream); RichEdit2.SaveToFile(DieNeueDatei); |
Re: Mit SaveToFile Daten an eine Datei anhängen?
:? Ups. Sorry Flocke. Vielleicht hätte ich noch erwähnen sollen, dass ich mit dem Jedi-Richedit arbeite. Und damit läuft dein angegebener Vorschlag leider nicht :(
|
Re: Mit SaveToFile Daten an eine Datei anhängen?
Ist ja noch einfacher, JvRichEdit hat nämlich die Eigenschaft "StreamMode".
Delphi-Quellcode:
[Nachtrag]
RichEdit2.LoadFromFile(DieAlteDatei);
RichEdit1.SaveToStream(TemporärerMemoryStream); RichEdit2.StreamMode := RichEdit2.StreamMode + [smSelection]; RichEdit2.LoadFromStream(TemporärerMemoryStream); RichEdit2.StreamMode := RichEdit2.StreamMode - [smSelection]; RichEdit2.SaveToFile(DieNeueDatei); An sich müsste mein alter Vorschlag auch laufen, du musst dann nur den Typen von TCustomRichEdit auf TJvRichEdit ändern. Oder alternativ so:
Delphi-Quellcode:
und dann aufrufen mit AddRtfFromStream(RichEdit2.Handle, TemporärerMemoryStream);
// Ersetzt die aktuelle Auswahl durch den Inhalt des Streams
procedure AddRtfFromStream(RichEditHandle: THandle; Stream: TStream); var EditStream: TEditStream; begin EditStream.dwCookie := LongInt(Stream); EditStream.dwError := 0; EditStream.pfnCallback := @_AddRtfCallback; SendMessage(RichEditHandle, EM_STREAMIN, SF_RTF + SFF_SELECTION, LongInt(@EditStream)); if EditStream.dwError <> 0 then raise Exception.Create('RichEdit operation fehlgeschlagen!'); end; |
Re: Mit SaveToFile Daten an eine Datei anhängen?
:oops: Nochmal ups Flocke
Was ich auch nicht erwähnt habe - ich muss im Moment mit Delphi 7 arbeiten. Kann es sein, dass es dort TEditStream nicht gibt? Mit TMemoryStream habe ich es probiert, da überschreibt er aber alles, was vorher eingelesen wurde. Bei mir funktioniert es übrigens mit Copy-Paste wie folgt:
Delphi-Quellcode:
Deine vorgeschlagene Möglichkeit mit den Streams wäre aber mit Sicherheit besser, wenns bei mir nur funktionieren würde. :wink:
RichEdit2.Lines.Append(chr(13)); //Ans Ende springen
RichEdit1.SelectAll; RichEdit1.CopyToClipboard; RichEdit2.PasteFromClipboard; |
Re: Mit SaveToFile Daten an eine Datei anhängen?
Hallo :hi:,
TEditStream gibt es in Delphi7 nicht, da hast du recht. ;) Da sieht man mal wieder wie wichtig es ist, so viel Angaben wie Möglich zu machen, um Missverständnisse zu vermeiden. Dadurch kann man sich viel Arbeit, Nerven und Zeit sparen. :mrgreen: MfG freak |
Re: Mit SaveToFile Daten an eine Datei anhängen?
Delphi-Quellcode:
Diese Zeile übersehen?
uses RichEdit;
Diese Unit gibt's schon bei Delphi 5 und da drin ist TEditStream definiert. |
Re: Mit SaveToFile Daten an eine Datei anhängen?
Natürlich musste nur meine Uses-Klausel erweitert werden :thumb:
Aber... :wall: folgender Fehler folgt: "Inkompatible Typen TStream und _editstream" Sorry, dass ich langsam ans Aufgeben denke, aber ist die Copy-Paste-Methode eigentlich unsicher? |
Re: Mit SaveToFile Daten an eine Datei anhängen?
Also noch einmal komplett:
Delphi-Quellcode:
uses
RichEdit; // Hilfsroutine für AddRtfFromStream function _AddRtfCallback(dwCookie: Longint; pbBuff: PByte; cb: Longint; var pcb: Longint): Longint; stdcall; begin try Result := 0; pcb := TStream(dwCookie).Read(pbBuff^, cb); except Result := 1; end; end; // Ersetzt die aktuelle Auswahl durch den Inhalt des Streams procedure AddRtfFromStream(RichEditHandle: THandle; Stream: TStream); var EditStream: TEditStream; begin EditStream.dwCookie := LongInt(Stream); EditStream.dwError := 0; EditStream.pfnCallback := @_AddRtfCallback; SendMessage(RichEditHandle, EM_STREAMIN, SF_RTF + SFF_SELECTION, LongInt(@EditStream)); if EditStream.dwError <> 0 then raise Exception.Create('RichEdit operation fehlgeschlagen!'); end; procedure AlteDateiPlusInhaltGleichNeueDatei(const DieAlteDatei: string; RichEdit, TempRichEdit: TJvRichEdit; const DieNeueDatei: string); var MemoryStream: TMemoryStream; begin TempRichEdit.LoadFromFile(DieAlteDatei); TempRichEdit.SelStart := TempRichEdit.Perform(WM_GETTEXTLENGTH, 0, 0); MemoryStream := TMemoryStream.Create; try RichEdit.SaveToStream(MemoryStream); AddRtfFromStream(TempRichEdit.Handle, MemoryStream); finally MemoryStream.Free; end; TempRichEdit.SaveToFile(DieNeueDatei); end; |
Re: Mit SaveToFile Daten an eine Datei anhängen?
Ich bewundere deine Geduld, Flocke :angel2:
Mir geht sie leider aus. Es wird erstmal fehlerfrei compiliert. kleine Korrektur:
Delphi-Quellcode:
muss heißen:
TempRichEdit.SaveToFile(DieNeueDatei);
Delphi-Quellcode:
und so weiter...
TempRichEdit.Lines.SaveToFile(DieNeueDatei);
Aber beim Ausführen der Prozedur AddRtfFromStream wird die Exception "RichEdit operation fehlgeschlagen!" erzeugt. Mir gehts wie diesem kleinen Smilie :coder2: Nochmal meine Frage: Was ist der Nachteil an der Copy-Paste-Methode? |
Re: Mit SaveToFile Daten an eine Datei anhängen?
Das hat nur den Nachteil, dass du den Inhalt der Zwischenablage zerstörst (falls der User den noch braucht).
Probier doch mal zwei kleine Änderungen:
Delphi-Quellcode:
hast du ja bestimmt schon in
TempRichEdit.LoadFromFile(DieAlteDatei);
Delphi-Quellcode:
geändert.
TempRichEdit.Lines.LoadFromFile(DieAlteDatei);
Füge hier eine Zeile ein:
Delphi-Quellcode:
Ich hab's hier nur mit 'nem TFileStream direkt aus der Datei probiert, da hab' ich die Neupositionierung wohl vergessen.
RichEdit.SaveToStream(MemoryStream);
MemoryStream.Position := 0; // <-- hier AddRtfFromStream(TempRichEdit.Handle, MemoryStream); |
Re: Mit SaveToFile Daten an eine Datei anhängen?
:hello: Ein Hoch auf Flocke :hello:
Seine Geduld führte dazu, dass ich jetzt mein Copy-Paste-Prinzip über Bord werfen kann :hi: und das gleiche per Streaming erreiche. Vielen Dank :spin2: (Jetzt muss ichs nur noch nachvollziehen) |
Re: Mit SaveToFile Daten an eine Datei anhängen?
In Zeile
Delphi-Quellcode:
kommt bei mir ein Fehler. *Variable erforderlich*. Woran liegt das?????
EditStream.pfnCallback := @_AddRtfCallback;
|
Re: Mit SaveToFile Daten an eine Datei anhängen?
Komischerweise tritt der Fehler jetzt nicht mehr auf. *grübel*
habe trotzdem eine Frage. Und zwar kann mir jemand erklären was die Befehle
Delphi-Quellcode:
machen?
EM_STREAMIN EM_STREAMOUT SFF_SELECTION
|
Re: Mit SaveToFile Daten an eine Datei anhängen?
Zitat:
|
Re: Mit SaveToFile Daten an eine Datei anhängen?
Zitat:
Den Cursor auf eines der Wörter setzen und F1 drücken. Ansonsten ist Herr Google auch immer sehr hilfsbereit. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 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