Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi中管理TProgressBar,并在TImage上完成流程?_Delphi - Fatal编程技术网

如何在Delphi中管理TProgressBar,并在TImage上完成流程?

如何在Delphi中管理TProgressBar,并在TImage上完成流程?,delphi,Delphi,我的表格上有一个进度条和一个图像。现在我正在对图像上的每条扫描线进行一些处理。我想使用progressbar显示流程的进度。我设置progressbar的以下属性: Max = 20 Min = 0 Position = 0 Step = 1 Smooth = False 现在,我的buttonclick事件代码如下所示: stat := imgmain.Picture.Bitmap.Height div pbImage.Max; Curstatus := 0; for cn

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

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。

带有

Max = 20 
Min = 0 

实际上,进度条中有21个步骤,0是第一个,20是最后一个。将最大值设置为19,它应该可以工作。

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


据我所知,唯一的进度条会以你想要的方式运行,它是“TJVXProgressBar”(绝地VCL的一部分),当位置增加时,它会增加显示的块数,因此当最大值=20,最小值=1,位置=5时,将显示5个块,使用Max和Position,以便Progressbar可以自动显示已完成的工作量。例如:

Min := 100;
Max := 150;
Position := 125;
=> 50% work complete, the progress bar will be half-filled with green blocks.
使用步骤,以便在调用步骤时,进度条知道要向“位置”添加多少内容。例如,如果要为文件复制操作创建进度条,则可能会使用以下内容:

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将显示足够的块来表示完成工作的百分比。最小值、最大值和位置用于计算该百分比。

只是提示:

如果在循环内执行作业之前更改位置值,则会获得更好的视觉效果,如果在最后一个循环后,在隐藏进度之前循环后没有多少剩余工作,则效果会更好

换言之:

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
这将永远不会显示progressbar来丰富结束,它将丰富结束,但一旦显示,progressbar就会隐藏或关闭窗口,等等,所以用户没有时间看到它结束

只需在作业之前执行增量,progressbar将不会显示已经完成了多少工作,但会显示它正在工作的步骤,因此只要最后一步开始,最后一步就会显示出来,所以用户会认为progressbar将被填充一段时间

始终记住进度条有最大最小+1个可能的位置。。。所以,如果最小值为零,它将比最大值多一个:第一个位置将为0,第二个位置将为1,等等,最后一个位置将为最大值

如果要从1到20,请将“最小值”设置为1,而不是零


这些是jsut提示,以防有人不考虑它们。

这是设计的,进度条显示完成工作的百分比,“最大”和“最小”属性可帮助您指定完成的工作量。想想看:如果进度条显示复制1Mb文件的进度,它应该显示多少个块?100万块?@Cosmin所以你想说我们不应该改变最大值和最小值,并相应地计算进度百分比。?是吗?不是,我是说不要期望看到(最大-最小+1)块。@Cosmin所以,这是设计的。。i、 例如,我误解了如果Min为0,则应该有最大的块数。正确的?请将此内容写为我将接受的答案。我更改此值,现在如果执行块19次,则
。但问题是一样的,它不会有任何区别,因为
stat
的值是使用progressbar的最大值计算的。@DwrCymru我的代码工作正常,当进程完成时它填充整个progressbar,我的代码的问题,您建议的代码,甚至DwrCymru的回答是,它没有显示
Max
属性指定的块数。i、 例如,最大值为19,但显示24个块;最大值为768,但显示27个块