Я пытаюсь написать класс оболочки вокруг TRichEdit
, который может кодировать и декодировать RTF в/из открытого текста.Поддерживает ли TRichEdit Unicode?
Это то, что я написал до сих пор:
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 кодировке пользователь по умолчанию.
Он не работает (преобразует их в ?
) для других персонажей.
Есть ли простой способ включить правильную обработку Юникода в моем коде?
Я пытался использовать TEncoding.Unicode
и TEncoding.UTF8
как кодирование для TStringStream
когда TRichEdit
установлен в PlainText := True
, но это не работает.
Немного не по теме: Почему вы не наследует от 'TRichEdit' вместо этого? –
@JerryDodge: Тогда это станет контролем. –
@AndreasRejbrand Ну да, это была моя точка. Мне просто интересно, почему это не унаследованный контроль. –