천객만래 [千客萬來] (It has an interminable succession of visitors)

영상처리 이미지 모음


256x256x256 grayscale


lenna


artifield



butterfly

 


camera



cat



dish



house



lady



pascal



pattern



512x512

peppers



512x512

goldhill



brooboo




Posted by SB패밀리

[강좌] 리소스의 활용 I  


아래에 Resource DLL의 활용 방법에 대한 강좌 요청이 있어서 저의 졸고라도
도움이 되실까 해서 올려 드립니다. 참고가 되시길...

리소스의 활용 I

글: 하영재(vaio91@yahoo.com)
    델파이 코리아(www.delphikorea.com)


들어가며...

델파이 코리아(www.delphikorea.com)나 다른 통신사에서 심심치 않게 올라오는
질문중에 Resource File(이하 리소스 파일이라 한다...^^)의 사용에 대한 질문이
있다. 
리소스 파일을 만들고 사용하는 문제들에 대한 질문들인데, 여러가지 단편적인
내용만을 가지고 조합을 해야 하니 처음 접하는 분들은 어려움을 느낄 수도 있을
것이다. 이런 분들을 위해 리소스 파일에 대한 모든 부분이라고는 할 수 없겠으나
많이 사용되는 부분에 대해서 예제와 더불어 간단하게 나마 천천히 살펴보려 한다. 


지금 부터 살펴볼 내용은 다음과 같다.

- 리소스 파일을 만드는 방법.
- 리소스 DLL을 만드는 방법.
- 위의 리소스 파일을 만드는 방법의 상세 내용
   . Bitmap 리소스 파일을 만들고 사용하기
   . Text 리소스 파일을 만들고 사용하기
   . AVI 리소스 파일을 만들고 사용하기
- 리소스 사용시 주의해야 할 메모리 문제
- 그 외 리소스로 할 수 있는 일들

이상과 같은 내용을 살펴 볼 것인데 아주 기초적인 부분부터 다룰 것이므로 기존에
다뤄본 분들이라면 아낌없이 다른 강좌들에 눈을 돌리자... ^^

이곳에서 사용할 예제는 본인이 직접 작성한 것도 있으나 아주 잘만들어진 예제를
제공하기 위해 Borland TI의 소스도 참고했음을 밝혀둔다. TI의 예제 소스를 사용한
부분에서 미리 발췌 했음을 알리도록 할 것이다.


리소스 파일 만들기...

리소스 파일은 바이너리 형태의 데이터로서 RCDATA라 부른다. 리소스 파일은
Res라는 확장자를 가지게 되는데 이 Res 파일을 만들기 위한 과정을 살펴 보자...

Res 파일을 만들기 위해서는 Text로 작성된 RC 파일이 있어야 한다. 이 RC 파일은
Res 파일에 포함하고자 하는 데이터 이름과 데이터 식별자, 그리고 데이터로 구성된
Text 파일이다. RC 파일의 예를 보자...

- RC 파일의 예

  WAVEFILE WAVE c:\WaveSound.wav

이렇게 작성된 것이 RC 파일이다. 여기서 'WAVEFILE'은 리소스를 호출할 때 쓰일
이름이며 'WAVE'는 이 리소스가 WAVE 파일임을 명시하는 것이며 맨 뒷부분은 실제로
리소스에 적재될 파일의 경로와 파일명으로 구성되어 진다. 
이렇게 텍스트 에디터에서 작성을 한 후 '파일이름.RC'로 저장을 하면 된다. 

