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:
{\rtf1\
ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Tahoma;}}
{\colortbl ;\red153\green137\blue137;}
\viewkind4\uc1\pard\cf1\lang1031\b\f0\fs16 TEST\b0\par
}
in der
IB-Expert Hex-Ansicht kann ich auch klar sehen das es sich um nicht-
Unicode daten handelt (keine 0-Bytes).
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:
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;
Die Methode "LoadBlob" macht im prinzip folgendes:
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);
...