• Martes 7 de Mayo de 2024, 23:47

Autor Tema:  codigo para poder ver el numero indice de una imagen randomi  (Leído 2944 veces)

ESTEFY

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
codigo para poder ver el numero indice de una imagen randomi
« en: Jueves 29 de Enero de 2009, 00:21 »
0
Hola, espero no molestar, queria saber si me podrian ayudar con un programa,
Este genera imagenes randomicas visualizadas en picturebox pero como estos son generados cuando aparecen no los puedo seleccionar, ya ahora lo q trato de hacer es q cuando haga click en una de las imagenes selecciondas aparezca el numero de indice de la imagen q se enceuntran en una carpeta y las imagenes estan enumeradas ejemp: image1, image2......y asi hasta q llegue a 50...entonces cuando haga click en la imagen q se genero salga solo el número de la imagen... aki les dejo el codigo hasta donde se genera las imagenes....
De ante mano agradezco aquines tenga la voluntad de ayudarme con este programilla.
Public Class Form1
    Dim RND As New Random
    Dim PICT(9) As PictureBox
    Dim X, i, y, j, t, A As Integer
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        y = 10
        t = 10
        For i = 0 To 8
            X = RND.Next(1, 9)
            PICT(i) = New PictureBox
            PICT(i).Image = System.Drawing.Image.FromFile("F:3IMAGE" + Trim(Str(X)) + ".JPG")
            Me.Controls.Add(PICT(i))
            PICT(i).Width = 100
            PICT(i).Height = 100
            PICT(i).SizeMode = PictureBoxSizeMode.StretchImage
            PICT(i).Left = y
            PICT(i).Top = t
            y += 120
            If i Mod 3 = 0 Then
                y = 10
                t += 120
            End If
        Next
    End Sub

seba123neo

  • Miembro activo
  • **
  • Mensajes: 36
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.neovisualbasic.com.ar/
Re: codigo para poder ver el numero indice de una imagen randomi
« Respuesta #1 en: Jueves 29 de Enero de 2009, 02:17 »
0
Hola, 3 observaciones...

1 - esta en .NET y esto es visual basic 6...

2 - trabaja con la siamgenes en la carpeta de tu programa , no fuera de ella...

3 - la variable X  es la que guarda el numero...solo debes mostrar esa variable...

saludos.
Todos somos ignorantes;lo que pasa es que no todos ignoramos las mismas cosas - Albert Einstein

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: codigo para poder ver el numero indice de una imagen randomi
« Respuesta #2 en: Jueves 29 de Enero de 2009, 12:20 »
0
Cita de: "ESTEFY"
Este genera imagenes randomicas visualizadas en picturebox pero como estos son generados cuando aparecen no los puedo seleccionar, ya ahora lo q trato de hacer es q cuando haga click en una de las imagenes selecciondas aparezca el numero de indice de la imagen q se enceuntran en una carpeta y las imagenes estan enumeradas ejemp: image1, image2......y asi hasta q llegue a 50...entonces cuando haga click en la imagen q se genero salga solo el número de la imagen...

Ya que estamos... terminamos....

A lo que te dice el compañero te añado 2 cosas:
 a ) utiliza las etiquetas de 'code', para ello pulsa (en el editor) sobre la etiqueta 'code' e incluye tu código dentro.
 b ) Aunque uses la X como te indica el compañero no obtendrás el resultado deseado, ya que el código que expones es el código del botón para cargar las imágenes.
Además esto básicamente no soluciona tu problema, esto se refleja más adelante en el código con la linea 'pict.tag=X'. El problema principla es el que describes, que creas dinámicamente los controles picturebox y por tanto no tienes acceso a sus eventos, para colmo, aunque declares con withevents los picturebox, no te dejará ya que las matrices no se pueden declarar con withevents.

La solución pasa por lo siguiente, de forma detalada:

