본문 바로가기
프로그래밍

TRichEdit에 rtf 문자열 Asssign하기 ..

by 알 수 없는 사용자 2012. 3. 31.


다음 그림과 같기 rtf형식의 문자열이 Memo에 들어있는데..

이놈을 어떻게 RichEdit 에 넣을까?


[안되는 방법들..]

다음과 같은 방법으로 해서는 양식적용이 안된다.

안되는 방법1. 

    RichEdit->Lines->Assign( Memo1->Lines) ; 


안되는 방법2

   RichEdit->Lines->Text = Memo1->Lines->Text  ;


위 두가지 방법은 

그냥 text형식으로 richedit에 들어간다.


[되는 방법들..]


RichEdit에서 rtf 형식을 판단하는 부분은 

Stream으로 읽을때 하고 있다.

 파일스트림, 메모리스트림, 리소스 스트림등...


1. 리소스에 넣었다가 리소스 스트림으로 읽어오는 방법

  void __fastcall TForm1::Button2Click(TObject *Sender)
 {
TResourceStream *ResSt;
try
{
 ResSt = new TResourceStream((int)HInstance, L"RTF_DOCUMENT",L"RTF");
 RichEdit1->Lines->LoadFromStream(ResSt);
}
__finally
{
 delete ResSt;
}
 }

2. 파일에서 읽어오는 방법

   RichEdit1->Lines->LoadFormFile("파일명");

   //확장자가 rtf 가 아니라도 잘 판단해서 읽어온다.


3. 메모장의 내용을 Stream으로  내보냇다가 읽어오기 

void __fastcall TForm1::Button4Click(TObject *Sender)
{

TMemoryStream *ms=new TMemoryStream;
Memo1->Lines->SaveToStream(ms);
ms->Position=0;
RichEdit1->Lines->LoadFromStream(ms);
delete ms;
}


4.  문자열을 Stream에 넣어서 RichEdit로 ...

void __fastcall TForm1::Button6Click(TObject *Sender)
{

AnsiString sText=Memo1->Lines->Text;
TMemoryStream *ms=new TMemoryStream;
ms->WriteBuffer(sText.c_str(),sText.Length());
ms->Position=0;
RichEdit1->Lines->LoadFromStream(ms);
delete ms;
}


5. Unnicode문자열인 경우엔 다음과 같이..

void __fastcall TForm1::Button5Click(TObject *Sender)
{

String sText=Memo1->Lines->Text;
TEncoding* Encoding= TEncoding::Default;
TBytes Buffer=Encoding->GetBytes(sText);
TMemoryStream *ms=new TMemoryStream;
ms->WriteBuffer(&Buffer[0],Buffer.Length);
ms->Position=0;
RichEdit1->Lines->LoadFromStream(ms);
delete ms;
}


유니코드인경우엔..
정확한 메모리크기가 바로 나오지 않기때문에
Encoding 정보를 이용해서 길이를 파악하여서 Stream으로 밀어 넣어야 한다.


주의할점

Richedit에서 Stream을 읽을대 현재 Stream->Position부터 읽어들인다.

즉 RicheEdit로 LoadFormStream하기 전에 반드시 Stream의 Position을 0 (초기위치)으로 셋팅을 해줘야 한다.



그럼...