gpt4 book ai didi

delphi - Indy FTP 无法正确加载进度条

转载 作者:行者123 更新时间:2023-12-03 15:22:10 26 4
gpt4 key购买 nike

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

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 之间。

enter image description here

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

最佳答案

AWorkCountMaxAWorkCount 是字节计数,而不是百分比。更新用户界面时需要考虑到这一点,特别是当您想显示百分比时。

话虽如此,AWorkCountMax 仅在上传时有效,而在下载时无效。原因是FTP协议(protocol)在传输时并不传递文件大小,所以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;

关于delphi - Indy FTP 无法正确加载进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17498198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com