2016년 1월 4일 월요일

RichEdit에 RTF 쓰기

얼마전 RichEdit에 RTF를 DB에서 불러와 써보려고 구굴링했었는데 찾지못해서 다른 방법으로 해결하였었습니다.
(주)아이씨티::최고의 시스템을 만드는 회사 에서 찾았습니다.
아래 긁어온 내용...

다음 그림과 같이 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 (초기위치)으로 셋팅을 해줘야 한다.


그럼...
크리에이티브 커먼즈 라이선스
Creative Commons License

델파이 12.1이냐 11.3이냐?

 델파이가 12.1이 나왔습니다. 혹시 11.3버전의 커뮤니티버전이 필요하시는분이 있을 수 있을 것 같아 https://altd.embarcadero.com/.../RADStudio_11_3_esd_28... 와 이것 찾느랴 엄청고생함.