1 )  De entrada sustituímos la matriz por una colección de picturebox 'pb' en el código, ya quepermite añadir y eliminar elementos más fácilmente si más adelante en el proyecto te resulta preciso.
2 ) Hacemos cambios de alineación (se supone que es la idea que se desprende) de los picturebox en 3 columnas . esto se refleja en el código sustituyendo tu : 'If i Mod 3 = 0 Then...' por otro equivalente que lo realiza bien, además fíjate que para ello lo posicionamos al principio del bucle.
3 ) Como se dijo anteriormente para solucionar la referencia numérica añadimos el dato al tag del control
4 ) hemos renombrado los picturebox a medida que se van generando, ya que cada picturebosx los creamos y eliminamos con cada iteración. No es absolutamente necesario...
5 ) Añadimos el control a la colección 'pb'. Y la línea de añadirlo a la colección controls del formulario la colocamos junto a esta, sólo por 'mantener el orden'.
6 ) Importántísimo: para poder hacer detecciones en el formulario sobre qué control estamos necesitamos añadir una línea que deshabilita cada picturebox, véase la línea: 'Pict.Enabled = False  ' importante'

El método que usamos para detectar que control está siendo pulsado, es el evento mouseup del formulario, como todos los eventos mouseup en los argumentos de evento se reciben las cordenadas sonbre las que está, X e y que utilizamos para detectar recorriendo todos los controles de la colección pb e identificando si alguno tiene su ubicación en dichas cordenadas, si esto es cierto se considera una detección positiva y entonces lanzamos el mensaje correcpondiente con el valor tag que previamente alamcenamos para el control.

Nota: que para que el código funcione es imperativo que los picturebox estén deshabilitados, ya que sino el evento mouseup sobre las cordenadas de los picturebox no son registrados como eventos del formulario sino como eventos de los picturebox y como no tenemos acceso a dichos eventos no lograríamos 'cazarlos'. al estar desactivados, el formulario puede acceder libremente a las cordenadas de dichos objetos.

Para terminar alguna notas más:
 a ) sería más rentable 'pegar' directamente las imágenes sobre el formulario si el propósito exclusivamente es para mostrar unas imágenes y detectar cual se ha seleccionado. Una estructura se encargaría de registrar las 'propiedades' top, left width, height y tag , la colección por tanto sería sobre esta estructura. Esto es bastante más ligero y consume menos recursos...

b ) Si se sobreponen 2 o más objetos en las mismas cordenadas donde se ha detectado el 'muoseup', la detección indicaría como 'seleccionado' el primero que se coincide recorriendo la colección con las condiciones de detección de cordenadas. Como en la carga de los objetos se llevo a cabo esto adecuadamente, este problema no existe, pero no hay que perderlo de vista si se hace más complejo...

c ) NOTA: para probar el programa adapté la ruta y formato de imagen al caso de mi ordenador, obviamente deberás cambiar la línea a tu necesidad: 'Pict.Image = System.Drawing.Image.FromFile("c:imgIMAGEn" + Trim(Str(X)) + ".bmp")'

