Frage

Ich bin gerade dabei, unsere Software-Lösung von Delphi 7 bis 2010 der Migration Meistens sind die Änderungen waren einfach und es gibt nur eine kleine Menge Hürden gehen Sie nach links.

Auf einem Formular verwenden wir ein TRichEdit die rtf Text aus einem BLOB-Feld in einer MSSQL db packte angezeigt. Dies ist, wie es funktioniert in Delphi 7:

//Get RTF text from Blob field using TADOQuery
rtfStream := sql.CreateBlobStream(sql.FieldByName('rtftext'), BmRead) as TMemoryStream;

//Load into TRichEdit
RichEdit.PlainText := False;
RichEdit.Lines.LoadFromStream(rtfStream);

Dies würde die RTF anzuzeigen, wie in der TRichEdit Komponente erwartet, aber der gleiche Code in Delphi 2010 zeigt die RTF als Klartext mit Tabs zwischen den einzelnen Zeichen. Ich nehme an, das hat viel mit dem Wechsel von Ansi in Unicode zu tun, aber ich hatte kein Glück, das Problem beheben.

Jede Hilfe diese an der Arbeit würde sehr geschätzt werden. Dank

War es hilfreich?

Lösung

Okay, ich es herausgefunden.

Für den rtf Text laden:

//Get the data from the database as AnsiString
rtfString := sql.FieldByName('rtftext').AsAnsiString;

//Write the string into a stream
stream := TMemoryStream.Create;
stream.Clear;
stream.Write(PAnsiChar(rtfString)^, Length(rtfString));
stream.Position := 0;

//Load the stream into the RichEdit
RichEdit.PlainText := False;
RichEdit.Lines.LoadFromStream(stream);

stream.Free;

Für den RTF-Text zu speichern:

//Save to stream
stream := TMemoryStream.Create;
stream.Clear;

RichEdit.Lines.SaveToStream(stream);
stream.Position := 0;

//Read from the stream into an AnsiString (rtfString)
if (stream.Size > 0) then begin
    SetLength(rtfString, stream.Size);
    if (stream.Read(rtfString[1], stream.Size) <= 0) then
        raise EStreamError.CreateFmt('End of stream reached with %d bytes left to read.', [stream.Size]);
end;

stream.Free;

//Save to database
sql.FieldByName('rtftext').AsAnsiString := rtfString;

Das hat mich viel zu lange, um herauszufinden :) Ich glaube, ich eine Sache gelernt haben, obwohl ... wenn etwas in Delphi 2010 schief geht, seine in der Regel zu Unicode bezogen;)

Andere Tipps

Wenn Plaintext falsch ist, Loadfromstream () erste Versuche, den RTF-Code zu laden, und wenn das nicht klappt dann Loadfromstream () versucht, den Strom wieder als Klartext zu laden. Das ist der Fall in allen Delphi-Versionen immer. Mit der Einführung von Unicode, nehme ich etwas in Loadfromstream gebrochen haben könnte () 's EM_STREAMIN Callback-Handler. Ich schlage vor, Sie treten in Loadfromstream () 's eigentlichen Quellcode mit dem Debugger und sehen, was wirklich passiert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top