【发布时间】:2013-05-29 22:03:56
【问题描述】:
我正在尝试围绕TRichEdit 编写一个包装类,它可以将RTF 编码和解码到/从纯文本。
这是我目前写的:
type
TRTF = class
private
FRichEdit : TRichEdit;
procedure SetText(const AText: string);
function GetText: string;
class function Convert(const AInput: string; AEncode: Boolean): string; inline; static;
public
constructor Create;
destructor Destroy; override;
class function Decode(const AInput: string): string; static;
class function Encode(const AInput: string): string; static;
end;
constructor TRTF.Create;
begin
FRichEdit := TRichEdit.CreateParented(HWND_MESSAGE);
end;
destructor TRTF.Destroy;
begin
FRichEdit.Free;
inherited;
end;
function TRTF.GetText: string;
var
Stream: TStringStream;
begin
if FRichEdit.PlainText then begin
Stream := TStringStream.Create('', TEncoding.ANSI);
end else begin
Stream := TStringStream.Create('', TEncoding.ASCII);
end;
try
FRichEdit.Lines.SaveToStream(Stream, Stream.Encoding);
Result := Stream.DataString;
finally
Stream.Free;
end;
end;
procedure TRTF.SetText(const AText: string);
var
Stream: TStringStream;
begin
if FRichEdit.PlainText then begin
Stream := TStringStream.Create(AText, TEncoding.ANSI);
end else begin
Stream := TStringStream.Create(AText, TEncoding.ASCII);
end;
try
Stream.Seek(0, TSeekOrigin.soBeginning);
FRichEdit.Lines.LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
class function TRTF.Convert(const AInput: string; AEncode: Boolean): string;
var
RTF: TRTF;
begin
RTF := TRTF.Create;
try
RTF.FRichEdit.PlainText := AEncode;
RTF.SetText(AInput);
RTF.FRichEdit.PlainText := not AEncode;
Result := RTF.GetText;
finally
RTF.Free;
end;
end;
class function TRTF.Encode(const AInput: string): string;
begin
Result := Convert(AInput, True);
end;
class function TRTF.Decode(const AInput: string): string;
begin
Result := Convert(AInput, False);
end;
对于用户默认 ANSI 代码页可以表示的所有内容,这似乎工作得相当好。
但对于其他字符,它会失败(将它们转换为?)。
有没有一种简单的方法可以在我的代码中启用正确的 Unicode 处理?
当TRichEdit 设置为PlainText := True 时,我尝试使用TEncoding.Unicode 和TEncoding.UTF8 作为TStringStream 的编码,但这不起作用。
【问题讨论】:
-
有点题外话:你为什么不从
TRichEdit继承呢? -
@JerryDodge:那么它就会变成一个控件。
-
@AndreasRejbrand 好吧,这就是我的观点。我只是想知道为什么它不是继承控件。
-
@Jerry 因为 Jens 想要一个非可视类来执行与 RTF 之间的文本处理。
-
@DavidHeffernan:那么 Jens 根本不应该使用
TRichEdit。 Jens 应该改用Windowless RichEdit control。
标签: delphi unicode delphi-xe2 rtf richtext