여기까지 해서 RC 파일을 작성했으면 이제는 컴파일을 해서 RES 파일로 만드는
과정이 남아 있다. 
리소스 파일을 만들기 위해 델파이에서는 BRCC(Boaland Resource Command Line
Compiler)와 BRCC32를 제공한다. 이 녀석들은 RC 파일을 컴파일해서 RES 파일로
만들어 주는 역할을 한다. 
이름 그대로 Command Line에서 사용하는 녀석들인데 사용방법은 매우 간단하다. 
그저 'BRCC32 파일명.RC' 라고 커맨드 라인에서 입력하기만 하면 RES 파일을 만들어
준다. 이 두녀석은 델파이의 BIN 디렉토리에 존재하며 다른 경로에서 컴파일 하기
위해서는 Path에 이 디렉토리를 추가하여 주어야 한다.
(예: path c:\progra~1\borland\delphi5\bin) 

- RC 파일의 컴파일

   BRCC32 MyRes.RC

이렇게 해서 만들어진 Res 파일을 사용하려면 어떻게 해야 하는지 알아보자. 
리소스 파일을 실행파일의 Res에 추가하려면 $R 지시자를 사용하여 추가한다. 
이렇게...

{$R MyRes.RES}

아마 Unit에서 {$R *.DFM} 이렇게 작성된 부분을 보았을 것이다. 이것 또한 DFM
파일을 폼의 리소스에 추가하겠다는 코드이다. 이렇게 추가된 리소스는 한 프로젝트
내의 모든 유닛에서 사용이 가능하다. 

위와 같이 하여 폼에 우리가 작성한 Res 파일을 추가한 후 컴파일을 하면 컴파일
전과 컴파일 후의 실행 파일의 크기가 변한 것을 알 수 있다. 당연한 이야기지만...
실행 파일에 우리가 작성한 리소스 파일을 추가 했으니 추가된 리소스 만큼 폼의
크기가 늘어나는 것은 당연한 것이다. 

마지막 부분에서 생각해 볼 것이지만 리소스 파일을 남발하는 것은 자칫 잘못하면
엄청난 크기의 실행 파일을 만들어 낼 수도 있다는 것을 주의해야 하며 이것은
메모리 낭비로 이어지는 것이다.

이렇게해서 실행 파일에 우리의 리소스를 추가했다면 우리는 이 리소스를 사용을
해야 한다. 어떻게 추가된 리소스를 사용하는지 알아보자. 



리소스의 사용예

우리가 추가한 리소스가 Wave 파일이므로 리소스에서 Wave 파일을 로드하여
연주하는 방법을 살펴보자.
Wave 파일을 연주하려면 PlaySound나 sndPlaySound 같은 API를 이용하여 연주하게
되는데 문제는 Wave가 파일로 존재하지 않는 것이라는 것이다. 리소스에 추가된
Wave를 연주하는데 PlaySoud와 sndPlaySound는 서로 비슷한 방법을 사용해서
연주하게 된다. 본론 부터 말하자면 두 함수 모두 Wave 리소스를 연주하는데는
별다른 차이가 없다. 즉 사용방법이 거의 동일하다는 얘기이다. 이 함수들을
사용하기 전에 MMSYSTEM을 Uses에 추가 해 주어야 한다.

- PlaySound의 경우...

  PlaySound의 경우는 바로 리소스에서 Wave를 연주 할 수 있는데 바로 SND_RESOU   
RCE란 플랙을 이용하면 된다. 
  예를 보자...

  PlaySound('WAVEFILE', hInstance, SND_RESOURCE or SND_ASYNC);

  여기서 WAVEFILE은 처음에 RC 파일을 만들때 맨 앞에 적어 주었던 리소스 이름    
이며 두번째 인자로 필요한 HModule에 현재 Instance를 주면 되며 마지막으로 
  SND_RESOURCE라는 플랙을 추가 함으로써 간단히 Wave리소스를 연주 할 수 있다.

- sndPlaySound의 경우...

  sndPlaySound도 PlaySound와 별다른 차이가 없다. 

  sndPlaySound('WAVEFILE', SND_RESOURCE or SND_ASYNC);

  설명을 따로 할 필요가 없을 정도로 비슷하다. 

