2013-06-03 69 views
2

我正在嘗試編寫一個圍繞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代碼來代表一切。

雖然它失敗(將它們轉換爲?)。

有沒有一種簡單的方法來啓用我的代碼中正確的Unicode處理?

我試圖用TEncoding.UnicodeTEncoding.UTF8的編碼時TRichEdit設置爲PlainText := TrueTStringStream,但不起作用。

+0

稍微偏離主題:你爲什麼不從'TRichEdit'而不是繼承? –

+1

@JerryDodge:那麼它會成爲一個控制。 –

+0

@AndreasRejbrand嗯,那是我的觀點。我只是想知道爲什麼它不是一個繼承的控件。 –

回答

2

我覺得你太過複雜了。根本不需要使用PlainText屬性。保持其默認設置爲True。然後,要讀取/寫入RTF使用LoadFromStreamSaveToStream。要讀取/寫入純文本,請使用Lines.Text屬性。

這是一樣簡單,因爲我可以把它:

type 
    TRTF = class 
    strict private 
    class function CreateRichEdit: TRichEdit; static; 
    public 
    class function Decode(const AInput: string): string; static; 
    class function Encode(const AInput: string): string; static; 
    end; 

class function TRTF.CreateRichEdit: TRichEdit; 
begin 
    Result := TRichEdit.CreateParented(HWND_MESSAGE); 
end; 

class function TRTF.Encode(const AInput: string): string; 
var 
    RichEdit: TRichEdit; 
    Stream: TStringStream; 
begin 
    RichEdit := CreateRichEdit; 
    try 
    RichEdit.Lines.Text := AInput; 
    Stream := TStringStream.Create; 
    try 
     RichEdit.Lines.SaveToStream(Stream); 
     Result := Stream.DataString; 
    finally 
     Stream.Free; 
    end; 
    finally 
    RichEdit.Free; 
    end; 
end; 

class function TRTF.Decode(const AInput: string): string; 
var 
    RichEdit: TRichEdit; 
    Stream: TStringStream; 
begin 
    RichEdit := CreateRichEdit; 
    try 
    Stream := TStringStream.Create(AInput); 
    try 
     RichEdit.Lines.LoadFromStream(Stream); 
     Result := RichEdit.Lines.Text; 
    finally 
     Stream.Free; 
    end; 
    finally 
    RichEdit.Free; 
    end; 
end; 
+1

順便說一句,我不''TRichEdit.CreateParented(HWND_MESSAGE)'說服。當我使用它時,我發現格式化可能在發射RTF時發生改變。我會使用'TRichEdit.Create(nil)',然後將控件'ParentWindow'分配給'Application.Handle'。 –

+1

因此,對於Unicode明文使用'LoadFromStream'完全不起作用? –

+0

關於家長:你會在控制檯應用程序中使用什麼? –