델파이 언어를 몰라서 빌더로 코딩한 예제를 올립니다.
아이디어만 참고하시면 될듯 합니다.
어차피 문법 자체는 비슷할테니...?
우선 헤더에서 TForm1의 클래스 앞에 아래와 같이 TRadioButton을 상속받아서 OnChange 이벤트를 추가한
TRadioButton 클래스를 만듭니다.
이 새로운 TRadioButton은 timer로 precheck와 Checked를 비교하여 값이 다르면 _OnChange를 호출하고 변한 Checked를
다시 precheck에 대입합니다.
OnChange 이벤트는 디자인타임에서 더블클릭 등으로 등록할 순 없고, 런타임시에 등록해줘야 합니다.
class TRadioButton : public Vcl::Stdctrls::TRadioButton {
bool precheck;
TTimer *timer;
TNotifyEvent _OnChange;
void __fastcall timerOnTimer(TObject *Sender) {
if (_OnChange && precheck!=this->Checked) {
_OnChange(this);
precheck=this->Checked;
}
}
void __fastcall SetOnChange(TNotifyEvent onchange) {
if (onchange==0) {
timer->Enabled=false;
_OnChange=0;
}else {
precheck=this->Checked;
_OnChange=onchange;
timer->Enabled=true;
}
}
TNotifyEvent __fastcall GetOnChange(void) {
return _OnChange;
}
public:
__fastcall TRadioButton(TComponent* Owner) : Vcl::Stdctrls::TRadioButton(Owner) {
_OnChange=0;
timer = new TTimer(this);
timer->Enabled=false;
timer->Interval=1;
timer->OnTimer=timerOnTimer;
}
__property TNotifyEvent OnChange={read=GetOnChange,write=SetOnChange};
};
#define TRadioButton ::TRadioButton
폼에 TMemo, TRadioButton, TButton을 하나씩 올리시고 아래와 같이 코딩해서 테스트 해보세요.
혹은 TRadioButton 을 두개 올리시고 키보드 방향키로 왔다 갔다 해도 OnChange 이벤트인 test함수가 호출됩니다.
도움이 되셨기를...
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
RadioButton1->OnChange=test;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::test(TObject *Sender)
{
TRadioButton *a=(TRadioButton *)Sender;
Memo1->Lines->Clear();
Memo1->Lines->Add(BoolToStr(a->Checked,true));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RadioButton1->Checked=!RadioButton1->Checked;
}
첫눈 님이 쓰신 글 :
: Panel위에 RadioButton을 두개 올려 놓았습니다.
:
: RadioButton을 선택하면 그에 맞는 데이터를 화면에 보여주고자 하는데요.
:
: 문제는 RadioButton에 onChange나 onSelected이벤트가 없네요.
:
: 지금까지는 어쩔 수 없이 Click이벤트에서 처리를 했는데
: 키보드의 방향키로 RadioButton을 선택하는 경우에는 처리를 할 수가 없습니다.
:
: RadioButton에서 onChange나 onSelected이벤트를 처리할 수는 없을까요?
|