4

我的一个朋友向我寻求帮助,因为他想要一个指示上传/下载某些文本文件的进度条。在这里你可以看到我使用的代码:

procedure TForm1.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
 Application.ProcessMessages;
 ProgressBar1.Position:= AWorkCount;
 Label6.Caption:=IntToStr(ProgressBar1.Position);
end;

procedure TForm1.IdFTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
 if(AWorkCountMax>0) then
  begin
    ProgressBar1.Max:=AWorkCountMax;
  end;
  ProgressBar1.Position:=0;
end;

procedure TForm1.IdFTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
 ProgressBar1.Position:=0;
end;

在我的表单上,我还有 2 个标签:第一个表示进度并被调用Label6,另一个只是有一个类似“%”的标题,如下所示。标签 6 应该有一个从 0 到 100 的值。

在此处输入图像描述

他发送的文本文件现在很小,但它们会更大。我的问题是我看不到程序上的进度条(绿色矩形),而且标签 6 上的值超过 100 并达到 700。我该怎么办?

4

1 回答 1

8

AWorkCountMax并且AWorkCount是字节数,而不是百分比。您需要在更新 UI 时考虑到这一点,尤其是在您想显示百分比时。

话虽如此,AWorkCountMax仅对上传有效,对下载无效。这样做的原因是因为FTP协议在传输过程中不传输文件大小,所以TIdFTP不知道正在下载的文件的大小,只知道正在上传的本地文件的大小。对于下载,您必须先手动检索文件大小,使用TIdFTP.Size()TIdFTP.List()TIdFTP.ExtListItem().

并完全远离Application.ProcessMessages()。如果要触发重绘,请Update()改用。

尝试这个:

procedure TForm1.IdFTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  if AWorkMode = wmWrite then
    ProgressBar1.Max := AWorkCountMax
  else;
    ProgressBar1.Max := ...; // value retrieved beforehand...
  ProgressBar1.Position := 0;
end;

procedure TForm1.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
  if ProgressBar1.Max > 0 then
  begin
    ProgressBar1.Position := AWorkCount;
    Label6.Caption := IntToStr((ProgressBar1.Position * 100) div ProgressBar1.Max) + '%';
  end else
    Label6.Caption := IntToStr(AWorkCount) + ' bytes';
  Update;
end;

procedure TForm1.IdFTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  ProgressBar1.Position := 0;
end;

或者:

var
  WorkMax: Int64;

procedure TForm1.IdFTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  if AWorkMode = wmWrite then
    WorkMax := AWorkCountMax
  else;
    WorkMax := := ...; // value retrieved beforehand...
  ProgressBar1.Min := 0;
  ProgressBar1.Max := 100;
  ProgressBar1.Position := 0;
end;

procedure TForm1.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
  if WorkMax > 0 then
  begin
    ProgressBar1.Position := (AWorkCount * 100) div WorkMax;
    Label6.Caption := IntToStr(ProgressBar1.Position) + '%';
  end else
    Label6.Caption := IntToStr(AWorkCount) + ' bytes';
  Update;
end;

procedure TForm1.IdFTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  ProgressBar1.Position := 0;
end;
于 2013-07-06T02:50:21.300 回答