Загрузка текста RTF из базы данных в TRichEdit - PullRequest
7 голосов
/ 02 ноября 2010

В настоящее время я нахожусь в процессе миграции нашего программного решения с Delphi 7 на 2010. В основном изменения были простыми, и осталось лишь небольшое количество препятствий.

В форме, которую мы используемTRichEdit, который отображал RTF-текст, извлеченный из поля BLOB-объектов в базе данных MSSQL.Вот как это работает в 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);

Это будет отображать RTF, как и ожидалось в компоненте TRichEdit, но тот же код в Delphi 2010 отображает RTF в виде простого текста с вкладками между каждым символом.Я полагаю, что это во многом связано с переходом с Ansi на Unicode, но мне не повезло, что я исправил проблему.

Любая помощь в получении этой работы будет принята с благодарностью.Спасибо

Ответы [ 2 ]

11 голосов
/ 03 ноября 2010

Хорошо, я понял это.

Для загрузки текста RTF:

//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;

Для сохранения текста rtf:

//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;

Это заняло у меня слишком много времени, чтобы понять :) Я думаю, я понял одну вещь, хотя ... если что-то идет не так в Delphi 2010, это обычно связано с юникодом;)

5 голосов
/ 02 ноября 2010

Когда PlainText имеет значение False, LoadFromStream () сначала пытается загрузить код RTF, а в случае неудачи LoadFromStream () снова пытается загрузить поток в виде простого текста. Это всегда имело место во всех версиях Delphi. С введением Unicode, я полагаю, что-то могло сломаться в обработчике обратного вызова EM_STREAMIN LoadFromStream (). Я предлагаю вам перейти к фактическому исходному коду LoadFromStream () с помощью отладчика и посмотреть, что на самом деле происходит.

...