Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Ejemplo De Barra De Progreso Con Timer
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Ejemplo De Barra De Progreso Con Timer 
 
Hola!

Estaba realizando un ejemplo con archivos y de este me  ha llevado a crear otro ejemplo con una barra de progreso.

En este caso conocemos el número de elementos que se van a añadir a una lista y que se representara
visualmente en el incremento de  la barra de progreso.

 ejemplobarraprogreso

Su código:
Private incrementos As Float
Private caracteres As String  
Const elementos As Integer = 100 ' El número de palabras o elementos que queremos generar

Public Sub _new()
  
End

Public Sub Form_Open()

  Me.Center
  Me.Title = "Ejemplo con barra de progreso"
  Randomize
  incrementos = 1 / elementos  ' El máximo valor de la barra es 1. Asi que dividimos 1 entre el número de elementos que vamos a generar

End

Public Sub btnSalir_Click()

  Me.Close

End

Public Sub btnGenera_Click()
  
  lstValores.Clear            'Limpiamos los valores de la lista
  btnGenera.Enabled = False   'Desactivamos el botón para que no se pueda usar hasta terminar el evento Timer
  Timer1.Delay = 100          'Ajustamos el valor del timer1,por defecto es 1000 que es 1 segundo (algo lento)
  Timer1.Start                'Arrancamos el Timer
  
End

Public Sub Timer1_Timer()

  Dim x As Integer      
  
  ProgressBar1.Value += incrementos    'Se incrementara progresivamante con un valor fijo (incremento) hasta llegar a 1
  
  'Formarenos tantas palabras como nos diga la constante elementos
  'Añade a caracteres dos letras
  For x = 1 To 2
    caracteres &= Chr(Int(Rnd(Asc("A"), Asc("Z"))))
  Next
  'Añade a caracteres tres números
  For x = 1 To 3
    caracteres &= Str(Int(Rnd(1, 10)))
  Next
  'Añade a caracteres dos letras
  For x = 1 To 2
    caracteres &= Chr(Int(Rnd(Asc("A"), Asc("Z"))))
  Next
  lstValores.Add(caracteres)      ' Añadimos a la lista el contenido de caracteres
  caracteres = ""                 ' Limpiamos caracteres
  
  If ProgressBar1.Value = 1 Then  ' Si llega la barra a su máximo valor
    ProgressBar1.Value = 0        ' Restauramos el valor de la barra a 0
    btnGenera.Enabled = True      ' Activamos el botón
    Timer1.Stop                   ' Paramos el timer1
  Endif
    
End

 


Pregunta. ¿ Es de alguna manera el control ProgressBar un elemento decorativo ?.
A ver, si tu "no conoces" el número de elementos. Tendría que haber un proceso antes, que averiguase cuantos son los elementos
para usarlo como divisor. 1 / nelementos

Entonces.Si tu de alguna  manera vas incrementando el  divisor, puede que una vez que se ha terminado el proceso,
simplemente se represente de una manera "decorativa" el progreso de algo que ya se había hecho.

En este ejemplo en cambio es algo que esta sucediendo en el momento, si tu desconoces algo, no lo puedes a lo mejor representar
a la vez que esta ocurriendo el proceso, por eso digo lo de decorativo.

Saludos.

EjemploConBarraProgreso.tar.gz
Descripción:  
Descargar
Nombre del archivo: EjemploConBarraProgreso.tar.gz
Tamaño: 6.36 KB
Descargado: 41 veces
EjemploConBarraProgreso.tar.gz
Descripción:  
Descargar
Nombre del archivo: EjemploConBarraProgreso.tar.gz
Tamaño: 6.36 KB
Descargado: 41 veces
EjemploConBarraProgreso.tar.gz
Descripción:  
Descargar
Nombre del archivo: EjemploConBarraProgreso.tar.gz
Tamaño: 6.36 KB
Descargado: 41 veces

 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Miercoles, 13 Marzo 2013, 12:58; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejemplo De Barra De Progreso Con Timer 
 
Con respecto a que es decorativo.

Imaginar este caso. Voy a mostrar en la lista, un grupo de archivos que existen en un directorio.
A medida que los va añadiendo a la lista, el divisor aumenta.

¿ Que ocurre ?. Con un bucle antes he averiguado cuantos archivos hay, los he pasado a un array.
Y luego los muestro en la lista y aumento el valor de la barra de progreso.

Por un lado, tengo el proceso que cuenta los archivos y luego en el timer
los muestro y aumento el valor de la barra de progreso.

Entonces, no es algo, que esta ocurriendo.Se ha calculado el numero de archivos y se ha usado como divisor.

Public Sub btnGenera_Click()
  Dim unarchivo As String  
  
  Timer1.Delay = 50          
        
   For Each unarchivo In Dir(User.Home &/ "Emulacion/Spectrum/Hobbcinta", "*", gb.File).Sort()  
        aarchivos.Add(unarchivo)
        numeroarchivos += 1                    
   Next
   incrementos = 1 / numeroarchivos    
   Timer1.Start    
