我的表单上有一个进度条和一个图像。现在我正在对图像上的每条扫描线进行一些处理。我想使用进度条显示我的进程的进度。我设置了进度条的以下属性:
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。
答案 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提示,万一有人不考虑它们。