Código: Visual Basic
  1.  
  2. Public Class Form1
  3.     Dim RND As New Random
  4.  
  5.     Private pb As New List(Of PictureBox)
  6.     Private j, A As Integer ' supongo que lo utilizas en otra parte...
  7.  
  8.     ' cargador de las imágenes:
  9.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  10.         Dim X, i, y, t As Integer
  11.         Dim Pict As PictureBox
  12.  
  13.         y = 10
  14.         t = 10
  15.         For i = 0 To 8
  16.             If y = ((120 * 3) + 10) Then
  17.                 y = 10
  18.                 t += 120
  19.             End If
  20.             X = RND.Next(1, 9)
  21.             Pict = New PictureBox
  22.             Pict.Image = System.Drawing.Image.FromFile("c:imgIMAGEn" + Trim(Str(X)) + ".bmp")
  23.             Pict.Name = "Pic_imagen" & CStr(X)
  24.  
  25.             Pict.Width = 100
  26.             Pict.Height = 100
  27.             Pict.SizeMode = PictureBoxSizeMode.StretchImage
  28.             Pict.Left = y
  29.             Pict.Top = t
  30.             y += 120
  31.  
  32.             Pict.Tag = X
  33.             Pict.Enabled = False  ' importante
  34.  
  35.             Me.Controls.Add(Pict)
  36.             pb.Add(Pict)
  37.             Pict = Nothing
  38.         Next
  39.     End Sub
  40.  
  41.    ' Detector: de imagen sobre la que se pulsó.
  42.     Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
  43.         For Each k As PictureBox In pb
  44.             If e.X >= k.Left And e.X <= k.Left + k.Width Then
  45.                 If e.Y >= k.Top And e.Y <= k.Top + k.Height Then
  46.                     MsgBox(k.Tag)
  47.                 End If
  48.             End If
  49.         Next
  50.     End Sub
  51. End Class
  52.  
  53.  
  54.  


d ) El sistema utilizado para recoger aleatoriamente las imágenes (ignoro si relamente lo quieres así) no proporciona un sistema de imágenes únicas sino que salen repetidas... Un modo de solucionar esto se ofrece en éste apartado de código... que debería implementarse sobre el código de adquisición de las imágenes (botón1)

Código: Visual Basic
  1.  
  2. ' Crea una lista aleatoria sin elementos repetidos con valores entre 0 y el valor máximo (-1) pasado en el parámetro 'Max'
  3. Private Function ListaSinrepes(ByVal Max As Integer) As String()
  4.         Dim lis() As String
  5.         ReDim lis(0 To Max - 1) ' lista de cadenas de retorno
  6.         Dim k, t As Integer, x As String
  7.         Dim v As New List(Of String)   ' colección de cadenas
  8.  
  9.         For k = 0 To Max - 1   ' recrear la lista inicial
  10.             v.Add(CStr(k))       ' asignar valores correlativos a cada item... 0,1,2,3,4....
  11.         Next
  12.         For k = 0 To Max - 1
  13.             t = RND.Next(v.Count) ' tomamos un valor aleatorio entre los índices disponibles en la colección, pero los índices no se usan, sino su valor
  14.             x = v.Item(t)  ' recuperamos el valor único que contiene ese item
  15.             v.RemoveAt(t)  ' eliminamos el ítem de la colección, la colección se 'reordena', el valor recogido por tanto ya no se podrá volver a tomar, aunque se elija el msimo índice....
  16.             lis(k) = x  ' añadimos a nuestra lista de salida el valor único no repetido.
  17.         Next
  18.  
  19.         Return lis
  20.     End Function
  21.  
  22.     ' este pequeño código demuestra la lista sin repetición, añade un botón .... (button2) y púlsalo una y otra vez y verás que nunca salen repetidos
  23.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  24.         Dim s() As String = Me.ListaSinrepes(9)
  25.         Dim lista As String = ""
  26.  
  27.         For k As Integer = 0 To s.Length - 1
  28.             lista &= s(k) & " "
  29.         Next
  30.         MsgBox(lista)
  31.     End Sub
  32.  
  33.  
  34.  

Entonces antes de ejecutar el bucle del código del boton1 deberías llamar a esta función:
Código: Visual Basic
  1.  
  2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  3.         Dim X, i, y, t As Integer
  4.         Dim Pict As PictureBox
  5.         y = 10
  6.         t = 10
  7.         dim lista() as string= ListaSinrepes(9)
  8.  
  9.  

Luego hay que sustituir las referencias a x por por  lista(x), por ejemplo: en ' Trim(Str(X)' pondríamos lista(X), etc....

Cualquier duda, pregunta...

Si un moderador puede y quiere cambiar el tema a vb-net (cuando el interesado responda haber leído el mensaje) sería lo adecuado...
«Ma non troppo»
----> ModoVacaciones = False<----

