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
[493] [답변] 김나현/ 빌더/ 이미지 배열사용??/프포
박지훈.임프 [cbuilder] 5619 읽음    1998-08-05 22:42
안녕하세요. 천리안 프로그래머 포럼 C++Builder 담당자 임펠리테리입니다.

도움이 되신거 같아서 답변드릴 기운이 막 솟습니다. 으샤~으샤~ ^^

질문에서 말씀하신 것처럼 Image를 그렇게 많이 쓰신다면 배열을 사용하시는 것이

효율적인 해결 방법이겠죠. 간단한 방법과 조금 프로페셔널한 방법을 알려드리죠.

간단한 방법은, 애초에 동적으로 생성할 이미지의 포인터들인 TImage형 포인터들을

배열로 선언하는 것입니다.

물론 방법은 똑같이 폼의 클래스내에 Timage 포인터를 배열로 만들어주면 돼죠.

Timage *Images[20];
...

이렇게 폼클래스에 선언하신후, 동적으로 생성하는 코드에선 마찬가지로

for(int i=0; i<20; i++)
{
    Image[i] = new TImage(this);
    Image[i]->Parent = PaintBox1; // 혹은 다른 어떤 컨트롤
    ...
}

이런식으로 반복적으로 생성하면 되겠죠. 여기서 약간 짜증날수도 있는건, 이미지가

나타날 각 위치들을 선언하는 겁니다. 각 위치들이 어떤 규칙이 없다면, 미리 배열등

에 20개 이미지가 나타날 위치와 가로/세로 크기를 저장해두면 될겁니다.

아마도 TRect형으로 20개짜리 배열을 만들어 미리 값들을 저장해두면 효율적이지 않

을까 생각됩니다.

직접 배열을 사용하는 것보다 조금 프로페셔널한 방법은, TList 로 리스트를 만드는

것입니다. 이미지의 포인터들을 정적으로 배열로 만들경우, 만약 중간에 새로 추가하

거나 삭제하려면 아주 까다로운데다가, 정해진 갯수만 만들면 되는 경우는 상관없지

만 몇개나 필요할지 모르는 경우에는 배열로 처리가 곤란하죠. 이미지를 생성해서

TList에 넣어두면 아주 효율적으로 관리할수가 있습니다.

이 경우 폼 클래스에 정의해두어야 할 포인터는 TList 형 포인터 하나면 됩니다.

TList *MyImageList;
...

그리고 실제로 이미지를 생성할 부분에선,

MyImageList = new TList;  
TImage *TempImage;
for(int i=0; i<20; i++)
    TempImage = new TImage(this);
    TempImage->Parent = PaintBox1;
    ...
    MyImageList->Add(TempList);
}

(위의 for문 다음에 '{'를 하나 빼먹었군요..)

이제 각 이미지의 포인터들은 MyImageList 내에 저장되므로 (Add()메소드 보이시죠)

TempImage 자체를 보존할 필요가 없죠. 그러니, 하나의 포인터로 할당하고 다시 그걸

List 내에 추가하고, 그렇게 반복하는 겁니다.

이렇게 생성한 이미지들을 사용할때는 조금 복잡합니다. TList내에 들어간 각 객체들

은 원래의 타입이 뭐였든지에 관계없이 void 형으로 바뀌어 저장되므로, 이걸 사용할

때 다시 원래 타입으로 캐스팅을 해야 합니다. 또 단순한 배열과는 달리 인덱스 연산

자 []를 직접 사용할수 없고, TList의 프로퍼티중 Items를 통해 인덱스해야 합니다.

구체적으로 코드를 보자면,

(dynamic_cast <TImage *>(MyImageList->Items[2]))->LoadFromFile(...);

등과 같이 말이죠. 다이내믹 캐스트는 빌더에서 새로 추가된 캐스팅연산으로, 표준

C/C++의 캐스팅보다 훨씬 강력하며 안전합니다. 이에 대해선 여기서 자세히 설명하긴

좀 그렇구요, 어쨌든 이 코드는 리스트의 아이템 프로퍼티를 이용하여 리스트의 인덱

스 2에 저장된 포인터를 TImage * 형으로 캐스팅하여 그 멤버를 억세스하는 겁니다.

너무 길어지는 것 같아 더이상 설명드리기가 그렇네요. (사실은 저 지금 일어나서,

식사하러 가얍니다.. 죄송..) TList에 대해서는 헬프를 참조하시면 개념을 잡을 수

있는 간단한 예제들이 나오니 참조 바랍니다. 주로 TList::Items 의 헬프와 TList::

Count 의 헬프를 참고하시면 도움이 될겁니다.

그럼, 도움되시길 바라면서, 이만...





독립문에서 임펠리테리였습니다.

(cbuilder, skyhi18)



+ -

관련 글 리스트
492 [질문] 빌더/ 이미지 배열사용??/프포 김나현 5406 1998/08/05
493     [답변] 김나현/ 빌더/ 이미지 배열사용??/프포 박지훈.임프 5619 1998/08/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.