2011-12-01 52 views
5

Estoy usando Open Source Abbrevia Components para archivar algunos archivos en una sola Zip, mientras esto sucede, estoy usando TAbMeter Gauge para mostrar el progreso.Abreviatura ProgressBar

Preferiría utilizar el TProgressBar para este propósito en su lugar (manteniendo una interfaz estándar con Windows).

¿Cómo puedo usar un TProgressBar en lugar del TAbMeter? Sé que podría codificar el progreso yo mismo, pero dado que los Componentes de Abbrevia ya lo han hecho en el TAbMeter, no veo sentido en reescribirlo.

Si pudiera acceder a la propiedad Posición del TAbMeter podría simular el progreso del TProgressBar sincronizando con el TAbMeter.

Aquí hay un fragmento, nombres de archivos es una TStringList que contiene los nombres de archivo para archivar ..

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; 

Respuesta

5

Usted está presumiblemente ajustando la ArchiveSaveProgressMeter en algún lugar de su código. Simplemente puede dejar de hacer esto y en su lugar establecer el evento OnArchiveSaveProgress. Luego hay que suministrar un evento con esta firma:

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

Se podría responder a la recepción de tal acontecimiento mediante la actualización del valor Position de la barra de progreso en la interfaz de usuario.

El método que surge este evento progreso también se encarga de la versión del contador de avance:

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; 

Así que los diseñadores del componente han proporcionado simplemente dos rutas alternativas para recibir el progreso: el medidor o una devolución de llamada.


el fin de manejar el progreso de una devolución de llamada tiene que escribir un método como este:

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

A continuación, asigne este controlador de eventos a OnArchiveSaveProgress, muy probablemente en el IDE. Es un procedimiento idéntico a la asignación de un evento OnClick a un botón.


Nota: nunca he utilizado Abbrevia así que pude haber elegido un componente diferente de la que usted está utilizando. Sin embargo, todos los componentes que interactúan con los medidores, también ofrecen progreso a través de una devolución de llamada, por lo que este enfoque básico funcionará independientemente del componente que utilice.

+0

Gracias por la información, no estoy seguro de cómo usar o administrar las devoluciones de llamada, así que no estoy seguro de cómo podría implementar un TProgressBar aquí en base a la información que proporcionó. –

+0

OK, lo he actualizado para intentar ayudarte. Piense en la devolución de llamada de progreso de la misma manera que usted piensa en un controlador de eventos 'OnClick'. –

+0

Eso es genial, funciona perfecto gracias David, aprendí algo nuevo :) –

1

En caso de que ayude a alguien más, he creado un nuevo componente TAbProgressBar que se puede usar en lugar de TAbMeter. Ambos implementan la misma interfaz, por lo que funciona con las mismas propiedades Archive*ProgressMeter. Simplemente actualice Abbrevia desde Subversion y vuelva a compilar los paquetes AbbreviaVCL y AbbreviaVCLDesign.

+0

+1 esto también podría ser útil –