런타임시 TRichEdit을 사용하여 rtf에서 텍스트로 변환을 수행해야합니다 (here). 나는 이것을하기에 성공했지만, TRichedit.Lines를 채울 수 없다면 더미 폼을 부모로 설정해야했습니다. (오류 : 상위 항목이 누락되었습니다.) 아래에 내 funciton을 붙여 넣으십시오, 누군가는 부모를 정의하는 것을 피할 방법을 제안 할 수 있습니까? 당신은 또한 이것에 대해 논평 할 수 있고 더 좋은 아이디어를 찾았는지 말해 줄 수 있습니까?부모를 정의하지 않고 런타임시 TRichEdit 사용
참고 : TString을 출력으로 사용하지 말고 문자열이 필요합니다. 이것이 바로 이런 이유로 설계되었습니다.
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;
UPDATE : 대답 후 나는 기능을 업데이트하고 참조를 위해 여기를 쓰기 :
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;
줄 바꿈 문자는 # 13이 아닌 캐리지 리턴입니다. –
시각적 구성 요소 (TRichEdit)를 참조해야하므로 귀찮습니다. 별도의 스레드에서이 작업을 수행 할 때 동기화를 호출해야합니다. RTF를 서버의 일반 텍스트로 변환하고 싶지만 아직 익숙하지 않은 코드를 찾지 못했습니다. 그러나 이것을 게시 해 주셔서 감사합니다. – Alister
try/finally 블록 외부에서 Create 호출을 이동했습니다. 올바른 방법입니다.그렇지 않으면 Create 호출에 예외가있는 경우 코드는 초기화되지 않은 변수에서 Free를 호출하려고 시도합니다 (예외는 코드가 호출 문으로 되돌아 가지 않지만 except/finally 부분으로 직접 이동한다는 것을 의미 함을 기억하십시오. 변수는 결코 완료되지 않습니다). – HeartWare