2011-12-01 24 views
5

私はOpen Source Abbreviaコンポーネントを使用していくつかのファイルを1つのZipにアーカイブしていますが、この間TAbMeter Gaugeを使用して進捗状況を表示しています。Abbrevia ProgressBar

代わりにこの目的のためにTProgressBarを使用することをお勧めします(Windowsとの標準インターフェースを維持)。

TAbMeterの代わりにTProgressBarを使用するにはどうすればよいですか?私は自分自身で進歩をコード化することができますが、Abbreviaコンポーネントが既にTAbMeterでこれを行っているのを見て、私はそれを書き直す意味がありません。

TAbMeterのPositionプロパティにアクセスすることができたとしても、私はTAbMeterと同期してTProgressBarの進捗状況をシミュレートできました。ここで

スニペットで、ファイル名はあなたがおそらくあなたのコード内でArchiveSaveProgressMeterどこかを設定している。..

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

アーカイブするファイル名を含むTStringListのです。単にこれをやめ、代わりにOnArchiveSaveProgressイベントを設定することができます。その後、この署名を使用してイベントを供給する必要があります:あなたは、あなたのUIにプログレスバーのPosition値を更新することにより、このようなイベントの受信に応答する

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

このプログレスイベントも進行メータバージョンを処理表面方法ように、コンポーネントの設計者は単に進歩を受け取るへの2つの代替ルートを提供してきた

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

OK、私はあなたを助けようと更新しました。ボタンの 'OnClick'イベントハンドラと同じように、進行状況のコールバックを考えてみてください。 –

+0

すごくいいです、完璧に感謝David、私は何か新しいことを学んだ:) –

1

他の人に役立つ場合は、TAbMeterの代わりに使用できる新しいTAbProgressBarコンポーネントを作成しました。両方とも同じインターフェイスを実装しているので、同じArchive*ProgressMeterのプロパティで動作します。 SubversionからAbbreviaを更新し、AbbreviaVCLとAbbreviaVCLDesignパッケージを再コンパイルしてください。

+0

+1これも便利かもしれません –