음...
다음과 같이 하면 timer도 필요없구..
button이 여러개라도 상관이 없으며..
Button별로 CoolTime을 모두 다르게 줄수도 있습니다.
class TButton : public Stdctrls::TButton
{
int m_iClickTime;
int m_iCoolTime;
public:
__fastcall TButton(TComponent* Owner)
: Stdctrls::TButton(Owner)
{
m_iClickTime=GetTickCount();
m_iCoolTime=0;
}
DYNAMIC void __fastcall Click()
{
if((GetTickCount()-m_iClickTime) < m_iCoolTime ) return;
Stdctrls::TButton::Click();
m_iClickTime=GetTickCount();
}
public:
__property int CoolTime = {read=m_iCoolTime, write=m_iCoolTime};
};
#define TButton ::TButton
class TForm1 : public TForm
{
__published: // IDE-managed Components
TImage *Image1;
TButton *Button1;
TButton *Button2;
TButton *Button3;
TButton *Button4;
//....
};
위와같이 TForm1 선언 앞쪽에...
Stdctrls유닛의 TButton을 교체식클래스로 새로만들어 정의 했습니다.
기본적으로 CoolTime은 0 이구요
설정하기에 따라 달라 집니다. tickcount를 이용한것 이므로 1000 이 1초를 타나냅니다.
그런다음 다음과 같이 Button7의 CoolTime을 바꿔보면서..
Button7을 클릭해보세요
Memo장에 직히는 log를 통해 아무리 빨리 클릭해도 cooltime 안에는 OnClick이벤트가 호출되지 않을것입니다.
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Memo1->Lines->Add(Now().FormatString("hh:nn:ss zzz"));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
if(Button7->CoolTime==0)
Button7->CoolTime=2000;
else
Button7->CoolTime=0;
}
//---------------------------------------------------------------------------
그럼...
정문환 님이 쓰신 글 :
: 예를들어 어떤 버튼을 클릭하면 목록을 refresh하는 메소드가 있다고 치구요.
:
: 목록refresh양이 많아서 2초 동안은 버튼이 여러번 눌려진다해도 눌러지는 것을 무시하고
: 딱 한 번만 처리하려고 합니다.
: (물론 버튼을 비활성화하고 2초후에 다시 활성화해도되지만 여기서는비활성화되지 않게 하고싶습니다.)
:
: timer를 사용하면 되는것같은데 한 개라면 문제가 없는데 10개의 버튼을 만든다고 하면
: 각각의 timer를 10개씩이나 만들어야 하는데 비효율적인것같아서 질문드립니다.
:
: timer를 하나로 사용하는 방법 또는 timer외에 다른 방법이 있을까요?
|