C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1098] [Controls] TCheckBox의 Checked 속성 변경시 OnClick이벤트 발생 안되게 하기
장성호 [nasilso] 8012 읽음    2012-07-13 10:48
@개요

프로그램에서 코딩으로 Control 의 속성을 변경한것 뿐인데..
마치 마우스로 조작한것처럼 Click이벤트 같은것이 발생하는 Control들이 여러가지가 있다.

참조
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=947



그중에 대표적인것이 바로 TCheckBox 인데

TCheckBox 의 경우 Checked속성이 변경되면 OnClick이벤트가 발생한다.


@TCheckBox의 Checked 속성 변경시 OnClick이벤트 발생 안되게 하기

방법1. 이벤트 연결을 조정하여
   어제 포럼에 올라온 질문에 답변단 것인데
   다음과 같이 OnClick이벤트 연결을 끊었다가 , Checked 속성 변경후에 , 다시 연결하는 방법이 있다.


void __fastcall ChangeChecked(TCheckBox *ChkBox , bool bChecked)
{
     TNotifyEvent ChkOnClick;
     ChkOnClick  = ChkBox->OnClick;
     ChkBox->OnClick = NULL;   //이벤트 핸들러 연결 해제 
 
     ChkBox->Checked = bChecked; // 속성 변경 
 
     ChkBox->OnClick = ChkOnClick;  //다시 이벤트 연결
      
}
  


   http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=67725


방법2.  ClicksDisabled 속성이용

ClicksDisabled 라는 protected 프로퍼티가 TButtonControl 을 상속받은 Control에 있다.
     ClicksDisabled 프로퍼티를 true로 한후에
Checked를 변경하면 OnClick 이벤트가 발생하지 않는다.
참고로 TButtonControl 을 상속받은 Control에는
TButton , TRadioButton , TCheckBox 등이 있다.


문제는 ClicksDisabled 프로퍼티는 protected 프로퍼티이기 때문에 .. 코딩에서 쉽게 조작이 안되는 어려움이 있다는 것이다.
방법2.1 클래스 상속을 이용하여 다음과 같이 TCheckBox를 상속받은 Class를 만들어서 ...
  TOpenCheckBox = class(stdCtrls.TCheckBox)
  public
    procedure ChangeChecked(bCheck:boolean);
  end;
//=============================================
procedure TOpenCheckBox.ChangeChecked(bCheck: boolean);
begin
  Self.ClicksDisabled:=true;
  Checked:=bCheck;
  Self.ClicksDisabled:=false;
end;
//----------------------------------------------
procedure ChangeCheckBoxChecked(ChkBox:TCustomCheckBox; bCheck: boolean);
begin
  TOpenCheckBox(ChkBox).ChangeChecked(bCheck);
end;
사용은...

//방법 2.1.1 
procedure TForm1.Button3Click(Sender: TObject);
begin
  TOpenCheckBox(CheckBox1).ChangeChecked(  not CheckBox1.Checked);
end;

//방법2.1.2 
procedure TForm1.Button4Click(Sender: TObject);
begin
  ChangeCheckBoxChecked(CheckBox1, not CheckBox1.Checked);
end;

방법2.2 교체식 class를 이용하여 ..
  TCheckBox = class(stdCtrls.TCheckBox)
  public
    procedure ChangeChecked(bCheck:boolean);
    procedure SetChecked(Value: Boolean); override;
  end;
//=====================================
{ TCheckBox }

procedure TCheckBox.ChangeChecked(bCheck: boolean);
begin
  Self.ClicksDisabled:=true;
  Checked:=bCheck;
  Self.ClicksDisabled:=false;
end;

procedure TCheckBox.SetChecked(Value: Boolean);
begin
  Self.ClicksDisabled:=true;
  inherited SetChecked(Value);
  Self.ClicksDisabled:=false;

end;
위 class선언은 Form클래스 선언 바로 윗쪽에 선언되어있어야 한다. 그러면 Form에 포함된 유닛이 컴파일 될때 StdCtrls 유닛에 선언된 TCheckBox가 아닌 , TCheckBox = class(stdCtrls.TCheckBox) 클래스로 알고 컴파일 된다. 사용은?
//방법 2.2.1 
procedure TForm1.Button1Click(Sender: TObject);
begin
   CheckBox1.ChangeChecked(not CheckBox1.Checked);
end;

//방법 2.2.2 
procedure TForm1.Button2Click(Sender: TObject);
begin
   CheckBox1.Checked:= not CheckBox1.Checked;
end;
C++Builder버젼은 다음에... 그럼.. ....

+ -

관련 글 리스트
1098 [Controls] TCheckBox의 Checked 속성 변경시 OnClick이벤트 발생 안되게 하기 장성호 8012 2012/07/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.