ESTEFY

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: codigo para poder ver el numero indice de una imagen randomi
« Respuesta #3 en: Viernes 30 de Enero de 2009, 00:32 »
0
Hola Neberi muchas gracias por tu aporte....tengo una inquietud apesar de tu bondadosa explicación...Te agradeceria mucho q me aclararas esta duda...de ante mano gracias por tu amabilidad..

* "Crea una lista aleatoria sin elementos repetidos con valores entre 0 y el valor máximo (-1) pasado en el parámetro 'Max'"  como es eso de crear la lista... ¿donde? aun no entiendo el porq....?

bueno la buena noticia es q el programa ya funciona casi como queria..pero funciona....solo quisiera saber si puedes q presenten los numreos de los indices de las imagenes pero no de corrido sino q presente el numero de indice de la imagen a la q le doy click...

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: codigo para poder ver el numero indice de una imagen randomi
« Respuesta #4 en: Sábado 31 de Enero de 2009, 16:32 »
0
Cita de: "ESTEFY"
Hola Nebire muchas gracias por tu aporte....tengo una inquietud apesar de tu bondadosa explicación...Te agradeceria mucho q me aclararas esta duda...
* "Crea una lista aleatoria sin elementos repetidos con valores entre 0 y el valor máximo (-1) pasado en el parámetro 'Max'"  como es eso de crear la lista... ¿donde? aun no entiendo el porq....?
Veamos, tu tienes una carpeta con imágenes del tipo: nombre + nº + extensión.  De esa carpeta tu dices quiero tomar x imágenes elegidas al azar y situarlas en el formulario... Pero puede suceder, especialmente si el número de imágenes es pequeño que al elegir imágenes al azar una o más la elijas 2 o más veces y por tanto repetida. La función que adjunto al final (y la explicación) refiere a como tomar x imágenes al azar asegurándose que ninguna se toma repetida respecto de las ya escogidas... te lo explico con números; sea la serie: 1,2,3,4,5,6,7,8,9 donde representan lo que sea, ahora queremos tomar 3 objetos de esos al azar, supongamos que salen el : 6,2,8 podrían haber salido el 4,5 y 9 pero también podría salir el 2,5,2 en esta última secuencia el 2 ha salido repetido la función lo que permite es que esto no ocurra, de modo que a esa serie del 1 al 9 eligiendo siempre 3 nunca salgan 2 repetidos.

Pero esto es sólo si realmente quieres que no se repitan, si no es el caso no importa...

Cita de: "ESTEFY"
.. bueno la buena noticia es q el programa ya funciona casi como queria..pero funciona....solo quisiera saber si puedes q presenten los numreos de los indices de las imagenes pero no de corrido sino q presente el numero de indice de la imagen a la q le doy click...
Eso es lo que hace exactamente el código. Ofrece el índice que tiene la imagen pulsada, el índice lo guardamos en la propiedad tag del picturebox. Si no te sale bien es posible que hayas copiado mal el código o que los cambios que hayas realizado 'deformen' la funcionalidad que yo le dí.
...Si tienes dudas expón el código que ejecutas para que vea donde tienes el error...
Puedes copiar el código que expuse más arriba en un nuevo proyecto para verificar que se ejecuta correctamente. Los índices son los números que corresponden al nombre de la imagen cuando se cargan, y estas se cargan aleatoriamente, por tanto salvo absoluta casualidad esto no ocurrirá más de una vez cada x millones...
«Ma non troppo»
----> ModoVacaciones = False<----

