Problema con el control Timer

Colapsar
X
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar todos
nuevos mensajes

  • Problema con el control Timer

    Hola de nuevo a todos.
    En una aplicación estoy intentando hacer un carrusel con un grupo de gráficos y no consigo que me presenta más que el úñtimo gráfico

    Código:
    Private Sub btnAutomatico_Click(sender As System.Object, e As System.EventArgs) Handles btnAutomatico.Click
            Timer1.Start()
            Timer1.Interval = 1500
            cargaGraficos()
        End Sub
    
    Private Sub cargaGraficos()
            filas = dtgCarrusel.RowCount()
            Dim i As Integer
            For i = 0 To filas - 2
                nombre(i) = Convert.ToString(dtgCarrusel.Rows(i).Cells(3).Value)
                presenta(i) = "C:\Diseños\Graficos\" & nombre(i).ToString & ""
            Next
        End Sub
    
    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
            filas = dtgCarrusel.RowCount()
            For i = 0 To filas - 2
                pCarrusel.Image = Image.FromFile(presenta(i))
                lblNombreGrafico.Text = nombre(i).ToString
            Next
            Timer1.Stop()
        End Sub
    dtgCarrusel es un DataGridView
    pCarrusel es un PictureBox


    Si tenéis paciencia y queréis echarle un vistazo al código a lo mejor arrojáis un poco de luz a ver si veo el error.
    El caso es que ejecutando el proceso paso a paso todas las variables tienen valor correcto.
    Es como si ejecutara todo el bucle y sólo ejecuta la acción de presentar la imagen en el último valor.
    Muchas gracias por vuestra ayuda y perdonad mi tabarra.
    Saludos a todos.

  • #2
    Yo creo que TE PRESENTA TODOS LOS GRÁFICOS; lo que ocurre es que "se los pasa de largo a todos", hasta que llega al último, que es el que queda.

    Lo que necesitas es poner una PAUSA donde te indico

    Código:
    Private Sub cargaGraficos()
           filas = dgtCarrusel.RowCount()
           Dim i As Integer
           For i = 0 to filas - 2
                  Nombre(i) = Conver....
                  presenta(i) = "C:/Diseñ...
           Next
    'PAUSA
           End Sub
    Esa PAUSA podrá ser (según te interese) un bucle de una duración fija o una llamada a una rutina que no permita seguir hasta que pulses una tecla: Haces visible un comando y pones que mientras ese comando sea visible = True... Y cuando pulses ese comando le haces visible = False, por ejemplo.

    José María Movilla Cuadrado
    ______________________
    Normas del foro
    www.foro.vb-mundo.com
    www.vb-mundo.com

    Comentario


    • #3
      Hola José María.
      Como siempre, tu respuesta pronta y segura.
      Cuando sea mayor quiero ser como tú.
      Bueno, ahora en serio, reo que es una solución válida que al menos me permitirá ver los gráficos de uno en uno.
      Pero fíjate que en el control Timer le pongo un valor a su Interval par que ejecute la acción cada cierto tiempo, en este caso le he puesto 1,5 segundos.
      Encontré en internet un ejemplo que pasa automáticamente los gráficos controlados por el valor de Interval y lo hacía bien en su ejemplo.
      Lo que ocurre es que era muy básico y su cófigo no lo he podido adaptar.
      Pero ahora mismo me voy a poner a ello con tu idea y ya te contaré.
      Muchas gracias por tu ayuda.

      Comentario


      • #4
        Claro, claro... Tonto de mí... El error está en que la llamada "cargaGraficos()" tienes que hacerla dentro de la subrutina Timer1.
        José María Movilla Cuadrado
        ______________________
        Normas del foro
        www.foro.vb-mundo.com
        www.vb-mundo.com

        Comentario


        • #5
          Hola José María.
          No hay tu tía.
          He probado a incluir cargaDatos en el evento en el evento Timer1_Tick y hace lo mismo.
          Tambien he probado con la instrucción System.Threading.Thread.Sleep(1500) que detiene la ejecución un segundo y medio, y tampoco funciona. Siempre se para en el último registro y le presenta.
          Estoy mirando por internet y en la documentación del programa y no encuentro nada que me sirva (claro, que estaré mirando mal)-
          Seguiremos buscando.
          Gracias de nuevo.




          Comentario


          • #6
            El problema es que en el eveno del timer cargas todos los gráficos, y, allí final se muestra siempre el último.
            En vez de un bucle usa una variable estática incrementando su valor cada vez que se produzca el evento, ahora no dispongo de PCY no puedo poner el código
            Una visita a las Normas del foro nunca viene mal

            Comentario


            • #7
              Hola Gilman.
              Muchas gracias por tu respuesta t po lo que dices, veo que tenía razón Movilla cuando decía que si que los presentaba todos, pero que sólo mostraba el último.
              Si te apetece y puedes, me gustaría que me dieras alguna indicación de como hacer lo de la variable estática a ver si lo puedo implementar.
              La base de datos tiene ahora casi 6.000 registros y en unos pocos día se acercará a los 14.000, así que tendrá mucha actividad.
              De nuevo muchas gracias y espero que me puedas ayudar.
              Saludos de nuevo.

              Comentario


              • #8
                Me confundí en la línea de la PAUSA; debe ir ANTES DEL NEXT. Aunque preferiblemente la presentación debiera ir incluida en la subrutina del Timer1...

                Y sería mejor usar una variable que vaya incrementándose, como te indica gilman, en lugar del bucle For-Next
                José María Movilla Cuadrado
                ______________________
                Normas del foro
                www.foro.vb-mundo.com
                www.vb-mundo.com

                Comentario


                • #9
                  Debo de estar muy "espeso" porque ayer he estado todo el día intentando hacer un contador con una variable estática, tal y como me decía Gilman, y no lo he conseguido.
                  Quiero decir, hacer un contador sin utlizar bucles For-Next ó While.End While, etc.
                  Es cierto que hace muy poco que he comentado con VB .NET y ando muy despistado.
                  Lo único que he conseguido ha sido que me presente el primero o el último registro.
                  Con una instrucción If - End If consigo que me muestre el primer registro, pero no se como conseguir que esto se repita sin utilizar For-Next o similares
                  .
                  Código:
                  Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
                          Dim i As Integer
                          filas = dtgCarrusel.RowCount()
                  
                  
                          If i <= filas - 2 Then
                              If presenta(i) <> "" Then  'compruebo que el registro no esté vacío
                                  pCarrusel.Image = Image.FromFile(presenta(i))
                                  lblNombreGrafico.Text = nombre(i)
                                  Timer1.Interval = 1000
                                  i += 1
                              Else
                                  i += 1
                              End If
                          Else
                              Timer1.Stop()
                          End If
                              Timer1.Stop()
                      End Sub
                  
                  'Esto se hace una sola vez, con lo cual me presenta el primer registro, pero
                  'no se cómo hacer que se repita la condición de que i>filas-2
                  A ver si ahora lo consigo, pues es lo único que me queda para terminar la aplicación.
                  Hay que ver la guerra que estoy dando con esto.
                  Gracias por vuestra ayuda.

                  Comentario


                  • #10
                    Voy a intentar una prueba al vuelo, ya que ni siquiera tengo instalado Visual.Net:


                    Código:
                    ' En la cabecera del procedimiento
                    
                    Dim i As Integer
                    Dim filas As Integer = dgrCarrusel.RowCount()
                    
                    Private Sub btnAutomatico_Click(sender As ....
                        i = 0
                        Timer1.Interval = 1500
                        Timer1.Start()                     ' o Timer1_Tick(), no sé...
                        End Sub
                    
                    Private sub Timer1_Tick(...
                    
                        presenta(i) = "C:/Diseñ...
                        pCarrusel.Image = Image.FromFile(presenta(i))
                        lblNombreGrafico.text = Convert.ToString(dgtCarrusel.Row(1).Cells(3).Value)
                        i += 1
                    
                        If i > filas - 2 Then Timer1.Stop()
                        End Sub
                    José María Movilla Cuadrado
                    ______________________
                    Normas del foro
                    www.foro.vb-mundo.com
                    www.vb-mundo.com

                    Comentario


                    • #11
                      PERFECTO.
                      Muchísimas gracias José María.
                      La solución es perfecta y funciona de maravilla.
                      Con esto ya he acabado mi primer proyecto en .NET.
                      Este proyecto es para mi mujer que tiene una considerable colección de gráficos y quería una aplicación que la permitiera seleccionarlos por autores, ver cada gráfico individualmente y además esto último que es para ver los gráficos de un autor.
                      Bueno. Gracias a esto a lo mejor esta semana me trata un poco mejor y deja de pegarme (jeje).
                      De nuevo muchas gracias por tu ayuda y por las molestias que te has tomado para ayudare.
                      Igualmente agradezco a Gilman la pista que nos dio.
                      Saludos a todos.

                      Comentario


                      • #12
                        Me alegra muchísimo... Dile a tu mujer que tengo una tienda de látigos y bastones que ayudan a enderezar a los maridos descarriados... Y a buen precio...
                        José María Movilla Cuadrado
                        ______________________
                        Normas del foro
                        www.foro.vb-mundo.com
                        www.vb-mundo.com

                        Comentario

                        Trabajando...
                        X