2013-10-06 4 views
-1

진행률 막대를 사용하여 재생 중입니다 ... 진행률 막대가 줄 끝까지 도달하면 메시지를 표시하려고합니다 (100 %). 이 위치에 도달하면 100.That이 Raize 문제에 아마이면 나를 걱정하게 지속적으로 메시지를 발사 유지하기 때문에ProgresBar - 막대가 100 %에 도달 한 후에 메시지를 표시합니다.

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    rzprogressstatus1.Percent := rzprogressstatus1.Percent +1; 
    if rzprogressstatus1.Percent = 100 then begin 
    showmessage('Yo'); 
    application.Terminate; 
    end; 
end; 

을하지만, 그렇지 않은 AdvProgressBar을 위해 : TMS AdvProgressBar) Raize를 들어 ,이 코드 샘플은 제대로 작동 .

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    AdvProgressBar1.Position := AdvProgressBar1.Position +1; 
    if AdvProgressBar1.Position = 100 then begin 
    showmessage('Yo'); 
    application.Terminate; 
    end; 
end; 

편집 : 디버거를 보여줍니다

첫 번째 예외 $ 00649D6C에서. 예외 클래스 $ C0000005와 '액세스 위반이 0x00649d6c : 읽기 주소가 0x00000048'입니다. 프로세스 만들기 Project1.exe (2928)하고 다음 코드를 중지 :

procedure TTimer.SetEnabled(Value: Boolean); 
begin 
    if Value <> FEnabled then begin 
    FEnabled := Value; 
    UpdateTimer; 
    end; 
end; 

내가 말했듯이, 나는 바 끝에 도달 한 다음 응용 프로그램을 종료 할 때 메시지를 표시하고 싶습니다. 내가 여기서 무엇을 놓치고 있니? 그것을 할 수있는 더 좋은 방법이 있습니까?

+1

그래서 어떻게 될까요? 메시지가 표시되지 않습니까? 위치는 결코 100과 같지 않습니까? 무슨 일이 일어 났는지 분명히 해? 디버깅 결과를 알려주십시오. –

+0

처음부터 올바른 일을하고 있습니까? 두 경우 모두 100 %에 도달 했으니 까 ... – user763539

+0

코드가 좋지 않습니다. 하지만 어쨌든 실제 코드는 아닙니다. 타이머의 대화 상자를 보면 모호한 것처럼 보입니다. 대화 상자가 표시됩니까? –

답변

2

타이머를 사용해야 할 때 시간이 많이 소요되는 경우 (대화 상자를 표시하는 데 많은 시간이 소요됨) 타이머 이벤트를 시작할 때 항상 타이머를 끄고 마지막에 다시 켜야합니다 (필요한 경우)

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    Timer1.Enabled := False; 
    AdvProgressBar1.Position := AdvProgressBar1.Position +1; 
    if AdvProgressBar1.Position = 100 then begin 
    showmessage('Yo'); 
    application.Terminate; 
    end; 
    Timer1.Enabled := True; 
end; 
+0

타이머 정지 및 시작은 필요하지 않습니다. 메시지가 보여지기 직전에'Timer1.Enabled : = False; '라는 줄을 넣으면 타이머가 영원히 멈추게됩니다. – TLama

+0

타이머로 작업 할 때 일반적으로 조언합니다. 타이머가 예기치 않게 작동하면 많은 두통을 막을 수 있습니다. – fuchs777

+0

정말요? 나는 본 적이 없으며 이와 같은 것을 결코 제안하지 않을 것입니다. 최소한 타이머에서 장시간 실행되는 작업을 절대로해서는 안되기 때문입니다. 그리고 타이머 틱 사이에서 처리되어야하는 코드를 처리 할 수 ​​없기 때문에 메시지 루프를 위해 숨겨진 윈도우를 만드는 것은 비싸지 않다. – TLama