|
임문환 님이 쓰신 글 :
: 안녕하세요?
:
: 사용자 정의 윈도우 컴포넌트에서의 오류 메시지에 관한 질문입니다.
: 아래의 컴포넌트를 등록하면 오류 없이 등록이 됩니다.
: 하지만 컴포넌트 팔레트에서 폼으로 찍어다 놓는 순간 "Invalid Image size"라는
: 오류메시지가 발생하고 폼에 놓여지지 않습니다.
: 오류는 이 글의 가장 아래 줄에 있는 FImageList->AddMasked(mBitmap,clBlue);
: 에서 발생하는 것으로 밝혀졌지만 왜 그런지는 도무지 알 수가 없군요.
:
: 이 마지막 줄은 디렉터리 목록에서 사용할 폴더의 비트맵을 이미지 목록에
: 등록하는 것이며, 오류가 발생하자 비트맵을 포기하고 컴포넌트를 다시
: 등록해보았더니 비트맵은 나타나지 않지만 다른 모든 것은 문제가 없습니다.
: 또한 이 컴포넌트를 그져 클래스로 만들지 않고 응용 프로그램의 폼에서 메서드로 사용하여 보았는데
: 비트맵 아이콘도 제대로 출력되고 아무런 문제 없이 돌아갑니다.
: 참고로 말씀드리면 비트맵의 크기는 16X16입니다.
:
: 컴포넌트 클래스:
: class TCustomDirectoryListBox: public TCustomListView
: {
: TImageList *FImageList;
: .
: .
: .
: }
:
:
: CPP 파일에서
: #pragma resource "DirListBox.res"
:
: TCustomDirectoryListBox::TCustomDirectoryListBox(TObject *Owner) : TCustomListBox(Owner)
: {
:
: }
:
: void __fastcall TCustomDirectoryListBox::CreateWnd()
: {
: Graphics::TBitmap *mBitmap;
:
: TCustomTreeView::CreateWnd();
:
: Font->Size=10;
: mBitmap->LoadFromResourceName((int)HInstance,"ClosedFolder");
: FImageList = new TImageList(Application);
: FImageList->DrawingStyle=dsTransparent;
: Images=FImageList;
: //여기에서 오류("Invalid Image size")가 발생함.
: FImageList->AddMasked(mBitmap,clBlue);
: .
: .
: .
: }
:
: 감사합니다.
임펠리테리입니다.
단순한 코딩실수같군요. Graphics::TBitmap *mBitmap;라고 해서 포인터 선언은 했는데 정작
비트맵 객체를 생성하지 않았네요. 그리고는 리소스에서 읽어들이는 함수를 실행했는데, 왜
여기서 익셉션이 발생하지 않았는지 좀 이상하군요.
그리고.. 아래의 질문에서도 언급한 거지만, 동적으로 컴퍼넌트를 생성할 때 Owner를 어떤 것을
넘겨줄 것인가에 대해 잘 생각해보셔야 합니다. 보여주신 것처럼 이미지리스트를 생성할 때
어플리케이션 객체를 오너로 넘겨주면, 어플리케이션이 종료할 때까지 그 컴퍼넌트는 파괴되지
않습니다. 리소스의 낭비죠.
일반적으로는, this를 넘겨주는 것이 가장 안전합니다. 생성하고 있는 메소드가 파괴될 때 함께
파괴시키는 거죠. 만약 this외에 다른 값을 넘겨주어야 하는 경우라면 조금 주의하는 것이
좋습니다.
그럼 참고하시길...
|