|
OnResize 등의 이벤트는 포인터로 이루어진 함수로, 일반적인 초기화 상황에서는 NULL로 설정되어 있으며, 해당 함수가 정의 되었을때, 그 함수의 주소를 갖게 됩니다.
이 말씀은, 만약 잠시 OnResize를 꺼두시고 싶으실때, OnResize가 가르키는 함수를 기억해 두었다가, 잠시 NULL 로 바꾼 후 작업을 하시고, 다시 복귀를 하시면 잠시 OnResize의 기능을 막을 수 있다는 것입니다.
만약, 컴포넌트에서 작업을 직접 하실때는, 헤더 파일에서 OnResize 함수를 저장하는 곳을 보시고, 그 변수를 직접 변경해 주시면 될 것 같습니다.
Jisang Yoo 님이 쓰신 글 :
: 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프라퍼티를 잘 구현할 수 있을까요?
|