2011-12-01 24 views
5

Bazı Dosyaları Tek bir Zip'e Arşivlemek için Açık Kaynak Abbrevia Bileşenlerini kullanıyorum, bu sırada ilerlemeyi görüntülemek için TAbMeter Göstergesini kullanıyorum.Abbrevia ProgressBar

Bu amaçla TProgressBar'ı kullanmayı tercih ederim (Windows ile standart bir arabirimin korunması).

TABMeter yerine TProgressBar'ı nasıl kullanabilirim? Biliyorum ki ilerlemeyi kendim kodlayabilirim, ancak Abbrevia Components'ın bu işi TAbMeter'de yaptığını gördüğümde, onu yeniden yazmanın bir anlamı yok.

TAbMeter öğesinin Konum özelliğine erişebilseydim, TProgressBar'ın ilerlemesini TAbMeter ile senkronize olarak simüle edebilirim. İşte

pasajıdır, FileNames dosya adları arşivlemek içeren bir 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; 

cevap

5

Sen muhtemelen kodunuzda bir yere ArchiveSaveProgressMeter ayarlıyorsunuz olduğunu. Bunu yapmayı bırakabilirsiniz ve bunun yerine OnArchiveSaveProgress olayını ayarlayabilirsiniz. O zaman bu imza ile bir etkinlik sağlamanız gerekmektedir: Eğer kullanıcı arayüzünde ilerleme çubuğunun Position değerinin güncellenmesi ile böyle bir olay alınmasından yanıt vereceğini

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

.

bu ilerleme olayı da ilerleme metre versiyonunu kolları yüzeyleri yöntemi: Yani bileşenin tasarımcılar sadece ilerlemeyi aldıktan iki alternatif güzergahlar sağladık

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; 

: metre veya geri çağırma. Bir geri arama gelen ilerleme çözmek amacıyla


Böyle bir yöntem yazmak gerekir:

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

Daha sonra ıde büyük olasılıkla, OnArchiveSaveProgress bu olay işleyicisi atamak. Bir düğmeye OnClick olayı atamak için aynı prosedürdür.


Not: Ben bu yüzden kullandığınız farklı bir bileşeni dışarı almış olabilir Abbrevia hiç kullanmadıysanız. Bununla birlikte, sayaçlarla etkileşime giren tüm bileşenler, ayrıca, hangi temel bileşeni kullandığınıza bakılmaksızın, bu temel yaklaşımın çalışabilmesi için bir geri çağırma yoluyla ilerleme sağlar.

+0

Bilgiler için, geri bildirimleri nasıl kullanacağınız veya yöneteceğinizden emin değilim, bu nedenle sağladığınız bilgilere dayanarak bir TProgressBar'ı nasıl uygulayacağımı bilmiyorum. –

+0

Tamam, size yardımcı olmaya çalışıyorum. İlerleme geri bildirimini, bir “OnClick” olay işleyicisini düşündüğünüz şekilde düşünün. –

+0

Thats harika, mükemmel çalışıyor teşekkürler David, yeni bir şey öğrendim :) –

1

Başkalarına yardımcı olması durumunda, TAbMeter yerine kullanılabilecek yeni bir TAbProgressBar bileşeni oluşturdum. Her ikisi de aynı arabirimi uygular, bu nedenle aynı Archive*ProgressMeter özellikleriyle çalışır. Sadece Subversion'dan Abbrevia'yı güncelleyin ve AbbreviaVCL ve AbbreviaVCLDesign paketlerini yeniden derleyin.

+0

+1 bu da yararlı olabilir –

İlgili konular