End

Public Sub Timer1_Timer()
    
  ProgressBar1.Value += incrementos
  lstValores.Add(aarchivos[x])    
  
  If ProgressBar1.Value = 1 Then  ' Si llega la barra a su máximo valor
    ProgressBar1.Value = 0        ' Restauramos el valor de la barra a 0
    btnGenera.Enabled = True      ' Activamos el botón
    Timer1.Stop                   ' Paramos el timer1
  Endif
  If x < aarchivos.Max Then x += 1
  
End

 


Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Miercoles, 13 Marzo 2013, 13:45; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejemplo De Barra De Progreso Con Timer 
 
"decorativo"

Puedes usar una imagen .gif (animación)

http://k09.kn3.net/135B7B562.gif
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
última edición por jsbsan el Miercoles, 13 Marzo 2013, 14:15; editado 1 vez 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejemplo De Barra De Progreso Con Timer 
 
También puedes actualizar el número de elementos en cada tick del timer, mediante alguna rutina que se ejecute dentro del evento timer. No hay otra forma o al menos a mi no se me ocurre...

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejemplo De Barra De Progreso Con Timer 
 
Citar:

Pregunta. ¿ Es de alguna manera el control ProgressBar un elemento decorativo ?.
A ver, si tu "no conoces" el número de elementos. Tendría que haber un proceso antes, que averiguase cuantos son los elementos
para usarlo como divisor. 1 / nelementos

Pues sí, y no. No es algo que aporte nada a nuestro proceso, lo que lo hace decorativo, pero es algo que satisface al usuario que espera, lo que lo hace conveniente. De todas formas y, hablando de bases de datos, que es lo mío, no es necesario tener un proceso antes. Hay muchas rutinas sobre registros, por ejemplo o arrays, que ese primer proceso es consustancial al hecho, quiero decir que en ambos tengo la propiedad .count, que me es dada sin proceso previo más que el de recuperar los datos, claro. Y un progressbar sobre el proceso ni viene mal ni estorba.

Por otra parte... la pregunta es algo baladí (llevaba tiempo queriendo soltar el palabro, que me encanta, jejeje):
No se puede construir un itinerario si no se conoce el destino. Así como cualquier bucle en sí mismo lleva ya la meta. Por ejemplo:
For Each unarchivo In Dir(User.Home &/ "Emulacion/Spectrum/Hobbcinta", "*", gb.File).Sort()

La función Dir ya ha tenido que hacer ese proceso de recuperación y de almacenamiento de la meta, ergo ya hemos recorrido una vez el bucle (por decirlo así), y lo que hagamos nosotros siempre será una segunda vez.

Personalmente, y en principio, discrepo del uso de un timer con progressbar, me parece un fraude al usuario. Si estás haciendo un bucle de lo que sea, actualiza el progress en cada iteracción, el avance de la barra puede ser irregular... pero "honrado".
Saludos
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejemplo De Barra De Progreso Con Timer 
 
[quote user="shordi" post="16807"]
Citar:

Personalmente, y en principio, discrepo del uso de un timer con progressbar, me parece un fraude al usuario. Si estás haciendo un bucle de lo que sea, actualiza el progress en cada iteracción, el avance de la barra puede ser irregular... pero "honrado".
Saludos

 De acuerdo con Shordi, debería irse actualizando en cada iteración y no por "tiempo". Yo la he usado más una vez con timer, pero justamente para mostrar cúanto tiempo queda para terminar algo (tiempo restante de juego, por ejemplo). También podrías usar un label e ir variando su propiedad text:
Van 12 archivos de 100 , van 13,van 14....hasta llegar al total.
Saludos  
 




===================
Migrando desde visual basic, el Gambas de Ms
Mi blog gambero
 
Dani26 - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejemplo De Barra De Progreso Con Timer 
 
jguardon escribió: [Ver mensaje]
También puedes actualizar el número de elementos en cada tick del timer, mediante alguna rutina que se ejecute dentro del evento timer. No hay otra forma o al menos a mi no se me ocurre...


Cuando dije eso, al referirme el timer, por supuesto estaba pensando en cada iteración de un proceso, aunque me dejé llevar por el ejemplo que puso shell.

De hecho, así lo tengo hecho en una aplicación que importa registros de texto plano a una base de datos:

pb.Value = n_char / file_l


Donde pb.Value es el valor de la progressbar, n_char es un integer que acumula el número de caracteres leídos en cada iteración y file_l es la longitud del fichero en caracteres (~bytes), a partir de un Stat(fichero).size

La verdad es que para ese caso concreto funciona muy bien.

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejemplo De Barra De Progreso Con Timer 
 
Hola a todos.

Julio

