Delphi Indy FTP不';无法正确加载进度条

Delphi Indy FTP不';无法正确加载进度条,delphi,Delphi,我的一个朋友向我寻求帮助,因为他想要一个progressbar,指示一些文本文件的上传/下载。在这里您可以看到我使用的代码: procedure TForm1.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin Application.ProcessMessages; ProgressBar1.Position:= AWorkCount; Label6.Caption:=IntToSt

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

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;
在我的表格中,我还有两个标签:第一个标签表示进度,称为
Label6
,另一个标签的标题类似于“%”,如下所示。标签6的值应在0到100之间


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

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;

可能尝试:ProgressBar1.Position:=一个工作计数;Application.ProcessMessages;我认为ProcessMessages应该遵循ProgressBar的位置设置。因此,您的意思是,我应该使用a:=TIdFTP.Size();,而不是使用WorkCountMax(用于下载过程)?是的,但是在调用Get()之前需要调用Size()。您不能在活动转接期间呼叫它。请记住,并非所有服务器都支持SIZE命令,这也是我提到其他替代方法的原因。