在 Delphi 11 Alexandria 的 Windows 10 中的 32 位 VCL 應用程式中,我需要在 RTF 檔案中搜索文本。所以我使用這個函式(在這里找到)從 RTF 檔案中提取純文本:
function RtfToText(const RTF_FilePath: string; ReplaceLineFeedWithSpace: Boolean): string;
var
RTFConverter: TRichEdit;
MyStringStream: TStringStream;
begin
RTFConverter := TRichEdit.CreateParented(HWND_MESSAGE);
try
MyStringStream := TStringStream.Create(RTF_FilePath);
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;
但是,該函式回傳的是 RTF 檔案的檔案路徑,而不是 RTF 檔案的純文本內容!
這個函式有什么問題,我怎樣才能有效地從 RTF 檔案中提取純文本而不必使用父TRichEdit控制元件?
uj5u.com熱心網友回復:
TStringStream建構式不會像您期望的那樣加載檔案。TStringStream不是TFileStream。顧名思義,TStringStream 是string. 因此,它的建構式接受一個字串并將其原樣復制到流中。因此,您正在使用檔案路徑字串本身的值加載 RichEdit,而不是字串所參考的檔案的內容。
您實際上根本不需要TStringStream,因為TRichEdit可以直接加載檔案,例如:
function RtfToText(const RTF_FilePath: string; ReplaceLineFeedWithSpace: Boolean): string;
var
RTFConverter: TRichEdit;
begin
RTFConverter := TRichEdit.CreateParented(HWND_MESSAGE);
try
RTFConverter.PlainText := False;
RTFConverter.Lines.LoadFromFile(RTF_FilePath);
RTFConverter.PlainText := True;
RTFConverter.Lines.StrictDelimiter := True;
if ReplaceLineFeedWithSpace then
RTFConverter.Lines.Delimiter := ' '
else
RTFConverter.Lines.Delimiter := #13;
Result := RTFConverter.Lines.DelimitedText;
finally
RTFConverter.Free;
end;
end;
話雖如此,在本機 RTL 或 VCL 之外沒有任何東西TRichEdit可以為您將 RTF 決議為純文本。如果您不想使用TRichEdit,則必須自己決議 RTF,或者找到要使用的第 3 方決議器。
uj5u.com熱心網友回復:
Q 中的函式將 RTF 檔案路徑字串直接分配給TStringStream而不加載 RTF 檔案(正如@Remy Lebeau 正確觀察到的那樣:“TStringStream 建構式不加載檔案”)。
這是通過將 RTF 檔案加載到TStringStream:
function RtfToText(const RTF_FilePath: string; ReplaceLineFeedWithSpace: Boolean): string;
var
RTFConverter: TRichEdit;
MyStringStream: TStringStream;
begin
RTFConverter := TRichEdit.CreateParented(HWND_MESSAGE);
try
MyStringStream := TStringStream.Create('');
try
MyStringStream.LoadFromFile(RTF_FilePath);
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424531.html
標籤:德尔福 rtf delphi-11-亚历山大 三重奏
