Delphi ProgresBar-在条达到100%后显示消息

Delphi ProgresBar-在条达到100%后显示消息,delphi,delphi-xe4,tms,Delphi,Delphi Xe4,Tms,我在玩进度条。。。试图在进度条100%到达行末尾时显示消息我使用了Raize状态栏和TMS AdvProgressBar 对于Raize,此代码示例似乎有效: procedure TForm1.Timer1Timer(Sender: TObject); begin rzprogressstatus1.Percent := rzprogressstatus1.Percent +1; if rzprogressstatus1.Percent = 100 then begin show

我在玩进度条。。。试图在进度条100%到达行末尾时显示消息我使用了Raize状态栏和TMS AdvProgressBar 对于Raize,此代码示例似乎有效:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  rzprogressstatus1.Percent := rzprogressstatus1.Percent +1;
  if rzprogressstatus1.Percent = 100 then begin
    showmessage('Yo');
    application.Terminate;
  end;
end;
然而,对于AdvProgressBar来说,它并没有这样做,因为它会在 位置达到100。这让我担心雷泽是否有麻烦

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 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;

那么,会发生什么呢。消息没有显示?位置永远不等于100?弄清楚会发生什么?告诉我们你的调试结果。我一开始做得对吗?两种情况下的位置都达到100%,好吧……代码看起来不太好。但这不是真正的代码。显示计时器的对话框看起来很可疑。对话框是否显示?是的,消息显示。。。。我对带有计时器的消息也持怀疑态度,这就是为什么我还问是否有其他方法解决这个问题…只是学习…不清楚为什么您会看到访问冲突。但是,在计时器仍处于活动状态时显示对话框是错误的。计时器事件将在对话框的模型消息循环内反复触发。因此,计时器事件处理程序是可重入的。但我不知道你到底想做什么。当然,您并不是在试图测量计时器事件的进度。停止和启动计时器是不必要的。只需将行Timer1.Enabled:=False;在信息显示之前,计时器将永远停止。这只是使用计时器时的一般建议。当计时器意外触发时,它会帮你省去很多麻烦。真的吗?我从来没有见过这样的事情,也不会提出这样的建议。至少因为你不应该把长时间运行的任务放在计时器里。而且,仅仅因为您无法处理应该在计时器计时之间处理的代码,就为其消息循环创建隐藏窗口的成本是不必要的。可能这样使用计时器既快又脏,但对于小型工具,我不在乎。我想这取决于你的需要。然而,我认为这里的评论是讨论正确使用计时器的错误地方-好的,让我们把它清理干净。只有一种情况下,您可以通过显示的消息框保持恐惧-
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;