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
[59619] Re:이벤트드리븐 함수
장성호 [nasilso] 2587 읽음    2010-01-04 11:22
음...

말씀 하신 내용은
제가  언제 한번 정리해야지 하고 생각하던 내용인데
자료 정리를  못해서 미루다 미루다 아직도 못했네요

[이벤트 핸들러 호출 시점]
    이벤트 이름을 볼때    OnClick  등 마무스로 조작할때만 발생할것 같이 이름의 이벤트도 있구
    OnChange같은 경우 경험적으로 그렇게 착각하고 있는 이벤트도 있습니다.

    그런데.. 이벤트에 따라서
    마우스로 조작이 아닌 Coding에서 조작을 하여도 이벤트핸들러 함수가 호출되는 이벤트가 있습니다.

    Control마다 다르고 똑같지가 않아서 정리를 해야 하는데...
    아직 못하고 있는 것이죠

[Coding으로 상태 변경시 이벤트핸들러 호출 되는 예]

void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
    ShowMessage("CheckBox1Click");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    CheckBox1->Checked=! CheckBox1->Checked;
}
//Button1을 클릭할경우 Button1Click함수가 끝나기 전에 CheckBox1Click함수가 호출됨

   
TCheckBox의 OnClick이벤트도 그런 이벤트중에 하나인데요
위 코딩과 같이 Button1클릭시에 CheckBox의 Checked상태를 변경해주면
Button1Click함수가 끝나기 전에 즉 CheckBox->Checked상태를 변경하면서 곧바로
CheckBox의 OnClick이벤트 핸들러가 있으면 호출됩니다.

[ TRadioBox의 경우는..]

  TRadioBox의 경우도 코딩에서 Checked상태를 변경해도 이벤트가 호출되는 함수중에 하나인데요
  TRadioBox의 경우는
     1) Checked될때 는 이벤트가 호출되구
     2) UnChecked될때는 이벤트가 호출되지 않습니다.
 
   그리고 CallBack함수 조작할때 만약 곧바로 호출이 되지 않았다면..
    Control중에는 마우스 조작할때만 이벤트가 발생하는

  * CallBack함수에서 호출되지 않는 이유는 어떤 경우인제 정확히 잘모르겠네요

[ OnClick이 호출되지 않게 하려면..]

    다음 코드와 같이 이벤트 핸들러 함수를 NULL로 해주면 Checked상태가 Coding에서 변경되더라도
   이벤트 핸들러가 호출될 일이 없을것입니다.
      
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    CheckBox1->OnClick=NULL;
    CheckBox1->Checked=! CheckBox1->Checked;
    CheckBox1->OnClick=CheckBox1Click;
}
//---------------------------------------------------------------------------



[ 코딩으로 상태변경이 이벤트핸들러가 호출되는 다양한 경우]
  코딩으로 상태변경이 이벤트핸들러가 호출되는 다양한 경우에 대해 한번 정리해야 되는데...
  아직 정리를 못하고 있네요
 
   아뭍은 TCheckBox , TRadioBottun말구두 ..
   Coding으로 상태변경하니까 이벤트 핸들러가 호출되지 않을것이라고 착가하고 Coding하는 경우가
   상당히 많습니다.
  
   의심나면 반드시 테스트 해보고 코딩해야 할것입니다.

목록


 컨트롤 명  제어내용  직접 Mouse로 제어시 발생 이벤트  코딩으로 상태변경시 발생 이벤트
 TComboBox  Item의 선택을 변경시  ComboBoxChange  없음
 TListBox  Item의 선택을 변경시  ListBoxClick   없음
 TCheckBox  Checked상태 변경시  CheckBoxClick  CheckBoxClick
 TRadioButton  Checked상태 변경시  RadioButtonClick  RadioButtonClick
 TRadioGroup  Radio버턴 선택 변경시  RadioGroupClick  RadioGroupClick
 TTreeView  Node선택 변경시  TreeViewChange  TreeViewChange
 TEdit   Text의 내용 변경시  EditChange  EditChange
 TMemo  Text의 내용 변경시  MemoChange  MemoChange
 TListView  Item선택 변경  ListViewChange  ListViewChange
 TPageControl  ActivePageIndex변경시  PageControlChange발생  없음
       
       




그럼..  



배우는개발자 님이 쓰신 글 :
: 우선, 새해 복 많이 받으세요!
: 제가 작업하는 도중 궁금한 것이 생겨 질문을 남깁니다.
:
: 예를 하나 들겠습니다. 라디오박스에 보면 'OnClick' 이벤트가 있습니다.
: 이벤트드리븐 메소드를 만들어두면 라디오박스를 클릭할때마다 호출됩니다.
:
: 그런데 제가 임의로 해당 라디오박스의 체크를 바꿔주는 경우가 생겼습니다.
: Radiobox1->Checked = true
: 라는 식으로 말이죠.
: 그럴경우 OnClick 메소드가 그 소스라인에서 호출되는 것을 확인했습니다.
:
: 문제는 어떤 때는 호출되고 어떤 대는 호출이 되지 않는다는 것이었습니다.
: 그럴리가 없는데, 그럴리가 없는데 라며 오랜시간 디버깅하다가 내린 결론은..
:
: 콜백함수에서 'Radiobox1->Checked = true'라고 적혀있으면 이벤트드리븐 메소드가 불러지지 않고
: 폼 함수 내에서 'Radiobox1->Checked = true'라고 적혀있으면 불러진다는 것입니다!!
:
: 잘 모르겠는데 고수분들의 조언 부탁드립니다.
: 진실이 궁금하네요.

+ -

관련 글 리스트
59618 이벤트드리븐 함수 배우는개발자 2582 2010/01/04
59619     Re:이벤트드리븐 함수 장성호 2587 2010/01/04
59626         Re:Re:이벤트드리븐 함수 빨간눈 1712 2010/01/05
59627             Re:Re:Re:이벤트드리븐 함수 장성호 1915 2010/01/05
59623         Re:Re:감사합니다! 배우는개발자 2289 2010/01/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.