用 IdFTP 下载FTP服务器上的文件时如何显示进度条?(100分)

  • 主题发起人 tom12345
  • 开始时间
T

tom12345

Unregistered / Unconfirmed
GUEST, unregistred user!
用 IdFTP 下载FTP服务器上的文件时如何显示进度条
 
根据文件大小和已收到的字节哎
 
如何得到已收到的字节呀
 
procedure TMainForm.IdFTP1Work(Sender: TObject;
AWorkMode: TWorkMode;

const AWorkCount: Integer);

Var
S: String;

TotalTime: TDateTime;

H, M, Sec, MS: Word;

DLTime: do
uble;

begin

TotalTime := Now - STime;

DecodeTime(TotalTime, H, M, Sec, MS);

Sec := Sec + M * 60 + H * 3600;

DLTime := Sec + MS / 1000;

if DLTime > 0 then

AverageSpeed := (AWorkCount / 1024) / DLTime;

if AverageSpeed > 0 then
begin

Sec := Trunc(((ProgressBar1.Max - AWorkCount) / 1024) / AverageSpeed);

S := Format('%2d:%2d:%2d', [Sec div 3600, (Sec div 60) mod 60, Sec mod 60]);

S := '剩余时间: ' + S;

end
else
S := '';

S := FormatFloat('0.00 KB/s', AverageSpeed) + ';
' + S;

case AWorkMode of
wmRead: StatusBar1.Panels[1].Text := '下载速度:' + S;

wmWrite: StatusBar1.Panels[1].Text := '上传速度:' + S;

end;

if AbortTransfer then

IdFTP1.Abort;

ProgressBar1.Position := AWorkCount;

AbortTransfer := false;

end;

/////////////关键代码如上
 
编译错误: [Error] Update.pas(264): Undeclared identifier: 'STime'
 
人家给你贴的是一段代码,STime应该是TDateTime型公有变量
自己研究研究吧,呵呵,知道原理不就知道怎么做了吗?
 
还是不明白,哪位大侠再给讲讲?
 
唉,我来为你说些我的理解,供你参考(未必准确)
你的程序界面上肯定要有一个IdFTP1和若干个按钮吧?别的我不知道,但肯定要有一个“下载”按钮吧,你定义一个全局的TDateTime型变量STime,在“下载”按钮的代码中先来一句:STime := Now;然后在IdFTP1的OnWork事件中加入jamily大侠的代码,如果一切正常的话,你看看结果是不是你想要的,如果你还搞不懂或搞不定,就给我500分,我一定帮你搞定,哈哈...
 
szhcracker,好象jamily大侠显示的是速度,我要求的是进度。我不知道如何得到已下载文件的字节。
 
给你一段代码参考:
...
dwBytesRead := 0;
BufSize := 1024;
while (BufSize > 0)do
begin
if not InternetReadFile(hFile, @Buffer, READ_BUFFERSIZE, BufSize) then
Break;
if (BufSize > 0) and (BufSize <= READ_BUFFERSIZE) then
BlockWrite(LocalFile, Buffer, BufSize);
dwBytesRead := dwBytesRead + BufSize;
//已下载文件的字节
end;
...
 
szhcracker,编译出错:
if not InternetReadFile(hFile, @Buffer, READ_BUFFERSIZE, BufSize) then
Break;
[Error] Update.pas(276): '(' expected but ',' found
 
实在是无语问苍天,这样吧,你另开个500分的大贴,把分加来,我给你发个好东东吧,哈哈
 
顶部