2011-12-01 2 views
5

일부 파일을 하나의 Zip으로 압축하기 위해 Open Source Abbrevia 구성 요소를 사용하고 있는데, 진행 상황을 표시하기 위해 TAbMeter Gauge를 사용하고 있습니다.Abbrevia ProgressBar

대신 (Windows와 표준 인터페이스를 유지하면서)이 목적으로 TProgressBar를 사용하는 것을 선호합니다.

어떻게 TAbMeter 대신 TProgressBar를 사용할 수 있습니까? 진행 상황을 직접 코딩 할 수는 있지만 Abbrevia 구성 요소가 TAbMeter에서 이미 수행 된 것을 볼 때, 다시 작성하는 데에는 아무런 의미가 없습니다.

TAbMeter의 Position 속성에 액세스 할 수 있다면 TAbMeter와 동기화하여 TProgressBar의 진행 상황을 시뮬레이션 할 수 있습니다. 여기

는 조각이다, 파일 이름은 파일 이름은 아카이브가 포함 된 TStringList를 ..

procedure ArchiveFiles(SaveAs: string; ProgressBar: TAbMeter); 
var 
    AZipper: TAbZipper; 
    i: Integer; 
begin 
    AZipper := TAbZipper.Create(nil); 
    try 
    AZipper.AutoSave := False; 
    AZipper.BaseDirectory := ExtractFilePath(SaveAs); 
    AZipper.ArchiveSaveProgressMeter := ProgressBar; 
    AZipper.FileName := SaveAs; 
    AZipper.StoreOptions := AZipper.StoreOptions + [soStripDrive, soRemoveDots] 
               - [soStripPath]; 
    AZipper.TempDirectory := GetTempDirectory; 

    try 
     Screen.Cursor := crHourGlass; 
     ProgressBar.Visible := True; 

     for i := 0 to FileList.Count - 1 do 
     begin 
     AZipper.AddFiles(FileList.Strings[i], 0); 
     end; 

    finally 
     AZipper.Save; 
     AZipper.CloseArchive; 

     ProgressBar.Visible := False; 
     Screen.Cursor := crDefault; 
    end; 

    finally 
    AZipper.Free; 
    end; 
end; 

답변

5

당신은 아마도 코드에서 어딘가에 ArchiveSaveProgressMeter을 설정하는 것이다. 단순히이 작업을 중단하고 대신 OnArchiveSaveProgress 이벤트를 설정할 수 있습니다. 그런 다음이 서명과 이벤트를 제공해야합니다 : 당신은 당신의 UI에서 진행 표시 줄의 Position 값을 업데이트하여 이러한 이벤트를 수신에 응답 할

procedure(Sender: TObject; Progress: Byte; var Abort: Boolean) of object; 

.

이 진행 이벤트도 진행 m 버전을 처리면에있어서, 그래서 컴퍼넌트의 설계자는 단순히 진행을 수신 한 두 대체 경로를 제공하고

procedure TAbCustomZipper.DoArchiveSaveProgress(
    Sender: TObject; Progress: Byte; var Abort : Boolean); 
begin 
    Abort := False; 
    if Assigned(FArchiveSaveProgressMeter) then 
    FArchiveSaveProgressMeter.DoProgress(Progress); 
    if Assigned(FOnArchiveSaveProgress) then 
    FOnArchiveSaveProgress(Self, Progress, Abort); 
end; 

: 미터 또는 콜백. 콜백에서 진행 상황을 처리하기 위해


는이 같은 방법을 쓸 필요가 :

procedure TMyMainForm.OnArchiveSaveProgress(
    Sender: TObject; Progress: Byte; var Abort: Boolean); 
begin 
    FProgressBar.Position := Progress; 
end; 

당신은 다음 IDE에서 가장 가능성, OnArchiveSaveProgress이 이벤트 핸들러를 할당합니다. 버튼에 OnClick 이벤트를 할당하는 것과 동일한 절차입니다.


참고 : 나는 그래서 당신이 사용하고있는 하나에서 다른 구성 요소를 골라 수도 Abbrevia을 사용한 적이. 그러나 미터와 상호 작용하는 모든 구성 요소는 콜백을 통해 진행 상황을 제공하므로 사용하는 구성 요소에 관계없이이 기본 접근 방식이 작동합니다.

+0

정보를 제공해 주셔서 감사합니다. 콜백을 사용하거나 관리하는 방법을 모르므로 제공된 정보를 기반으로 여기 TProgressBar를 구현하는 방법을 모르겠습니다. –

+0

그래, 내가 당신을 도우려고 갱신했습니다. 버튼 OnClick 이벤트 핸들러와 같은 방식으로 진행 콜백을 생각해보십시오. –

+0

그게 전부 좋고, 완벽하게 작동합니다. David, 나는 새로운 것을 배웠습니다. :) –

1

다른 사람들에게 도움이 될 경우 TAbMeter 대신 사용할 수있는 새로운 TAbProgressBar 구성 요소를 만들었습니다. 둘 다 동일한 인터페이스를 구현하므로 동일한 Archive*ProgressMeter 속성으로 작동합니다. Subversion에서 Abbrevia를 업데이트하고 AbbreviaVCL 및 AbbreviaVCLDesign 패키지를 다시 컴파일하십시오.

+0

+1 유용한 정보 일 수도 있습니다. –