|
임문환 님이 쓰신 글 :
: 우선 앞의 답변에 감사드립니다.
:
: 제가 질문할 때 빠뜨린 게 있어서요.
: mBitmap를 사용하기 바로 전에 아래와 같이 비트맵 메모리를 할당했음을 알려드립니다.
: mBitmap=new Graphics::TBitmap;
: 물론 코딩 시 오타는 없는 게 확실합니다.
:
: 문제는 FImageList인데요, 일반 응용 프로그램에서는 TImageList를 폼에다 끌어다 놓는 방식으로
: 하지 않고 지금과 같이 메서드 내에서 동적으로 사용하여도 아무런 문제가 없습니다.
: 하옇든 문제는 FImageList에 있는데 그 이유를 모른다는 게 질문의 요지입니다.
:
: 감사합니다.
임펠리테리입니다.
저도 좀 이상하다 싶어서.. 이미지리스트의 vcl 소스를 분석해봤습니다. 그런데.. vcl소스상으론
별로 의심갈 부분이 없더군요. 'Invalid Image Size'라는 메시지 그대로, 새로 추가하려는 비트맵
이 이미지리스트의 가로/세로보다 작으면 익셉션이 발생하도록 되어있더군요.
그래서.. 다른 부분을 의심해봤는데.. 아무래도, LoadFromResourceName() 함수로 리소스에서
비트맵을 불러오는 루틴의 문제일 가능성도 있고...
일단, mBitmap의 가로/세로 크기와 ImageList의 가로/세로 크기를 검사해보세요.
익셉션이 발생하는 코드인 TCustomImageList::CheckImage()에서는 빌더의 버그로 제대로 된
값을 인스펙트할 수 없습니다. (with 문에서 빌더가 변수를 혼동하게 됩니다)
그러므로 다음과 같은 코드를 추가해서...
TStringList *sl = new TStringList;
sl->Add(AnsiString("이미지리스트 Width: ") + AnsiString(FImageList.Width));
sl->Add(AnsiString("이미지리스트 Height: ") + AnsiString(FImageList.Height));
sl->Add(AnsiString("비트맵 Width: ") + AnsiString(mBitmap.Width));
sl->Add(AnsiString("비트맵 Height: ") + AnsiString(mBitmap.Height));
sl->SaveToFile("C:\\디버깅 결과 파일.txt");
delete sl;
물론 이 코드는 AddMasked()함수를 사용한 부분 바로 앞에 둬야겠죠?
어쨌든 'Invalid Image Size'라는 익셉션이 발생한 것이 사실이므로, 결과파일을 보면 아마
가로 세로값이 서로 다르게 나올 겁니다. 그 값들을 보면 무언가 추측이 될 것 같군요.
그리고...
LoadFromResourceName() 함수 대신 다른 함수를 사용하는 것도 문제를 해결하는 방법이 될 수
있습니다. 임문환님께서는 이미지리스트에 리소스에 있는 비트맵을 추가하기 위해 임시 비트맵을
만들고 그 비트맵에 리소스의 비트맵을 불러온 후 다시 이미지리스트에 추가하는 방법을 사용하셨
는데, 이러한 절차를 하나로 줄여주는 간편한 함수가 TImageList에 있습니다.
GetInstRes() 함수인데, 사용법은 조금 까다롭고, 정확히 사용하시려고 하는 용도에 일치하지
않을 수도 있겠습니다.
그럼 참고하시길...
|