ESTEFY

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: codigo para poder ver el numero indice de una imagen randomi
« Respuesta #5 en: Sábado 31 de Enero de 2009, 21:27 »
0
Holap, gracias `por tenerme paciencia..... copie tu codigo en un nuevo proyecto pero este leia aparte de la imagen q le daba click tambien la de alado.....  sabes me puse ha estar moniando ..y solo tenia este error q no van los iguales en la codificación del detector de imagenes q me diste.....jajja lo logramos......muchas gracias he.....Realmente  sos lo maximo!!! :P

 Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        For Each k As PictureBox In pb
            If e.X >= k.Left And e.X <= k.Left + k.Width Then
                If e.X >= k.Top And e.Y <= k.Top + k.Height Then
                    MsgBox(k.Tag)
                End If
            End If
        Next
    End Sub
End Class

Oye una pregunta mmm...queria ajustarle el codigo para q funcionara mediante  matrices; la matrices es cuadratica....pero no sé cual es el error....mmmmm...toma como limite para leer las imagenes de  arriba de diagonal principal y las lee de corrido..osea le doy click a la imagen de la ultima columna y las lee de corrido.... por fis hechale le un vistazo...para q me digas cual es el error..aki te dejo el codigo q he hecho...gracias de antemano....espero no cansarte...

Public Class Form1
    Private PB As New List(Of PictureBox)
    Dim m(100, 100) As Integer
    Dim rnd As New Random
    Private Sub ING_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ING.Click
        Dim i, j, b, k, c, f, y, t, x As Integer

        Dim pict As PictureBox
        b = Val(lim.Text)
        If b Mod 2 <> 0 Then
            MsgBox(" INGRESAR NUMERO PAR")
            lim.Text = " "
            lim.Focus()
        End If
        If b <= 10 Then
            D1.ColumnCount = b
            D1.RowCount = b
            For f = 0 To b - 1
                For c = 0 To b - 1
                    m(f, c) = 0
                    D1.Columns.Item(c).Width = 25
                Next
            Next
            If b Mod 2 = 0 Then
                t = (b * b) / 2
            End If

            y = 15
            k = 40

            For f = 0 To b - 1
                For c = 0 To b - 1
                    Randomize()
                    x = rnd.Next(1, (t + 1))
                    m(f, c) = x
                Next
            Next
            y = 10
            k = 15

            For i = 0 To b - 1
                For j = 0 To b - 1
                    D1.Item(j, i).Value = m(i, j)
                    x = Val(m(i, j))
                    pict = New PictureBox
                    pict.Image = System.Drawing.Image.FromFile("f:3image" + Trim(Str(x)) + ".jpg")
                    pict.Name = "PIC_IMAGE" & CStr(x)

                    pict.Width = 35
                    pict.Height = 35
                    pict.SizeMode = PictureBoxSizeMode.StretchImage
                    pict.Left = y
                    pict.Top = k
                    y += 50

                    pict.Tag = x
                    pict.Enabled = False

                    Me.Controls.Add(pict)
                    PB.Add(pict)
                    pict = Nothing

                Next
                y = 15
                k += 50
            Next

        Else
            MsgBox("NUMEROS MENOR A 10")
            lim.Text = " "
            lim.Focus()
        End If
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        End
    End Sub

    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        For Each s As PictureBox In PB
            If e.X > s.Left And e.X <= s.Left + s.Width Then
                If e.X > s.Top And e.Y < s.Top + s.Height Then
                    MsgBox(s.Tag)
                End If
            End If
        Next
    End Sub
End Class

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: codigo para poder ver el numero indice de una imagen randomi
« Respuesta #6 en: Domingo 1 de Febrero de 2009, 15:28 »
0
Cita de: "ESTEFY"
Oye una pregunta mmm...queria ajustarle el codigo para q funcionara mediante  matrices; la matrices es cuadratica....pero no sé cual es el error....mmmmm...toma como limite para leer las imagenes de  arriba de diagonal principal y las lee de corrido..osea le doy click a la imagen de la ultima columna y las lee de corrido.... por fis hechale le un vistazo...para q me digas cual es el error..aki te dejo el codigo q he hecho...gracias de antemano....espero no cansarte...

   Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        For Each s As PictureBox In PB
            If e.X > s.Left And e.X <= s.Left + s.Width Then
                If e.X > s.Top And e.Y < s.Top + s.Height Then
                    MsgBox(s.Tag)
                End If
            End If
        Next
    End Sub
End Class  

El error es de transcripción, ya lo cometes también al inicio del mensaje, de entrada pensé que yo lo puse mal y por eso lo copiaste mal, pero no, yo lo he puesto bien... donde remarco e.x debes cambiarlo por e.y... la primera línea detecta horizontalmente, la 2ª detecta verticalmente....

De paso te comento algunos cambis.... después de hallar una deteción  puesto que no solapas imágenes, no es necesario seguir comprobando el resto elementos dentro de la colección por tanto debajo de la línea ' MsgBox(s.Tag)'  sería útil añadir un 'exit for' , pensé que tú misma te darías cuenta y acabarías por ponerlo, pero parece que no te has parado lo suficiente en 'mirar como trabaja'.

El otro cambio que te sugiero es que la matriz no la declares con 100 elementos por cada dimensión pués al final reservas memoria para 10.000 elementos aunque sólo uses 36. Entonces sustituye la línea : 'Dim m(100, 100) As Integer' por 'Dim m( , ) As Integer' y consecuentemente después de la línea: 'If b <= 10 Then' añade esta otra: ' ReDim m(0 To b - 1, 0 To b - 1)' ...

Cita de: "ESTEFY"
....espero no cansarte...
bueno, lo que realmente me cansa es la mala expresión de los problemas.

Por ejemplo ignorar ciertos detalles necesarios para entender el propio mensaje, por ejemplo hubiera sido útil indicar que 'D1' se refiere a un Datagridview , que  'ing' es un botón y que 'lim' es un textbox, sería más adecuado o indicar eso o aunque sea sólo en el foro sustituir lim por textboxLim ing por buttonIng, y D1 por DgridvD1 o similar así no necesitas especificar que son y yo no pierdo tiempo en intentar ver qué es y qué intentas hacer...

Y lo otro que especialmente me cansa es el no hacer uso de las etiquetas de code para dar formato en el editor. Todo lo que hay que hacer es pulsar (cuando redactas el mensaje9 pulsar en el botón que indica 'Code" que sale así (sin los espacios aquí puestos) [ c o d e ]  [ / c o d e ]   el código lo pones en medio de las 2 etiquetas y ya queda indentado como en el editor de visual Studio, además si la 1ª etiqueta la modificas así:  [ c o d e =vb] entonces además queda automáticamente coloreado, lo que hace legible el código. Me resulta cansado leer código sin darle formato, de hecho suele ser la razón por la a veces no responda algunos posts. Normalmente cedo más tolerancia a los nuevos, pero por favor en el futuro usa dichas etiquettas...

p.d.: adjunto una imagen para que entiendas a que me refería en el anterior post con aquello de las imágenes repetidas...(haciendo uso de este último código). Agranda la imagen y observa como las imágenes etiquetadas como 1 y 14 están repetidas varias veces..(aparte de otras).

[img=http://img401.imageshack.us/img401/4854/dibujouj5.png]

«Ma non troppo»
----> ModoVacaciones = False<----

ESTEFY

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: codigo para poder ver el numero indice de una imagen randomi
« Respuesta #7 en: Domingo 1 de Febrero de 2009, 22:45 »
0
Holap...oye muchas gracias por decirme cuales fueron mis errores si me hubieras dicho antes eso de las etiquetas, realmente no sabia para q servian mismo...pero ya veo q dan mucha ayuda a parte de una mejor presentación....mm..y tienes mucha razón eso de los name de los botones, ustedes no son adivinos para saber q clase de boton se esta usando....pero cada día se aprende algo nuevo....muchas gracias por tu enorme ayuda......me alegro mucho de q una persona como tu me haya ayudado y tomare muy encuenta para otra vez tus recomendaciones....nuevamente muchas gracias.... :P  :D....bueno hasta en otro momento..bye...