2013-07-05 2 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; 

을 나는 또한이 개 레이블이 : 첫 번째는 진행을 표시하고 Label6라고하며 다른 하나는 단순히 당신이 아래에 볼 수있는 "%"와 같은 캡션을 가지고 . 레이블 (6)는 0에서 100

enter image description here

에 그가 지금 작은하지만 더 큰 될거야 보내는 텍스트 파일을가는 값이 있어야합니다. 내 문제는 프로그램의 바 진행 (녹색 직사각형)이 보이지 않고 레이블 6의 값이 100을 넘어 700에 도달한다는 것입니다. 어떻게해야합니까?

+0

아마 시도 : ProgressBar1.Position = AWorkCount; Application.ProcessMessages; ProcessMessages가 ProgressBar의 위치 설정을 따라야한다고 생각합니다. – Bill

답변

7

AWorkCountMaxAWorkCount은 백분율이 아니라 바이트 수입니다. 특히 백분율을 표시하려면 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; 
+0

그래서 AWorkCountMax (다운로드 프로세스 용) 대신에 다음과 같이 사용해야합니다 : = TIdFTP.Size(); ? –

+2

예,하지만 Get()을 호출하기 전에 Size()를 호출해야합니다. 활성 전송 중에는 호출 할 수 없습니다. 그리고 모든 서버가 SIZE 명령을 지원하는 것은 아니므로 다른 대체 방법에 대해서도 언급했습니다. –

관련 문제