C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[1735] Re:RichEdit2.0에서 대용량 파일 읽기
박지훈.임프 [cbuilder] 4421 읽음    1999-08-09 00:00
:
:  안녕하세요? 홍환민입니다.
:
:  리치에디트에서 64KB 이상을 읽지 못하는 걸로 알고 있습니다.
:  물론 LoadFormFile을 이용하면 메모리 할당을 해주지만 말입니다.
:
:  64KB이상을 제가 만든 루틴으로 읽어서 리치에디트(정확히 말하면 RxRichEdit)
:  에 표시하려고 여러 글을 찾아보았는데
:  가장 확실해 보이는 놈이 EM_SETLIMITTEXT를 이용한 방법이었습니다.
:
:  그런데 제 경우에는 되지 않더군요.
:
:  다음은 제가 사용한 소스입니다.
:  (Editor가 TRxRichEdit 클래스이고, ReadFile은 제가 제작한 루틴입니다.)
:
:  유의하셔야 할 것은 아시겠지만 RichEdit 2.0을 지원하는 RxRichEdit를
:  사용한다는 점입니다.(2.0이라서 안될 가능성이 있다고 그러더라고요.)
:
:  --------------------------------------------------------------------------
:   Buf: string;
:
:   Buf := Editor.ReadFile(OpenDialog.FileName);
:   SendMessage ( Editor.Handle, EM_SETLIMITTEXT, 0, Length(Buf) );
:   Editor.Text := Buf;
:  --------------------------------------------------------------------------
:
:  Length(Buf) <- 이 부분의 문제는 아닌 듯 싶습니다. Length(Buf) + 10
:  으로 하거나 큰 값 여러개를 넣어서 테스트를 해보았는데 안되더군요.
:
:  ReadFile 함수부분도 보실 필요가 있을지 모르니 올립니다.
:
: --------------------------------------------------------------------------
: function THongRichEdit.ReadFile( FileName: string ) : PChar;
: var
:   F: file of Byte;
:   FSize: Integer;
:   BufferStartPoint: PChar;
:   Buffer: PChar;
: begin
:   AssignFile(F, FileName);
:   Reset(F);
:   FSize := FileSize(F);
:   GetMem(Buffer, FSize + 1);
:   BufferStartPoint := Buffer;
:   BlockRead(F, Buffer[0], FSize);
:   Inc(buffer, FSize);
:   buffer^ := #0;
:   CloseFile(F);
:   Result := BufferStartPoint;
: end;
: --------------------------------------------------------------------------
:
:  소스가 델파이군요. 양해바랍니다.
:
:  그럼 행복하세요~
:


임펠리테리입니다.
리치에디트 2.0 컨트롤에서 따로 테스트해본 적은 없습니다만..
보여주신 코딩에 문제가 있어보이는군요.

   Buf := Editor.ReadFile(OpenDialog.FileName);
   SendMessage ( Editor.Handle, EM_SETLIMITTEXT, 0, Length(Buf) );
   Editor.Text := Buf;

이렇게 하면 리치에디트에는 Buf의 길이만큼의 메모리가 할당되겠죠?
하지만, 리치에디트 컨트롤은 텍스트 뿐만 아니라, 패러그래프나 텍스트의 속성 등에
관한 정보들을 함께 저장하므로, 실제로는 이보다 훨씬 더 많은 양의 메모리가
요구될 겁니다. 그러니까, 단지 텍스트의 길이만큼 메모리를 지정해주어서는
엄청 모자랄 거란 얘기죠.
리치에디트 자체의 LoadFromFile() 메소드를 쓰면 간단할텐데, 굳이 별도로
파일을 읽어들여서 다시 리치에디트에 넣어주는 것은 퍼포먼스를 두배 이상 느려지게
할텐데, 그렇게 하신 특별한 이유라도 있으신지...?

그럼 참고하시길..

+ -

관련 글 리스트
1733 RichEdit2.0에서 대용량 파일 읽기 홍환민 4161 1999/08/08
1735     Re:RichEdit2.0에서 대용량 파일 읽기 박지훈.임프 4421 1999/08/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.