如何在delphi中显示进度条?

如何在delphi中显示进度条?,delphi,progress-bar,delphi-7,Delphi,Progress Bar,Delphi 7,可能重复: 我创建了一个隐写术应用程序,我想添加一个进度条来显示该过程的工作时间 procedure TForm2.Button2Click(Sender: TObject); var q,x,y,leastSigBit,currentPixel,newPixelValue: integer; pixels: PByteArray; bmp: TBitmap; begin memo1.lines.clear; Image2.Picture.Assign(Im

可能重复:

我创建了一个隐写术应用程序,我想添加一个进度条来显示该过程的工作时间

procedure TForm2.Button2Click(Sender: TObject);
var
   q,x,y,leastSigBit,currentPixel,newPixelValue: integer;
   pixels: PByteArray;
   bmp: TBitmap;
  begin

   memo1.lines.clear;
   Image2.Picture.Assign(Image1.Picture.Bitmap);
   bmp := Image2.Picture.Bitmap;

   for y := 0 to bmp.Height-1 do
   begin
      pixels := bmp.ScanLine[y];
      for x := 0 to bmp.Width-1 do
      begin
         currentPixel := pixels[x];
         leastSigBit := getBit(currentPixel, 0);
         newPixelValue:=setBit(newPixelValue ,7,leastSigBit);
         newPixelValue:=setBit(newPixelValue ,6,leastSigBit);
         newPixelValue:=setBit(newPixelValue ,5,leastSigBit);
         newPixelValue:=setBit(newPixelValue ,4,leastSigBit);
         newPixelValue:=setBit(newPixelValue ,3,leastSigBit);
         newPixelValue:=setBit(newPixelValue ,2,leastSigBit);
         newPixelValue:=setBit(newPixelValue ,1,leastSigBit);
         newPixelValue:=setBit(newPixelValue ,0,leastSigBit);
        end;

         pixels[x] := newPixelValue;
         memo1.lines.append('pixel ke ' + inttostr(x) + ',' + inttostr(y) + ' desimal ' + inttostr(currentPixel) + ' (biner ' + toBinary(currentPixel) + ') ' +
         ' desimal baru ' + inttostr(newPixelValue) + ' (biner ' + toBinary(newPixelValue) + ')');
        end;
   end;
   memo1.lines.append('All done!');
   Button4.Enabled:=True;
   Button2.Enabled:=False;
   Button1.Enabled:=False;
   Button5.Enabled:=True;
        end;

如何为流程创建进度条?我必须把命令进度条放在哪里?

这样做的正确方法是在后台线程中进行计算。否则您的GUI将冻结,并且您可能无法添加
中止
按钮。因此,您必须学习如何使用线程(例如,
TThread
)来正确地执行此操作。然后,您的代码必须是线程安全的,并且您应该只在线程代码和GUI之间以安全的方式进行通信,例如使用消息。主要观点见

不管怎样,如果你想为教育目的或私人需要这样做,也许上面提到的问题没有那么严重。然后你可以这样做:

procedure TForm2.Button2Click(Sender: TObject);
var
  ...
begin

  ProgressBar1.Min := 0;
  ProgressBar1.Max := bmp.Height;
  ProgressBar1.Position := 0;
  ProgressBar1.Step := 1;

  for y := 0 to bmp.Height-1 do
  begin

    for x := 0 to bmp.Width-1 do
    begin
    end;

    ProgressBar1.StepIt;
    ProgressBar1.Update;

  end;

end;
要尝试此操作,请创建一个新的VCL项目。添加一个
t压缩条
和一个
t按钮
。在按钮的
OnClick
事件中,添加以下代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
begin
  ProgressBar1.Min := 0;
  ProgressBar1.Max := 100;
  ProgressBar1.Position := 0;
  ProgressBar1.Step := 1;

  for i := 0 to 99 do
  begin

    for j := 0 to 200 do
    begin
      sleep(1);
    end;

    ProgressBar1.StepIt;
    ProgressBar1.Update;

  end;
end;

但是,一定要注意这种方法最重要的背后。应用程序在整个“计算”过程中冻结。您甚至可能无法移动应用程序窗口,并且肯定无法与其GUI交互。Windows甚至可能报告程序已冻结,并提供终止程序和发送错误报告的选项。。。最后,由于整个GUI已关闭,因此不可能添加“停止计算”按钮。解决方案是什么?肮脏的是使用
ProcessMessages
和其他肮脏的手段。如前所述,正确的方法是将计算放在自己的线程中。

这样做的正确方法是在后台线程中进行计算。否则您的GUI将冻结,并且您可能无法添加
中止
按钮。因此,您必须学习如何使用线程(例如,
TThread
)来正确地执行此操作。然后,您的代码必须是线程安全的,并且您应该只在线程代码和GUI之间以安全的方式进行通信,例如使用消息。主要观点见

不管怎样,如果你想为教育目的或私人需要这样做,也许上面提到的问题没有那么严重。然后你可以这样做:

procedure TForm2.Button2Click(Sender: TObject);
var
  ...
begin

  ProgressBar1.Min := 0;
  ProgressBar1.Max := bmp.Height;
  ProgressBar1.Position := 0;
  ProgressBar1.Step := 1;

  for y := 0 to bmp.Height-1 do
  begin

    for x := 0 to bmp.Width-1 do
    begin
    end;

    ProgressBar1.StepIt;
    ProgressBar1.Update;

  end;

end;
要尝试此操作,请创建一个新的VCL项目。添加一个
t压缩条
和一个
t按钮
。在按钮的
OnClick
事件中,添加以下代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
begin
  ProgressBar1.Min := 0;
  ProgressBar1.Max := 100;
  ProgressBar1.Position := 0;
  ProgressBar1.Step := 1;

  for i := 0 to 99 do
  begin

    for j := 0 to 200 do
    begin
      sleep(1);
    end;

    ProgressBar1.StepIt;
    ProgressBar1.Update;

  end;
end;

但是,一定要注意这种方法最重要的背后。应用程序在整个“计算”过程中冻结。您甚至可能无法移动应用程序窗口,并且肯定无法与其GUI交互。Windows甚至可能报告程序已冻结,并提供终止程序和发送错误报告的选项。。。最后,由于整个GUI已关闭,因此不可能添加“停止计算”按钮。解决方案是什么?肮脏的是使用
ProcessMessages
和其他肮脏的手段。如前所述,正确的方法是将计算放在自己的线程中。

实际上,所有这类问题的答案都是我在你的文章中给出的答案。[如果你真的不想进入线程,你可以在外循环中以一种天真的方式单步执行进度条,然后执行脏的
ProgressBar1.Update
ProcessMessages
)@Andreas:a
ProgressBar1.Update处理消息
@KenWhite:是的,我想可以。但这两种方法都不足以让你的软件公之于众…@Andreas:我同意。我是针对你关于“天真方式”的评论发表的。:-)@安德烈亚斯我很抱歉,但我不明白怎么做。事实上,所有这类问题的答案都是我在你的报告中给出的。[如果你真的不想进入线程,你可以在外循环中以一种天真的方式单步执行进度条,然后执行脏的
ProgressBar1.Update
ProcessMessages
)@Andreas:a
ProgressBar1.Update处理消息
@KenWhite:是的,我想可以。但这两种方法都不足以让你的软件公之于众…@Andreas:我同意。我是针对你关于“天真方式”的评论发表的。:-)@Andreas我很抱歉,但我不知道怎么做。好的,非常感谢,这非常有帮助。我刚开始学习delphi,所以需要更多的写作示例。好的,非常感谢,非常有帮助。我刚开始学习delphi,所以需要更多的写作示例。