PDA

Ver la Versión Completa : Barra de progreso?


marlulipe
23-02-2008, 22:14:51
Hola... algunos de los reports que genero tardan un poco bastante de tiempo.... y para evitar que el usuario vuelva a hacer click en el botón y cuelgue todo me gustaría mostrar algo asi como una barra de progreso o una barra de estado que indique que se está generando el reporte.

Alguna sugerencia? Es util la barra de progreso para esto? Cómo hago a calcular el tiempo? Debería colocarla en un form aparte del que uso para que el usuario seleccione los datos y que llama al preview del report?


Muchas gracias por su ayuda!!

dec
23-02-2008, 22:17:31
Hola,

Si de entrada no sabes cómo calcular el progreso de la tarea, yo optaría por utilizar una imagen GIF o un pequeño archivo AVI que mostrase que se está llevando a cabo el reporte. Dicha imagen o vídeo AVI lo mostraría a su vez en un formulario "modal", de forma que, mientras este estuviera visible, el usuario no pudiera salir del mismo, por decirlo así.

Caral
24-02-2008, 01:24:45
Hola
Aparte de lo dicho por el Maestro dec, que ademas no se me hubiera ocurrido (esta genial).:)

Este codigo lo encontre por ahi, crea un progressBar en un dialog.


procedure TForm1.DialogTimer(Sender: TObject);
var
aPB : TProgressBar;
begin
if NOT (Sender is TTimer) then
Exit;
if ((Sender as TTimer).Owner) is TForm then
with ((Sender as TTimer).Owner) as TForm do
begin
aPB := TProgressBar(FindComponent('Progress'));
if aPB.Position >= aPB.Max then
ModalResult := mrCancel
else
aPB.StepIt;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
AMsgDialog : TForm;
AProgressBar : TProgressBar;
ATimer : TTimer;
begin
AMsgDialog := CreateMessageDialog('El Reporte esta por ejecutarse, Espere',
mtWarning, []) ;
AProgressBar := TProgressBar.Create(AMsgDialog) ;
ATimer := TTimer.Create(AMsgDialog) ;
with AMsgDialog do
try
Tag := 15; // aqui determinas los segundos
Caption := 'Reportes';
Height := 100;

with AProgressBar do begin
Name := 'Progress';
Parent := AMsgDialog;
Max := AMsgDialog.Tag;
Step := 1;
Top := 50;
Left := 8;
Width := AMsgDialog.ClientWidth - 16;
end;

with ATimer do begin
Interval := 1000;
OnTimer:=DialogTimer;
end;

case ShowModal of
ID_CANCEL: //
end;
finally
ATimer.OnTimer := nil;
Free;
end;
end;



Ahora solo seria aplicarlo en tu codigo, supongo.:)

Saludos

Edito: no puedo arreglar el codigo con las etiquetas.

marlulipe
24-02-2008, 14:22:51
Muchas gracias por la información! Un par de duditas... No tengo un objeto DialogTimer, estoy usando Delphi 5, viejito... quizas sea por eso :(

Por otro lado... mi codigo es así más o menos:


procedure TFormListadoAlumnoDatos.FormCreate(Sender: TObject);
var FormProgressBar:TForm;
ProgressBar:TProgressBar;
timer:TTimer;
begin
// Aca uso un TIBQuery para obtener unos datos de la BD

// Código que me pasaron
FormProgressBar:=CreateMessageDialog('Espere un momento, por favor.',mtInformation,[mbCancel]);
ProgressBar:=TProgressBar.Create(FormProgressBar);
timer:=TTimer.Create(FormProgressBar);

with(FormProgressBar)do
try
tag:=15;
Caption:='Generando Listado...';
Height:=100;

with ProgressBar do begin
Name:='ProgressBar';
Parent:=FormProgressBar;
Max:=FormProgressBar.Tag;
Step:=1;
Top:=50;
Left:=8;
Width:=FormProgressBar.ClientWidth-16;
end;
with timer do begin
Interval:=1000;
OnTimer:=dialogtimer; // ---> Aca encuentro uno de mis problemas, no tengo un dialog timer :(
end;

case ShowModal of
ID_CANCEL: //
end;

finally
timer.OnTimer:=nil;
Free;
end;

// Mi segunda duda... cuándo haría el Preview? (Reflexiones abajo)
QuickRAlumno.Preview;



Reflexiones: Si lo hago después del dialog va a tardar igual pero sin mostrar la barra de progreso que quiero, si lo hago antes de crear el dialog tarda la creacion del reporte y despues muestra la barra de progreso... o sea tengo que hacerlo en pararlelo... con threads??

Me fui para el lado de los tomates? Quizás estoy totalmente perdida :confused: :eek:

Gracias!

Caral
24-02-2008, 14:31:03
Hola
Revisa el ejemplo, correlo y lo entenderás mejor.
Saludos

marlulipe
26-02-2008, 16:51:55
Muchas gracias Caral, el ejemplo me sirvio mucho para entenderlo. EL problema que se presenta ahora es que la consulta a la BD la puedo hacer antes o despues de mostrar el dialog con el progress bar, y es esa consulta la que consume tiempo. Quisiera que mientras se realiza la consulta se muestre el cartel de espera... sino el tiempo consumido es el tiempo q tarda la consulta mas el tiempo del dialog... no resulta algo real.

Para ese caso tendría que crear un nuevo thread sobre el cual ejecutar o la consulta o el dialog... es decir hacer las cosas en paralelo... o puede haber otra forma?

Gracias por su ayuda!