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!!
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!
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.