我的一个朋友向我求助,因为他想要一个表示上传/下载某些文本文件的进度条.在这里你可以看到我使用的代码:
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;
Run Code Online (Sandbox Code Playgroud)
在我的表格上我也有2个标签:第一个表示进展并被调用Label6,另一个只有一个像"%"的标题,如下所示.Label 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;
Run Code Online (Sandbox Code Playgroud)
或者:
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4695 次 |
| 最近记录: |