Ir al contenido


Foto

[RESUELTO] ¿Cómo hacer una barra de progreso sin fin?


  • Por favor identifícate para responder
14 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 19 julio 2009 - 04:48

Pues eso, ¿alguien conoce algún code para crear una barra de progreso sin fin similar al de ChackAll en su code _Busy.pas?, intenté separar esa parte pero no lo logré demasiado avanzado para mí :$, pues sí, crear una barra de progreso que pueda asignar su altura y anchura, color, etc, etc.

Saludos.
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 19 julio 2009 - 07:27

Ensaya con esto


delphi
  1. const
  2.   {$EXTERNALSYM PBS_MARQUEE}
  3.   PBS_MARQUEE = 08;
  4.  
  5. procedure TForm1.Button1Click(Sender: TObject);
  6. var
  7.   i: Integer;
  8. begin
  9.   for i := 0 to 100 do
  10.   begin
  11.     ProgressBar1.Position := 0;
  12.     Sleep(50);
  13.     Application.ProcessMessages;
  14.   end;
  15. end;
  16.  
  17. procedure TForm1.FormCreate(Sender: TObject);
  18. begin
  19.     SetWindowLong(ProgressBar1.Handle, GWL_STYLE,
  20.     GetWindowLong(ProgressBar1.Handle, GWL_STYLE) or PBS_MARQUEE);
  21. end;




  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 19 julio 2009 - 07:35

Gracias Wilson, lo acabo de probar pero no hace nada :(:



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ComCtrls, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     ProgressBar1: TProgressBar;
  13.     procedure FormCreate(Sender: TObject);
  14.     procedure Button1Click(Sender: TObject);
  15.   private
  16.     { Private declarations }
  17.   public
  18.     { Public declarations }
  19.   end;
  20.  
  21. var
  22.   Form1: TForm1;
  23.  
  24. const
  25.   {$EXTERNALSYM PBS_MARQUEE}
  26.   PBS_MARQUEE = 08;
  27.  
  28. implementation
  29.  
  30. {$R *.dfm}
  31.  
  32. procedure TForm1.FormCreate(Sender: TObject);
  33. begin
  34.   SetWindowLong(ProgressBar1.Handle, GWL_STYLE,
  35.   GetWindowLong(ProgressBar1.Handle, GWL_STYLE) or PBS_MARQUEE);
  36. end;
  37.  
  38. procedure TForm1.Button1Click(Sender: TObject);
  39. var
  40.   i: Integer;
  41. begin
  42.   for i := 0 to 100 do
  43.   begin
  44.     ProgressBar1.Position := 0;
  45.     Sleep(50);
  46.     Application.ProcessMessages;
  47.   end;
  48. end;
  49.  
  50. end.


  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 julio 2009 - 07:46

Te adjunto los comentarios del autor:


delphi
  1. Author: ceh
  2.  
  3. {
  4.   Since Comctl32.dll version 6, which is distributed with Windows XP, the
  5.   ProgressBar Control got a new Style: PBS_MARQUEE.
  6.   This style lets you display a ProgressBar which moves like a marquee. This
  7.   means only a part of the small boxes inside move (around five of them) and
  8.   they are not attached to the left side of the control. This is particularly
  9.   useful if you need an indeterminate ProgressBar.
  10.  
  11.   To use the new Comctl32.dll you'll have to add a Manifest to your project.
  12.   In Delphi 7 simply drop an XPManifest on the Form, for earlier Versions of
  13.   Delphi take a look at http://www.swissdelphicenter.ch/de/showcode.php?id=1118
  14.  
  15.   The ProgressBar.Position can then not be set to a particular value anymore.
  16.   Any arbitrary value will increase the Position by 1, regardless of the values
  17.   in step, max or min. By reaching the right end of the ProgressBar visualisation
  18.   begins again at Position 0.
  19. }


  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 julio 2009 - 07:51

Amigo a continuación te pongo otra para ojearla, se trata de un TProgressBar sin frame



delphi
  1. {
  2. Delphi's ProgressBar always have a frame. If you wish to place it on a StatusBar
  3. it looks not beautifully. You can do small change in the component and you'll
  4. get the new one without a frame.
  5. }
  6.  
  7. unit NewProgress;
  8.  
  9. // By Vladimir S. <shvetadvipa@mtu-net.ru>
  10.  
  11. interface
  12.  
  13. uses
  14.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  15.   Dialogs, ComCtrls;
  16.  
  17. type
  18.   TNProgressBar = class(TProgressBar)
  19.     procedure WMNCPAINT(var Msg: TMessage); message WM_NCPAINT;
  20.   private
  21.     FShowFrame: boolean;
  22.     procedure SetShowFrame(Value: boolean);
  23.   public
  24.     constructor Create(AOwner: TComponent); override;
  25.   published
  26.     property ShowFrame: boolean read FShowFrame write SetShowFrame;
  27.   end;
  28.  
  29. procedure Register;
  30.  
  31. implementation
  32.  
  33. { TNProgressBar  }
  34.  
  35. constructor TNProgressBar.Create(AOwner: TComponent);
  36. begin
  37.   inherited;
  38.   FShowFrame := True;
  39. end;
  40.  
  41. procedure TNProgressBar.SetShowFrame(Value: boolean);
  42. begin
  43.   if FShowFrame <> Value then begin
  44.     FShowFrame:= Value;
  45.     RecreateWnd;
  46.   end;
  47. end;
  48.  
  49. procedure TNProgressBar.WMNCPAINT(var Msg: TMessage);
  50. var
  51.   DC: HDC;
  52.   RC: TRect;
  53. begin
  54.   if ShowFrame then begin
  55.     inherited;
  56.     Invalidate;
  57.   end else begin
  58.     DC := GetWindowDC(Handle);
  59.     try
  60.       Windows.GetClientRect(Handle, RC);
  61.       with RC do begin
  62.         Inc(Right, 2);
  63.         Inc(Bottom, 2);
  64.       end;
  65.       Windows.FillRect(DC, RC, Brush.Handle);
  66.     finally
  67.       ReleaseDC(Handle, DC);
  68.     end;
  69.   end;
  70. end;
  71.  
  72. procedure Register;
  73. begin
  74.   RegisterComponents('Controls', [TNProgressBar]);
  75. end;
  76.  
  77. end.


  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 julio 2009 - 07:55

Amigo, una simple para cambiar el color.


delphi
  1. uses commctrl;
  2.  
  3. procedure TForm1.Button1Click(Sender: TObject);
  4. begin
  5.   //Cambia el color a amarillo
  6.   SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, clYellow);
  7. end;


  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 20 julio 2009 - 11:46

