CLR: .Net / Mono / Boo / Otros CLR > VB .NET

 codigo para poder ver el numero indice de una imagen randomi

(1/2) > >>

ESTEFY:
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:
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.

Nebire:

--- 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...
--- Fin de la cita ---

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 --- Public Class Form1    Dim RND As New Random     Private pb As New List(Of PictureBox)    Private j, A As Integer ' supongo que lo utilizas en otra parte...     ' cargador de las imágenes:     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click        Dim X, i, y, t As Integer        Dim Pict As PictureBox         y = 10        t = 10        For i = 0 To 8            If y = ((120 * 3) + 10) Then                y = 10                t += 120            End If            X = RND.Next(1, 9)            Pict = New PictureBox            Pict.Image = System.Drawing.Image.FromFile("c:imgIMAGEn" + Trim(Str(X)) + ".bmp")            Pict.Name = "Pic_imagen" & CStr(X)             Pict.Width = 100            Pict.Height = 100            Pict.SizeMode = PictureBoxSizeMode.StretchImage            Pict.Left = y            Pict.Top = t            y += 120             Pict.Tag = X            Pict.Enabled = False  ' importante             Me.Controls.Add(Pict)            pb.Add(Pict)            Pict = Nothing        Next    End Sub    ' Detector: de imagen sobre la que se pulsó.    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.Y >= k.Top And e.Y <= k.Top + k.Height Then                    MsgBox(k.Tag)                End If            End If        Next    End SubEnd Class   

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 --- ' Crea una lista aleatoria sin elementos repetidos con valores entre 0 y el valor máximo (-1) pasado en el parámetro 'Max'Private Function ListaSinrepes(ByVal Max As Integer) As String()        Dim lis() As String        ReDim lis(0 To Max - 1) ' lista de cadenas de retorno        Dim k, t As Integer, x As String        Dim v As New List(Of String)   ' colección de cadenas         For k = 0 To Max - 1   ' recrear la lista inicial            v.Add(CStr(k))       ' asignar valores correlativos a cada item... 0,1,2,3,4....        Next        For k = 0 To Max - 1            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            x = v.Item(t)  ' recuperamos el valor único que contiene ese item            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....            lis(k) = x  ' añadimos a nuestra lista de salida el valor único no repetido.         Next         Return lis    End Function     ' 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    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click        Dim s() As String = Me.ListaSinrepes(9)        Dim lista As String = ""         For k As Integer = 0 To s.Length - 1            lista &= s(k) & " "        Next        MsgBox(lista)    End Sub   
Entonces antes de ejecutar el bucle del código del boton1 deberías llamar a esta función:

--- Código: Visual Basic --- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click        Dim X, i, y, t As Integer        Dim Pict As PictureBox        y = 10        t = 10        dim lista() as string= ListaSinrepes(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...

ESTEFY:
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:

--- 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....?

--- Fin de la cita ---
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...
--- Fin de la cita ---
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...

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa