class TTest : public TForm {
public:
TTimer *Timer1;
TProgressBar *pb;
int n,nMax;
__fastcall TTest(TComponent* Owner):TForm(Owner,1) {
pb = new TProgressBar(Owner);
pb->Parent=this;
pb->Position=0;
Timer1 = new TTimer(Owner);
Timer1->Enabled=false;
Timer1->Interval=100;
Timer1->OnTimer=ATimer;
this->OnShow=testOnShow;
}
void __fastcall testOnShow(TObject *Sender) {
n=0;
pb->Position=n;
pb->Max=nMax;
Timer1->Enabled=true;
}
void __fastcall ATimer(TObject *Sender) {
if (n < nMax) {
pb->Position=n+1;
//쿼리작업
n++;
}else {
//쿼리가 끝났을 때 작업
Timer1->Enabled=false;
ShowMessage("End");
pb->Visible=false;
}
}
};
TTest *a = new TTest(Application);
a->nMax=20;
a->ShowModal();
생성자에, 0부터 nMax만큼 쿼리를 수행하며 ProgressBar를 갱신하는 타이머를 생성하고,
OnShow에 Timer를 시작하는 함수를 대입한 클래스 입니다.
폼에 버튼하나 올리시고 긁어 붙여서 테스트 해보시면 됩니다.
저도 예전에 궁금했던건데 'Starlet'님 에게 타이머라는 힌트를 얻어서 한번 구현해 보았습니다.
도움이 되었으면 하네요.
김창환 님이 쓰신 글 :
: 폼을 열기 전에 쿼리를 많이 돌려서 보여줄 값을 긁어와야 합니다.
:
: 이러한 이유로 OnShow() 이벤트에 쿼리를 넣고 돌리고 있는데, 시간이 너무 많이 소요되다 보니 FlatGauge를 올려놓고 진행상황을 표시해주려 했습니다.
:
: 그런데 OnShow() 에 있는 쿼리가 모두 끝나기 전에는 폼이 보여지지도 않고, 결과적으로 폼 위에 얹어둔 게이지도 나중에서야 처리가 다 끝나고 폼이 보여지면 그 때 100%로 보여진다는거죠.
:
: 혹시 도움이될까 해서
: Gauge1->Refresh();
: Application->ProcessMessages();
:
: 위 코드를 추가 해봤는데도 여전히 OnShow() 내의 처리가 다 끝난 뒤에 보여지고 있습니다.
:
: 이러한 문제를 해결하려면 어떻게 접근해야할까요?
: 이리저리 해봐도 해결책이 보이지 않아 도움을 청합니다.ㅠ
|