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
[19803] AutoSize property의 구현
Jisang Yoo [newjisang] 903 읽음    2002-07-04 04:36
TMineSwp라는 컴포넌트를 만들었는데요, 거기서 AutoSize 프라퍼티를 만드는 데 어려움을 겪고 있습니다. TMineSwp는 지뢰찾기를 위한 컴포넌트이고요, 거기서 프라퍼티 두 개가 있는데,
Cols, Rows 인데, Cols 는 지뢰찾기컴포넌트의 컬럼(열)의 개수( 즉, 왼쪽에서 오른쪽까지로 네모칸의 갯수) 그리고 로우(행)의 개수,즉 위에서 아래로 네모칸의 개수이고,
FImage->Height는 지뢰찾기컴포넌트에서 네모칸 하나의 사이즈입니다. 즉, 네모칸하나의 높이이자 너비이죠.(네모칸은 정사각형)
AutoSize를 true로 지정할 경우에는, 언제나 컴포넌트 사이즈가 지뢰찾기이미지에 딱 붙게 하려고 합니다. 즉, 컴포넌트의 Width는 FImage->Height*Cols 가 되고, Height는 FImage->Height*Rows 로 유지하게 되는 겁니다. (TImage의 AutoSize와 같은 것을 구현하려고합니ㅏ.)
근데, 그렇게 되는 것을 구현하는 와중에 문제가 생겼습니다.

일단 이것은 AutoSize프라퍼티의 Set Method입니다. true로 설정될 경우, 컴포넌트사이즈가 딱 달라붙도록 코딩하였죠.
void __fastcall TMineSwp::SetAutoSize(bool value) // AutoSize 프라퍼티의 Set Method
{
  if(value)
  {
    Width = FImage->Height*FCols;
    Height = FImage->Height*FRows;
    FAutoSize = value;
  }
}

이것은 AutoSize가 true인 상태에서 , Rows프라퍼티가 변할 때, 사이즈를 다시 착 붙여주는 코드입니다.
void __fastcall TMineSwp::SetRows(int value) //Rows 프라퍼티의 Set Method
{   //일부코드생략.
  FRows = min(max(5,value),int(MaxRows));
  if(FAutoSize)
    Height = FImage->Height*FRows;
}

그리고 다음이 바로 상위클레스의 Resize 펑션을 overwrite하는 건데, 여기서 어떻게 코딩해야할지 모르겠습니다. TImage를 폼에 놓고 AutoSize를 true로 설정하고나서 그것을 리사이즈하려고 시도하면 다시 제자리에 착 달라붙는 것을 관찰할 수 있습니다.
저도 TMineSwp가 그렇게 되도록 하고 싶은데,
다음의 코드처럼 짜놓을 수는 없습니다.
void __fastcall TMineSwp::Resize()
{
  TCustomControl::Resize();
  if(FAutoSize)
  {
    Width = FImage->Height*FCols; // <-- 이 코드는 Resize함수를 호출하게 됨.
    Height = FImage->Height*FRows;
  }
}
왜냐하면 Width = FImage->Height*FCols; 부분에서 무한루프에 빠지게 되거든요. 왜냐하면 이 코드 자체가 Resize함수를 부르는 코드이기 때문입니다.

또 다음과 같이 코딩할 수도 없습니다.
void __fastcall TMineSwp::Resize()
{
  if(!FAutoSize)
    TCustonControl::Resize();  //AutoSize가 true일 경우는 Resize가 불가능하도록 한다.
}
이 코딩대로하면, 컴포넌트 사용자가 AutoSize true인 상태에서 사이즈 조정하는 것을 다 무효화시킬 수는 있지만,
문제점은, 맨 위에 제시된 코드들 중에 SetRows함수의 작동에 문제가 생기기 때문입니다.
즉, Rows의 값이 변경되어도, 사이즈는 그대로 안 변하는 문제점이 생깁니다.

과연 어떻게 해야 AutoSize프라퍼티를 잘 구현할 수 있을까요?

+ -

관련 글 리스트
19803 AutoSize property의 구현 Jisang Yoo 903 2002/07/04
19887     Re:AutoSize property의 구현 유영인.Chris 856 2002/07/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.