我需要在运行时使用TRichEdit来执行here所讨论的从rtf到文本的转换。我成功地做到了这一点,但我必须将一个虚拟窗体设置为父窗体,否则我无法填充TRichedit.Lines。(错误:缺少父级)。我在下面粘贴了我的函数,有没有人能建议一种避免定义父级的方法?你能否对此发表评论,并告诉我你是否找到了更好的想法?
注意:我需要一个字符串,而不是TStrings作为输出,这就是为什么它被设计成这样。
function RtfToText(const RTF: string;ReplaceLineFeedWithSpace: Boolean): string;
var
RTFConverter: TRichEdit;
MyStringStream: TStringStream;
i: integer;
CustomLineFeed: string;
begin
if ReplaceLineFeedWithSpace then
CustomLineFeed := ' '
else
CustomLineFeed := #13;
try
RTFConverter := TRichEdit.Create(nil);
try
MyStringStream := TStringStream.Create(RTF);
RTFConverter.parent := Form4; // this is the part I don't like
RTFConverter.Lines.LoadFromStream(MyStringStream);
RTFConverter.PlainText := True;
for i := 0 to RTFConverter.Lines.Count - 1 do
begin
if i < RTFConverter.Lines.Count - 1 then
Result := Result + RTFConverter.Lines[i] + CustomLineFeed
else
Result := Result + RTFConverter.Lines[i];
end;
finally
MyStringStream.Free;
end;
finally
RTFConverter.Free;
end;
end;
更新:在回答之后,我更新了函数,并将其写在这里以供参考:
function RtfToText(const RTF: string;ReplaceLineFeedWithSpace: Boolean): string;
var
RTFConverter: TRichEdit;
MyStringStream: TStringStream;
begin
RTFConverter := TRichEdit.CreateParented(HWND_MESSAGE);
try
MyStringStream := TStringStream.Create(RTF);
try
RTFConverter.Lines.LoadFromStream(MyStringStream);
RTFConverter.PlainText := True;
RTFConverter.Lines.StrictDelimiter := True;
if ReplaceLineFeedWithSpace then
RTFConverter.Lines.Delimiter := ' '
else
RTFConverter.Lines.Delimiter := #13;
Result := RTFConverter.Lines.DelimitedText;
finally
MyStringStream.Free;
end;
finally
RTFConverter.Free;
end;
end;
发布于 2010-07-12 21:40:28
我在没有RichEdit控件的情况下使用DrawRichText来绘制RTF。(IIRC这称为Windowless Rich Edit Controls。)也许你也可以用这个来转换--但是我从来没有尝试过这个。
https://stackoverflow.com/questions/3227899
复制相似问题