2013-07-05 59 views
3

我的一位朋友向我求助,因爲他想要一個指示上傳/下載某些文本文件的進度條。在這裏你可以看到我使用的代碼:Indy FTP無法正確加載進度條

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.我該怎麼做?

+0

也許嘗試:ProgressBar1.Position:= AWorkCount; Application.ProcessMessages;我認爲ProcessMessages應該遵循設置ProgressBar的位置。 – Bill

回答

7

AWorkCountMaxAWorkCount是字節計數,而不是百分比。更新用戶界面時需要考慮這一點,特別是如果要顯示百分比。

隨着中說,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; 
+0

所以你的意思是,而不是使用AWorkCountMax(下載過程),我應該使用像一個:= TIdFTP.Size(); ? –

+2

是的,但您需要在調用Get()之前調用Size()。您無法在激活的傳輸過程中調用它。並且請記住,並非所有的服務器都支持SIZE命令,這也是我提到其他替代方法的原因。 –