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
[66015] Re:CheckBox 질문 있습니다.
장성호 [nasilso] 1034 읽음    2012-01-18 12:38
음..

CheckBox이름이

CheckBox1 .... CheckBox8 이라는 가정하에 코딩한것입니다.



//Header
class TForm1 : public TForm
{
__published:	// IDE-managed Components
	TCheckBox *CheckBox1;
	TCheckBox *CheckBox2;
	TCheckBox *CheckBox3;
	TCheckBox *CheckBox4;
	TCheckBox *CheckBox5;
	TCheckBox *CheckBox6;
	TCheckBox *CheckBox7;
	TCheckBox *CheckBox8;
	void __fastcall CheckBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
	void __fastcall FormCreate(TObject *Sender);
private:	// User declarations
public:		// User declarations
	__fastcall TForm1(TComponent* Owner);
	TCheckBox *ChkBoxArr[8];
	int  __fastcall TForm1::GetCheckBoxCheckedCount();
};


//*.cpp
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	for(int i=1;i<=8;i++)
	{
		ChkBoxArr[i-1]=(TCheckBox *)FindComponent("CheckBox"+IntToStr(i));
	}
}
//---------------------------------------------------------------------------
int  __fastcall TForm1::GetCheckBoxCheckedCount()
{
	int iChkCnt=0;
	for(int i=0;i<8;i++)
	{
		if(ChkBoxArr[i]->Checked)iChkCnt++;
	}
	return iChkCnt;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
	if(Shift.Contains(ssLeft))
	{
		TCheckBox *ChkBox=(TCheckBox *)Sender;
		if(!ChkBox->Checked)
		{
			if(GetCheckBoxCheckedCount()>=3)
			{
				ReleaseCapture();
			}
		}
	}
}
//---------------------------------------------------------------------------




음..
ReleaseCapture가 핵심입니다.

Mouse 이벤트는 (MouseMove , MouseWheel , MouseUp ...)
Capture된 윈도우(Control)에서만 발생합니다.

Capture는 는 MouseDown이벤트에 Mouse위치의 윈도우(Control)에 캡쳐가 되구요.
만약 위코드에서처럼 CheckBox에서 ReleaseCapture를 해버리면

그 이후 다시 MouseDown이 되기전까지는 해당 Control에서  MouseMove의 MouseUp이 발생하지 않습니다.

CheckBox의 Checked는 MouseUp이 발생하기 직전 Click이 발생하는데
Click이벤트 발생 전에 Checked가 변경됩니다.

즉 위와같이 MouseDown이후에ReleaseCapture로
Mouse이벤트를 받지 않도록 만들어 버리면CheckBox가  Checked가 되지 않을 것입니다.


그럼..

쌩조 님이 쓰신 글 :
: CheckBox를 이용해서 그래프의 Series를 표시하고 있습니다.
:
: CheckBox가 총 8개가 존재하는데 이중에서 3개가 미리 체크 되어진다면 4개 이상부터는 체크가 되지 않게
:
: 할수 있는 방법이 있습니까?
:
: 이런 종류의 체크의 갯수를 제한하는 방법을 사용 해보신분들 도움좀 주세요
:
: C++Bulider을 사용 중입니다.

+ -

관련 글 리스트
66014 CheckBox 질문 있습니다. 쌩조 960 2012/01/18
66015     Re:CheckBox 질문 있습니다. 장성호 1034 2012/01/18
66017         Re:Re:CheckBox 질문 있습니다. 쌩조 862 2012/01/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.