我如何使用TImage上的流程完成Delphi中的TProgressBar管理?

时间:2010-07-06 11:46:28

标签: delphi

我的表单上有一个进度条和一个图像。现在我正在对图像上的每条扫描线进行一些处理。我想使用进度条显示我的进程的进度。我设置了进度条的以下属性:

Max = 20
Min = 0
Position = 0
Step = 1
Smooth = False

现在我在buttonclick事件上的代码如下:

   stat := imgmain.Picture.Bitmap.Height div pbImage.Max;
   Curstatus := 0;
   for cnt := 0 to img.Picture.Bitmap.Height - 1 do begin
      for cnt1 := 0 to img.Picture.Bitmap.Width - 1 do begin
        //Some processing
      end;
      if cnt > (Curstatus + stat) then begin
         pgimg.StepIt;
         Curstatus := cnt + stat;
      end;    
   end;

我的问题是当我运行此代码时,if块执行了20次,但它在我的进度条上显示了超过20个步骤。最后一步也显示不完整。请注意,smooth属性设置为false。

4 个答案:

答案 0 :(得分:3)

Max = 20 
Min = 0 

您的进度条实际上有21个步骤,其中0表示第一步,20表示最后一步。将Max设置为19,它应该可以工作。

答案 1 :(得分:1)

将最大值设置为图像的高度,并在处理(或之前)每条扫描线后增加位置。

我所知道的唯一进度条将按照您想要的方式运行“TJvXPProgressBar”(JEDI VCL here的一部分),这将增加当Position增加时的dsiplayed块数,因此Max:= 20,Min:= 1且Position:= 5将显示5个块。

答案 2 :(得分:1)

使用了

最小值,最大值和位置,因此进度条可以自动完成了多少工作。例如:

Min := 100;
Max := 150;
Position := 125;
=> 50% work complete, the progress bar will be half-filled with green blocks.

单步,因此当您调用 StepIt 时,进度条会知道要添加到“位置”的数量。例如,如果您为文件复制操作执行了进度条,则可以使用以下内容:

Min := 0;
Max := 2 * 1024 * 1024; // 2Mb
Step := 4 * 1024; // 4Kb
Position := 0;

// in a loop, copy 4Kb blocks, and then do:
ProgressBar.StepIt; // this is equivalent to Position := Position + Step;

Min和Max 与您在屏幕上看到的块数无关,这完全取决于特定于实现。例如,XP之前的Windows版本没有显示块,它们显示了一个简单的填充栏。块的大小甚至可能与主题有关! Windows将显示足够的块来表示完成工作的百分比。最小值,最大值和位置用于计算该百分比。

答案 3 :(得分:1)

只是提示:

如果在循环中执行作业之前更改位置值,您将获得更好的视觉效果,如果在最后一个循环之后,循环之后没有多少工作,直到进度被隐藏。

换句话说:

TheProgressBar.Min:=0;
TheProgressBar.Max:=20;
TheProgressBar.Position:=0;
for i:=1 to 20
do begin
        // Do some job that take some time
        TheProgressBar.Position:=TheProgressBar.Position+1;
   end;
TheProgressBar.Visible:=False; // Or window is closed, etc

那将永远不会显示进度条丰富结束,它将丰富结束,但是一旦显示,进度条被隐藏或窗口关闭等,所以用户没有时间看到它结束。

只需在作业之前执行增量,进度条将显示尚未完成的程度,但会显示它正在运行的步骤,因此只要最后一步执行,最后一步就会显示,因此用户将会看到进度条填补了一段时间。

总而言之,记住进度条有Max-Min + 1个可能的位置...所以如果Min为零,它将有一个超过最大值:第一个将是0,第二个将是1,等等,最后一个将是最大

如果您想要1到20,请将min设置为1,而不是零。

Theese是jsut提示,万一有人不考虑它们。