Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Barra de progreso? (https://www.clubdelphi.com/foros/showthread.php?t=53559)

marlulipe 23-02-2008 22:14:51

Barra de progreso?
 
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.

Código Delphi [-]
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:

Código Delphi [-]
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!


La franja horaria es GMT +2. Ahora son las 21:34:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi