Q&A

  • resource dll에서 bitmap불러오는 방법좀...
제가 만들려는 프로그램이 여러폼을 가지고 있는데,
폼에 사용되는 툴바의 버튼에 지정되는 비트맵들이 동일합니다.

그래서, 이 비트맵들을 dll의 리소스로 만들고, dll에서 이 리소스의 handle를 return하는 함수 GetBitmap을 만들었습니다.

그런데, 직접 툴바버튼의 Glyph의 handle에 함수로부터 넘겨받은 handle을
직접지정하면 첫번째로 지정되는 버튼에는 반영이 되나, 둘째버튼부터 아무런 반응도 나타나질 않더군요.

근데, 누군가가 이 핸들을 비트맵에 지정하고 이 비트맵을 이용하라 하여서
그런 코드를 짜버렸는데 에러가 납니다. ("Bitmap image is not valid")

...
procedure SetBtnImg;
var
  b: TBitmap;
begin
  b := TBitmap.Create;

  b.handle := GetBitmap('P100');
  btnA100.Glyph.Assign(b);
  b.handle := GetBitmap('P101');
  btnA101.Glyph.Assign(b);
  b.handle := GetBitmap('P101'); <- 여기서 에러가 납니다.
  btnB101.Glyph.Assign(b);

  b.Free;
end;
...

뭐가 문제까요?



2  COMMENTS
  • Profile
    최용일 2002.06.06 04:52
    안녕하세요. 최용일입니다.

    델파이 헬프에도 나와 있는데 그렇게 직접 핸들을 억세스하는 것은 에러를 야기시킬수 있다는 군요...

    툴바를 쓰신다면 이미지리스트를 쓰시면 될거같군요...

    비트맵핸들을 지정하고 또 다시 Assign을 사용할 바에야 각각의 비트맵을 로드하는 것하고 아무런 차이가 없는거 같은데요. 이런건 자원 공유라고 하기는 쪼금 힘들거 같은데...

    제생각에는 이런식으로 자원을 공유가 된다고 해도 그 효과는 아주 미미하리라 생각되는군요...

    그냥 LoadFromResource등의 메소드를 이용해서 리소스에서 읽어들이세요...

    ^^ 항상 즐코하세요...

  • Profile
    뇌아파 2002.06.07 19:30
    매번, 도움되는 답변감사드립니다.
    리소스 관련해서 이번에 처음 해보는 일이라 무쟈게 골머리 싸맷는데, 최용일님덕분으로 많은 것을 배우게 되었습니다.
    참으로 제가 모르는것이 너무 많군요. ^ ^;

    비트맵 핸들을 지정할경우, 또는 Assign시에 오류가 발생하는 이유는 아마
    이미 버튼의 Glyph에 지정되어있는 Bitmap의 Handle에 대한 추가적인 조작
    (Handle에 연관된 비트맵을 해제시키는것 같더군요.) 때문인것 같습니다.
    그리고, Assign으로 지정된 bitmap은 다른 클래스와는 달리 Resource의
    공유가 이루어 진다고 합니다.
    그리고, bitmap의 변경이 일어날때 bitmap의 복사가 이루어 진다고 하더군요.
    (Copy on wirte).
    리소스모니터링프로그램(MemProof)에서 이사실을 확인해 보았습니다.

    좌우지간, Handle을 직접지정할려면,

    ...
      Button.Glyph.Dormant;
      Button.Glyph.FreeImage;
      Button.Glyph.ReleaseHandle;
      Button.Glyph.Handle := GetBitmapHandle('P110');
    ...

    이러면 문제가 없었습니다.
    그리고, LoadBitmap API를 쓰지않고, Bitmap.LoadFromResourceName을
    이용했습니다.
    리소스가 10%사용에서 2%사용으로 줄었습니다.
    (테스트 프로그램을 좀 무식하게 만들었거든요 ^ ^;)

    또, 모르죠 머, 먼일이 생길지...
    하여간, 현재는 위와 같은 코드를 쓰니 별일은 없었습니다.