|
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프라퍼티를 잘 구현할 수 있을까요?
|