음...
말씀 하신 내용은
제가 언제 한번 정리해야지 하고 생각하던 내용인데
자료 정리를 못해서 미루다 미루다 아직도 못했네요
[이벤트 핸들러 호출 시점]
이벤트 이름을 볼때 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'라고 적혀있으면 불러진다는 것입니다!!
:
: 잘 모르겠는데 고수분들의 조언 부탁드립니다.
: 진실이 궁금하네요.