here'da tartışıldığı gibi metin dönüştürmeyi rtf gerçekleştirmek için çalışma zamanında bir TRichEdit kullanmam gerekir. Bunu yapmakta başarılı oldum ancak TRichedit.Lines'i yerleştiremediğim takdirde ebeveyn olarak kukla bir form ayarlamak zorunda kaldım. (Hata: ebeveyn eksik). Aşağıda benim funciton'ımı yapıştırıyorum, bir ebeveyn tanımlamaktan kaçınmanın bir yolu var mı? Bu konuda yorum yapabilir ve daha iyi bir fikir bulursanız söyler misiniz?Bir ebeveyn tanımlamaksızın TRichEdit'i kullanma
Not: Çıkış olarak TStrings'e değil, bir dizgiye ihtiyacım var, bu yüzden bu şekilde tasarlandı.
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;
GÜNCELLEME: cevap sonra işlevini güncel ve başvuru için burada yazmak:
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;
Satır Besleme karakter numarası # 10 değil # 13, Taşıyıcının Dönüşü –
Ayrı bir iş parçacığında bunu Senkronize etmenizi gerektirdiğini düşündüğüm bir görsel bileşene (TRichEdit) başvurmak zorunda kalmak rahatsız edici. RTF'yi bir sunucuda düz metne dönüştürmek istiyorum ve henüz kullanmadığım bir kod bulamadım. Ama bunu yayınladığın için teşekkürler. – Alister
Oluşturma/durma bloklarının dışındaki çağrıları oluşturmayı doğru bir şekilde yaptım.Aksi takdirde, Oluşturma çağrısında bir istisna varsa, kod başlatılmamış bir değişkeni serbest olarak aramaya çalışır (bir özel durumun kodun çağrı deyimine hiçbir zaman geri dönmediği, ancak doğrudan/nihayet parçasına atladığı anlamına gelir, öyleyse ödev değişkene asla yapılmaz. – HeartWare