Decorativo, en parte lo dije por que es algo visual que el usuario ve, pero que no tiene por que ser algo necesario para
la aplicación.En el caso de conteo y muestra de los archivos, hace algo mas que un barra que muestra un porcentaje
si mas. Pudiese ir a la par de la lectura de los archivos.

En cuanto a sustituir la barra por gráficos, acuérdate que lo hicimos (Lo de la esquinas no redondas).
Lo que no lo vi fue con un gif. No funciona el enlace, esta prohibido.  

Shordi

Bueno es aprender palabras nuevas.

Un bucle tiene un final definido, o un numero de iteraciones definidas.Aunque también los hay que no sabes
cuantas iteraciones o repeticiones puede tener, que dependen de una condición.

El uso del timer en el segundo ejemplo no era adecuado. Lo he intentado de otra manera sin timer y es mas razonable,
pero no acaba de funcionar del todo.

Dani

Con la barra de progreso quedara mas vistoso. Pero mejorando el segundo ejemplo, claro.

Jesús

Tengo que repasar bien tu solución.A ver si con un poco de tiempo lo veo mejor.


Gracias a todos.Cuando tenga un momento de lugar os muestro el ejemplo sin timer  que no era necesario en el segundo ejemplo
y a ver si logro que funcione.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejemplo De Barra De Progreso Con Timer 
 
Continuo con el ejemplo.Ayer no tuve tiempo para mostrarlo.

Lo mas simple que hice fue esto:

Public Sub btnGenera_Click()
  Dim unarchivo As String      
  Dim aarchivos As String[]
  Dim numeroarchivos as Integer

   aarchivos = RDir(User.Home &/ "Emulacion/Spectrum/Hobbcinta/", "*")
   numeroarchivos = aarchivos.Count
   incrementos = 1 / numeroarchivos
    
   For Each unarchivo In aarchivos
      lstValores.Add(unarchivo)
      ProgressBar1.Value += incrementos
      'Wait 0.1
   Next
  
End
 


- Se crea un array con los nombres de los archivos.
- Se averigua el numero de archivos.
- Se averigua el valor del incremento, conocemos cuantos son.
- Por cada archivo en el array se hace:
--->Se añade a la lista cada uno de los archivos del array
--->Se aumenta el tamaño de la barra con el valor del incremento por cada archivo del array

Ok. Ahora el problema. Esta operación hace que ni la barra ni la lista se muestre hasta el final.
Entonces me veo, ¿ obligado ? a usar un retardo. Wait .Pero para usar wait prefiero un timer.
Por la razón de que wait a veces si se para por algún motivo la aplicación, crea problemas extraños.

Si se usa un timer, la rutina del Timer contendría:

Public Sub Timer1_Timer()
  
   lstValores.Add(aarchivos[x])      
   ProgressBar1.Value += incrementos  
   x += 1
   If ProgressBar1.Value = 1 Then Timer1.Stop

End
 


Es que se cuantos archivos existen.Me lo da la función RDir.
Si fuera una base de datos, también puedo averiguar cuantos registros son.
No es algo, que no se sepa, el incremento es fijo.No hay variación.(Gracias a RDir, claro)




Saludos.
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Jueves, 14 Marzo 2013, 13:21; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Ejemplo De Barra De Progreso Con Timer 
 
El uso del retardo es obligado para que la aplicación ejecute todas las operaciones pendientes, entre ellas el refresco de pantalla.
Si el progreso de la barra no es homogéneo(que en una rutina de mover cadenas a un array, como la que pones, no tiene por qué no serlo), es un reflejo de lo que está ocurriendo en el proceso, que puede ser útil para el interesado.

Imagina que la rutina es de copia de una lista de archivos a una carpeta:

For n=0 to aarchivos.count -1
    ProgressBar1.Value = (n / aarchivos.count)
    mietiqueta.text="Copiando: " & miarchivo
    Wait 0.01
    copy carpetaorigen &/ unarchivo to carpetadestino &/ unarchivo
Next
 


La barra de progreso iría a trompicones según el tamaño del archivo que se copie en ese momento. Complementado con la etiqueta informativa (que le da tiempo a leer cuando se ralentice por archivos grandes) da al usuario una idea real de lo que está haciendo. El retardo de 0.01 es mejor para esto que el de 0.1... 10 veces más rápido, claro.
Saludos.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Esquinas De La Barra De Progreso guadafan General 18 Domingo, 09 Diciembre 2012, 12:54 Ver último mensaje
Shell
No hay nuevos mensajes Problema Para Mostrar La Barra De Progreso. Shell General 5 Miercoles, 16 Marzo 2016, 00:33 Ver último mensaje
Shell
No hay nuevos mensajes Barra De Progreso Al Copiar Un Archivo Andres13 Aplicaciones/Fragmentos de Código 14 Jueves, 21 Abril 2016, 18:42 Ver último mensaje
shordi
No hay nuevos mensajes Modos De La Barra De Progreso. Shell Controles/Librerías/Componentes 4 Jueves, 12 May 2016, 19:32 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron