TRichEdit RTF Laden und Speichern in DB
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DPler,
ich versuche den Inhalt eines TRichedit in eine DB zu speichern und später auch wieder zu laden. Das Speichern funktioniert problemlos. In der DB liegt in meinem Feld für "TEST" folgendes:
Code:
in der IB-Expert Hex-Ansicht kann ich auch klar sehen das es sich um nicht-Unicode daten handelt (keine 0-Bytes).
{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Tahoma;}}
{\colortbl ;\red153\green137\blue137;} \viewkind4\uc1\pard\cf1\lang1031\b\f0\fs16 TEST\b0\par } Wenn ich das nun lade bekomm ich aber das ganze Unicode präsentiert (mit 0-Byte nach jedem Byte) womit das Richedit aber nichts anfangen kann (siehe Anhang). Ich habe auch mal versucht mit TEncoding in ANSI-Code umzuwandeln aber dann bekomm ich nur "Chinesisch" ins Richedit... Was mache ich flasch? Vielen Dank schonmal im Voraus Der code zum Speichern:
Delphi-Quellcode:
...
//um RTF zu bekommen muss .PlainText auf FALSE FEditorForm.RichEdit1.PlainText := False; //RTF in MemoryStream speichern FEditorForm.RichEdit1.Lines.SaveToStream(LText); //Ab in die DB damit... LIBDS.SelectSQL.Text := 'EXECUTE PROCEDURE ' + 'PROCSAVEMISCDATA(:KEYVALUE, :TEXTData)'; LIBDS.Params[0].AsString := FUId; LIBDS.Params[1].LoadFromStream(LText); LIBDS.ExecSQL; ... Der code zum laden der auch mit TEncoding nicht funktioniert:
Code:
Die Methode "LoadBlob" macht im prinzip folgendes:
var
LText: TMemoryStream; LBytes: TBytes; E: TEncoding; begin LText := TStringStream.Create; E := TMBCSEncoding.Create(28591);//ISO 8859-1 Latin 1 Western European (ISO) try LoadBlob(GReqDB2, 'MISCDATA', 'TEXTDATA', '(KEYVALUE = '''+FUId+''') '+ 'ORDER BY Id DESC ROWS 1', LText, False); FEditorForm.RichEdit1.PlainText := False; // SetLength(LBytes, LText.Size); // LText.Read(LBytes[0], LText.Size); // // LBytes := E.Convert(TEncoding.Unicode, E, LBytes); // // LText.Size := 0; // LText.Write(AnsiString(LBytes), Length(AnsiString(LBytes))); // LText.Position := 0; // FEditorForm.RichEdit1.PlainText := TRUE; FEditorForm.RichEdit1.Lines.LoadFromStream(LText); finally E.Free; LText.Free; end; end;
Delphi-Quellcode:
...
ibqBlob.SQL.Text := Format('SELECT %s FROM %s WHERE %s', [AFieldName, ATableName, ACondition]); ibqBlob.Open; if ibqBlob.RecordCount = 0 then if ARaiseExIfNotFound then raise EDaDBError.Create(SDBENoResults) else EXIT; helpStream := ibqBlob.CreateBlobStream(ibqBlob.FieldByName(AFieldName), bmRead); AOutput.CopyFrom(helpStream, helpStream.Size); AOutput.Seek(0, soFromBeginning); ... |
AW: TRichEdit RTF Laden und Speichern in DB
Klappt es evtl. mit
Delphi-Quellcode:
:?:
FEditorForm.RichEdit1.Lines.Text := LText.DataString;
|
AW: TRichEdit RTF Laden und Speichern in DB
Ich mache derartiges mir allen möglichen Arten von Daten ständig, allerdings mit MSSQL (IB konnte ich für mich bisher vermeiden), zudem verwende ich keine StringStream und Blobfields.
Hast Du es mal mit Speicherung in ein VarBinary- Feld, so es dort so heißt versucht
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var ms:TMemoryStream; begin ms:=TMemoryStream.Create; try Richedit1.Lines.SaveToStream(ms); ms.Position := 0; DS.Edit; TBlobField(DS.FieldByName('TEXT')).LoadFromStream(ms); DS.Post; finally ms.Free; end; end; procedure TForm2.Button2Click(Sender: TObject); var ms:TMemoryStream; begin ms:=TMemoryStream.Create; try TBlobField(DS.FieldByName('TEXT')).SaveToStream(ms); ms.Position := 0; Richedit2.Lines.LoadFromStream(ms); finally ms.Free; end; end; |
AW: TRichEdit RTF Laden und Speichern in DB
Warum nimmst Du nicht einfach direkt ein DBRichEdit?
Grüsse |
AW: TRichEdit RTF Laden und Speichern in DB
Hallo DeddyH,
Zitat:
Das funktioniert leider nicht, da zeigt er mir dann das RTF mark-up an. Die Lösung: Ich lese das field jetzt .AsString in einem TStringStream und rufe dann RichEdit1.Lines.LoadFromStream() auf. TIBQuery.CreateBlobStream() was von meiner LoadBlob() aufgerufen wird macht aus dem TextBlob-Feld automatisch Unicode. @Mavarik: Ich verwende den DB-Zugriff gewrapped zur Laufzeit und habe kein Dataset-Komponente. Danke euch allen für die Tipps Shalom |
AW: TRichEdit RTF Laden und Speichern in DB
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
auch wenn das schon etwas länger her ist, lege ich mal meine TDBRichMemo Komponente bei. Sicherlich ausbaufähig, aber einige Ideen finden sich auch darin. Grüße // Martin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20: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