리소스에서 바로 연주하는 방법을 살펴 보았는데 다른 방법으론 TResourceStream을
이용해서 연주하는 방법이 있다. 이 때 사용하는 플랙은 SND_MEMORY란 플랙이며
sndPlaySound만을 예로 들어 보겠다. 

- TResourceStream을 이용한 연주...

   var
     Soo: TResourceStream;
   begin
     Soo := TResourceStream.Create(hInstance, 'WAVEFILE', PChar('Wave'));
     sndPlaySound(Soo.Memory, SND_MEMORY or SND_ASYNC);
     Soo.Free;
   end;

   TResourceStream을 생성하는 부분을 살펴 보면... 첫번째 인자로 인스탄스를 
   넘겨준다. 그리고 두 번째로 리소스 이름, 그리고 마지막으로 리소스 타입을
   넘겨주면 된다. 
   이렇게 해서 얻어진 Wave를 sndPlaySound의 SND_MEMORY 플랙을 이용해서 연
   주 할 수 있는 것이다. 
   PlaySound도 거의 동일 하므로 직접 한 번 해 보기를 권한다.


여기까지 해서 어떻게 리소스 파일을 생성하는지를 알아보았고 또 어떻게 리소스에
추가된 데이터를 읽어 오는가에 대해 알아 보았다. 
다음번에는 리소스 DLL을 만드는 방법과 만들어진 리소스 DLL을 이용해서 동적으로
리소스를 불러오는 방법... 그리고 각 리소스를 어떻게 사용하는지에 대해 알아
보도록 하겠다. 

노파심에 한 마디 더 하자면... 설명한 부분중 설명이 잘 못된 부분이 있을경우
지적해 주시면 바로 수정 조치 토록 하겠다. 

끝까지 읽어 주신 분들께 경의를 표하며 이만 마치겠다. 



RESEXAM1.ZIP


Posted by SB패밀리

JVCL을 사용하면 되게 편하게 되는군요.




[개발/delphi] 리소스 형태로 외부 파일을 자신의 프로그램에 쉽게 붙여 사용하는 방법



아는 것중 바이너리에 외부파일을 붙이는 건 2가지가 있습니다.

1. [exe 파일 + 구분자 + 외부데이터파일] 이런 구조로 짜서
exe실행시 구분자를 기준으로 띄어낸 외부데이터를 템프같은데 넣고 사용한다.

2. exe리소스형태로 붙이고 사용한다.
둘다 가끔씩 사용하지만 저같은 경우는 쉽게 사용할 수 있어서 2번째 방식을 주로 이용합니다.
2번째 방식도 만드는 법은 여러가지가 있겠지만 저같은 경우는 예전부터 JVCL 컴포넌트를 이용하고 있습니다.

사용법은 간단합니다.
1. JvDataEmbedded 컴포넌트를 폼에 올린 후에 더블클릭한다.
2. 리소스로 첨가할 파일을 선택하고, 원하는 시점에서 사용한다.

사용 샘플코드
JvDataEmbedded1.DataSaveToFile('파일명');

원하는 파일명을 저장해서 사용하면 됩니다


출처: http://simples.kr/?mid=Delphi&category=7356&listStyle=list&page=4&document_srl=7536

Posted by SB패밀리
델파이 RLINK32: out of memory 
델파이 컴파일을 하다보면 RLINK32 에러가 발생하는 경우가 있다.

이 경우는 코드상의 에러가 아니어서 설정 변경을 통해서 에러를 수정할 수가 있다.
아래의 방법들을 시도해 보는 것으로 에러를 수정할 수가 있다.


1 리소스명을 짧게 한다.
2. dll 파일을 더 작은 리소스 수로 여러개로 나눈다.
3. 이미지 리소스를 여러개의 strips(icons, glyphs, etc)으로 결합한다.
4. 만약 icon 파일에 128x128 크기의 형식이 포함되어 있다면 이것을 제거하면 확실하게 수정된다.




 
Posted by SB패밀리