【问题标题】:Delphi Progress Bar德尔福进度条
【发布时间】:2009-03-30 06:36:39
【问题描述】:

我正在尝试制作一个从 0% 开始的进度条,并且需要 5 秒才能达到 100%。单击 Button1 后,进度条将开始上升。有什么建议吗?我在 Google 上查看过,但在这类事情上对我没有任何好处。

另外,在0%时,应该有一个标签写着Waiting...,当进度条开始时,它应该转到Working...,当它完成时,它应该是Done!

【问题讨论】:

    标签: delphi progress-bar


    【解决方案1】:

    您可以使用间隔为 50 的计时器,并首先将启用设置为 false。

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      timer1.Enabled := True;
    end;
    
    procedure TForm1.Timer1Timer(Sender: TObject);
    const
      cnt: integer = 1;
    begin
      ProgressBar1.Position := cnt;
      if cnt = 1 then Label1.Caption := 'Waiting...'
      else if cnt = 100 then begin
        Label1.Caption := 'Done!';
        Timer1.Enabled := False;
      end else
        Label1.Caption := 'Working...';
      Inc(cnt);
    end;
    

    【讨论】:

    • 使用计时器的一个问题是不能保证它会花费 5 秒(顺便说一句,在您的示例中为 2.5)。大多数情况下,这将是一场非常接近的比赛。在充满压力的环境中,它可能是几秒钟的数量级。
    • @Lieven:你是对的,但是可以通过不那么愚蠢的算法来最小化这种影响:不要计算计时器滴答声,而是计算事件处理程序中自启动以来经过的时间。为了获得更高的消息优先级,请改为从后台线程每 100 毫秒发布一个 WM_USER。
    • 是的。这不是一个完美的解决方案,但基本思路是正确的
    • 好的,我试过你的代码,但遇到了一些问题。在我的表单上,我有一个 TButton、TProgressBar、TTimer 和一个 TLabel。我复制并粘贴了代码,但它说“计时器不包含成员'已启用'”。 Tprogressbar.Position 和 Label1.Caption 也是如此。我可能会错过什么?
    • 您使用的是哪个 Delphi 版本?
    【解决方案2】:

    使用 GetTickCount() 和初始化变量:

    uses Windows;
    
    var mseconds, starttime: integer;
    
    
    procedore TForm1.FormCreate()
    begin
      starttime := GetTickCount();
      mseconds := 0;
      Timer1.Enabled := false;
      Label1.Caption := '';
      ProgressBar1.Position := 0;
      Label1.Caption := 'Waiting...';
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin  
      ProgressBar1.Min := 0;
      ProgressBar.Max := 100;
      ProgressBar1.Position := 0;
      timer1.Enabled := True;
      Label1.Caption := 'Working...';  
    end;
    
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin  
      mseconds := GetTickCount() - starttime;
      if mseconds < 5000 then
        ProgressBar1.Position := Trunc(mseconds / 50)
      else begin
        ProgressBar1.Position := 100;
        Label1.Caption := 'Done!';
        Timer1.Enabled := false;
      end;
    end;
    

    【讨论】:

    • 好的。你的有一些错误,但我能够修复它们。但是由于某种原因,当我按下按钮时,标签变为 Working...,但之后它什么也没做。我看了看是否有什么问题,可能是由以下原因引起的:starttime := GetTickCount(); (阅读下一条评论)
    • 和毫秒 := starttime - GetTickCount();?
    • @PuppyKevin:你在正确的轨道上;如果您没有看到错误,请使用调试器,您会找到它。此外,Timer1 完成后不会被禁用...
    猜你喜欢
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2011-10-04
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多