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
[59627] Re:Re:Re:이벤트드리븐 함수
장성호 [nasilso] 1920 읽음    2010-01-05 11:28
음..

[이벤트란?]
   이벤트라는것은?
   그냥 특정 상황을 얘기합니다.
   IO로 데이터가 들어왔을때, 나갈때, 특정데이터가 들어올때..
   또는 마우스 Down할때 ,up할대, Down하고 up할때..

   마우스 Click이라는 것은 
       마우스를 Down후 Up하면 Click이라고 개념을 정한것이죠

   일반적으로 많이 쓰이는 이벤트가 있지만,
   그냥 s/w개발자가 정해주기 나름입니다.

  
[이벤트 핸들러란?]
    위와같은 특정 이벤트가 발생시  s/w적으로 무엇인가를 처리하고자 할때
    호출되는 함수를 이벤트 핸들러라고 보면 됩니다.


[다음과 같은 경우엔?]
    

void __fastcall TForm1::CheckBox1Click(TObject *Sender)   
{   
    //무슨 작업..
}   
//---------------------------------------------------------------------------   
void __fastcall TForm1::Button1Click(TObject *Sender)   
{   
    //CheckBox1->Checked=! CheckBox1->Checked;   

    CheckBox1Click(CheckBox1);
    //위와같이 하는것은 CheckBox1에서 Click이벤트가 발생한것이 아니라
   //그냥 CheckBox1Click이라는 함수를 호출해주는것뿐입니다.
}   


위와같이 하는것은 CheckBox1에서 Click이벤트가 발생한것이 아니라
그냥 CheckBox1Click이라는 함수를 직접 호출해주는것 뿐입니다.

[TObject *Sender 에 대해]
음. 예를 들어 설명하면..
비슷한 목적의 버튼이 10개가 있는데..  10개의 버튼을 클릭했을때 호출되는 함수를 각각 만드러 함수를 10개 만들면
이벤트 핸들러 함수에 TObject *Sender라는게 필요 없을것입니다.

비슷한 목적인경우 처리하는 코드도 비슷할것이구..
이런 경우 하나의 함수로 만들면 코드도 짧고 ,  기능의 변경 도 편리하게 되겠죠
버튼 10개 모두 Click이벤트 발생시에 하나의 특정 이벤트 핸들러 함수가 호출되도록 설정해주면
편리하겠죠

하지만 함수안에서  10개 버튼 모두 기능이 완전히 똑같지 않다면 어떤 버튼을 Click했는지 알수가 있어야 할것입니다.
그것을 TObject *Sender 라는 것을 통해서 구분하는것입니다.

VCL에서는  이벤트 핸들러에 이벤트 발생 객체 Sender라는 기본적으로 넘겨주게 되어
더욱 객체지향적(OOP)으로 코딩하기에 편리합니다.

그럼..


빨간눈 님이 쓰신 글 :
: 새해복 마니 받으세요~
: 위 글을 읽다 보면서 몇가지 의문이 있어 질문드립니다.
: void __fastcall TForm1::CheckBox1Click(TObject *Sender)
: {
:     ShowMessage("CheckBox1Click");
: }
: 여기서 ,
: TObject *Sender; //선언후
: CheckBox1Click(Sender); 하면 이벤트 핸들린 할수 있게 되잖아요?
:
: 이때 TObject 객체에서 어떤 이벤트가 발생됐는지도 알수 있는건가요?
: 그러니깐~ TForm1에서 발생되는 이벤트 발생에 대한 내용들이여 ^^
: 대책없이 코딩이 되니깐...문의 드리는거라 질문의 타당성도 모르겠어요~ ㅎㅎ
:
:
:
:
:
:
: //---------------------------------------------------------------------------
:
: 장성호 님이 쓰신 글 :
: : 음...
: :
: : 말씀 하신 내용은
: : 제가  언제 한번 정리해야지 하고 생각하던 내용인데
: : 자료 정리를  못해서 미루다 미루다 아직도 못했네요
: :
: : [이벤트 핸들러 호출 시점]
: :     이벤트 이름을 볼때    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 이벤트드리븐 함수 배우는개발자 2587 2010/01/04
59619     Re:이벤트드리븐 함수 장성호 2590 2010/01/04
59626         Re:Re:이벤트드리븐 함수 빨간눈 1717 2010/01/05
59627             Re:Re:Re:이벤트드리븐 함수 장성호 1920 2010/01/05
59623         Re:Re:감사합니다! 배우는개발자 2292 2010/01/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.