Hola Wilson, he probado todos los codes y componente que me facilitaste y todos son un ProgressBar normal, pensé que el constructor PBS_MARQUEE daba un efecto marquesina y pues no es así­ no hace nada :(, ando buscando un ProgressBar que se mueva que cuando llegue a la derecha se regrese a la izquierda y así­ sucesivamente sin fin.

Saludos.
  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 julio 2009 - 01:51

Eso lo logras con un timer para el siguiente ejemplo un TProgressBar de nombre pb :



delphi
  1. procedure TForm1.Timer1Timer(Sender: TObject);
  2. // Asigna min:= 0 y max:= 10 al progrssbar y 100 al interval del Timer para probar
  3. begin
  4. if pb.Position < pb.Max then
  5. pb.Position := pb.Position +1
  6. else
  7. pb.Position := pb.Min;
  8. end;


  • 0

#9 cannabis

cannabis

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 257 mensajes
  • LocationMéxico

Escrito 25 octubre 2009 - 12:40

Esto te puede servir.


Salud.

  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 25 octubre 2009 - 09:31

Gracias cannabis, ya lo pruebo.

Saludos.
  • 0

#11 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 25 octubre 2009 - 01:10

Mírate este ejemplo simple de modificación de una barra de progreso normal a Marquee:
 

delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, ComCtrls, ExtCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     ProgressBar1: TProgressBar;
  12.     Button1: TButton;
  13.     Button2: TButton;
  14.     procedure FormCreate(Sender: TObject);
  15.     procedure Button1Click(Sender: TObject);
  16.     procedure Button2Click(Sender: TObject);
  17.   private
  18.     { Private declarations }
  19.   public
  20.     { Public declarations }
  21.   end;
  22.  
  23. var
  24.   Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. const PBM_SETMARQUEE = WM_USER + 10;
  31.  
  32. procedure TForm1.FormCreate(Sender: TObject);
  33. begin
  34.   SetWindowLong(ProgressBar1.Handle, GWL_STYLE, GetWindowLong(ProgressBar1.Handle, GWL_STYLE) or PBM_SETMARQUEE);
  35. end;
  36.  
  37. procedure TForm1.Button1Click(Sender: TObject);
  38. begin
  39.   ProgressBar1.tag:= 1;
  40.   while ProgressBar1.tag = 1 do
  41.   begin
  42.     Application.ProcessMessages;
  43.     ProgressBar1.Position:= ProgressBar1.Position+1;
  44.     if ProgressBar1.Position >= ProgressBar1.Max then
  45.       ProgressBar1.Position:= 0;
  46.     Sleep(100);
  47.   end;
  48. end;
  49.  
  50. procedure TForm1.Button2Click(Sender: TObject);
  51. begin
  52.   ProgressBar1.tag:= 0;
  53. end;
  54.  
  55. end.

Te subo el ejemplo con fuente y compilado.

Edito para resubir archivo corrupto.

Archivos adjuntos


  • 0

#12 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 27 octubre 2009 - 06:36

Si el anterior código te servía para diseñar tu movimiento a delante o hacia atrás o de vaivén, este otro, optimizado sólo se mueve hacia delante.
 


delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, ComCtrls, ExtCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     ProgressBar1: TProgressBar;
  12.     Strat: TButton;
  13.     Stop: TButton;
  14.     procedure FormCreate(Sender: TObject);
  15.     procedure StratClick(Sender: TObject);
  16.     procedure StopClick(Sender: TObject);
  17.   private
  18.     { Private declarations }
  19.   public
  20.     { Public declarations }
  21.   end;
  22.  
  23. var
  24.   Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. const PBM_SETMARQUEE = WM_USER + 10;
  31.  
  32. procedure TForm1.FormCreate(Sender: TObject);
  33. begin
  34.   SetWindowLong(ProgressBar1.Handle, GWL_STYLE, GetWindowLong(ProgressBar1.Handle, GWL_STYLE) or PBM_SETMARQUEE);
  35. end;
  36.  
  37. procedure TForm1.StratClick(Sender: TObject);
  38. begin
  39.     SendMessage (ProgressBar1.Handle, PBM_SETMARQUEE, 1, 100);  // Activa 100ms
  40. end;
  41.  
  42. procedure TForm1.StopClick(Sender: TObject);
  43. begin
  44.     SendMessage (ProgressBar1.Handle, PBM_SETMARQUEE, 0, 100);  // Desactiva
  45. end;
  46.  
  47. end.

Saludos.


Edito para resubir archivo corrupto.

Archivos adjuntos


  • 0

#13 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderador
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 27 octubre 2009 - 07:17

Hola Wilson, he probado todos los codes y componente que me facilitaste y todos son un ProgressBar normal, pensé que el constructor PBS_MARQUEE daba un efecto marquesina y pues no es así no hace nada :(, ando buscando un ProgressBar que se mueva que cuando llegue a la derecha se regrese a la izquierda y así sucesivamente sin fin.

Saludos.


¿Colocaste el componente XPManifest en tu proyecto?
  • 0

#14 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 28 octubre 2009 - 01:29

¿Colocaste el componente XPManifest en tu proyecto?


Exactamente, en los ejemplos que subo, ambos enlazan el XPManifest, si no o la barra es normal o no se mueve.

Saludos.
  • 0

#15 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 28 octubre 2009 - 07:10

Ah Vaya, como nadie me especificó lo del XPManifiest, ahora todos me funcionan :p, y ahora que leo mejor lo que posteó Wilson en el post #3, sí mencionan el XPManifiest, no recuerdo por qué no lo hice :s, bueno ahora sí funcionan todos :D, me quedé con el último de escafandra, gracias amigos (y).

Saludos.
  • 0