Ich muss ein TRichEdit zur Laufzeit verwenden, um die Konvertierung von RTF zu Text wie besprochen here. Es ist mir gelungen, dies zu tun, aber ich musste ein Dummy-Formular als Eltern festlegen, wenn ich nicht die TRichedit.Lines bevölkern kann. (Fehler: Eltern fehlt). Ich füge meine Funktion unten, kann jemand einen Weg vorschlagen, um zu vermeiden, ein Elternteil zu definieren? Kannst du das auch kommentieren und mir sagen, ob du eine performantere Idee findest?Verwenden von TRichEdit zur Laufzeit ohne ein Elternteil zu definieren
Hinweis: Ich brauche eine Zeichenfolge, nicht TStrings als Ausgabe, deshalb wurde es so konzipiert.
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: Nach der Antwort, die ich die Funktion aktualisiert und hier als Referenz schreiben:
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;
Line Feed Char ist # 10, nicht # 13, Carriage Return –
Es ist ärgerlich, eine visuelle Komponente (TRichEdit) zu referenzieren, die vermutlich in einem separaten Thread Synchronize aufrufen muss. Ich möchte RTF in reinen Text auf einem Server konvertieren, und ich habe noch keinen Code gefunden, den ich noch benutzen kann. Aber danke, dass du das geschrieben hast. – Alister
Ich habe die Create-Aufrufe außerhalb der try/finally-Blöcke verschoben, was der richtige Weg ist.Andernfalls, wenn eine Ausnahme im Create-Aufruf ist, wird der Code versuchen, Free für eine nicht initialisierte Variable aufzurufen (denken Sie daran, dass eine Ausnahme bedeutet, dass der Code niemals zur aufrufenden Anweisung zurückkehrt, sondern direkt zum except/finally-Teil springt) zu der Variable wird nie getan). – HeartWare