Visual Basic.NET - Novato, Novatisimo aprendiendo desde cero

 
Vista:

Novato, Novatisimo aprendiendo desde cero

Publicado por chok (2 intervenciones) el 09/03/2019 10:56:29
Hola y gracias por vuestra ayuda
Pues como dice el titulo soy novato y estoy aprendiendo prácticamente desde cero
Estoy diseñando un visor de imágenes en plan aprendizaje en el que desde una label cuando paso el mouse (eventos MouseMove y MouseLeave) se carga o descarga una imagen en un PistureBox

1
2
3
4
5
6
7
Private Sub Label1_MouseMove(sender As Object, e As MouseEventArgs) Handles Label1.MouseMove
    PictureBox1.Image = Image.FromFile("C:\Users\xxx\Desktop\Images\image1.jpg")
End Sub
 
Private Sub Label1_MouseLeave(sender As Object, e As EventArgs) Handles Label1.MouseLeave
    PictureBox1.Image = Image.FromFile("C:\Users\xxx\Desktop\images\imageBase.jpg")
End Sub

El tema es que quiero hacerlo con unas 20 o 30 labels y cada label carga una imagen distinta

Repetir este código 30 veces aparte de engorroso, creo que quedaría muy sucio y me gustaría saber como hacerlo sin usar tantas lineas de código, osea mas resumido y mas corto.

Muchas gracias!
Un saludo!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Novato, Novatisimo aprendiendo desde cero

Publicado por Phil Rob (1554 intervenciones) el 09/03/2019 13:58:45
Hola,

Respondo en dos veces a tu problema y esta primera vez, es para preguntar : como el codigo almaceda los nombres de las 30 imagen (si 30 Label) ?
Esta pregunta porque para escribir un solo procedimiento para mostrar cada imagne debe saber donde buscar el imagen. Quizá utilizas una tabla de String : Dim NombreImagen(30) As String ?
Una nota ya, es mala idea de trabajar con el evento Move (Mouse_Mouse) porque ejecuta por cada pixel. Mejor eligir el evento Enter (Mouse_Enter). Es logica : Mouse_Enter <=> Mouse_Leave.

Hasta pronto,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Novato, Novatisimo aprendiendo desde cero

Publicado por chok (3 intervenciones) el 09/03/2019 14:20:56
Muchas gracias por contestar Phil Rob

1- Respondo en dos veces a tu problema y esta primera vez, es para preguntar : como el código almacena los nombres de las 30 imagen (si 30 Label) ?

si, tengo label1, label2, label3, label4...

2-Esta pregunta porque para escribir un solo procedimiento para mostrar cada imagne debe saber donde buscar el imagen. Quizá utilizas una tabla de String : Dim NombreImagen(30) As String ?

Repito el código 30 veces, obviamente no se hacerlo de otra manera, soy muy novato

3-Una nota ya, es mala idea de trabajar con el evento Move (Mouse_Mouse) porque ejecuta por cada pixel. Mejor eligir el evento Enter (Mouse_Enter). Es logica : Mouse_Enter <=> Mouse_Leave.

Esto lo entendí

Gracias!
Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Novato, Novatisimo aprendiendo desde cero

Publicado por Phil Rob (1554 intervenciones) el 09/03/2019 15:17:55
Disculpa mi malo español ... estoy aprendiendo ...
No comprende mis preguntas ...
Pregunto cómo los nombres del 30 imagenes estan almacenado, cómo la programa sabe aquella imagen mostrar en la PictureBox ?
Entonce, comprendo que escribe 30 procedimientos pero propongo de escribir un solo procedimiento para todos Label, si interesas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Novato, Novatisimo aprendiendo desde cero

Publicado por chok (3 intervenciones) el 09/03/2019 18:19:29
Hola Phil Rob, a ver si lo he entendido
Lo tengo así

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Private Sub Label9_MouseMove(sender As Object, e As MouseEventArgs) Handles Label9.MouseMove
    PictureBox1.Image = Image.FromFile("C:\Users\Chok\Desktop\Tablas\CC en SB.jpg")
End Sub
 
Private Sub Label9_MouseLeave(sender As Object, e As EventArgs) Handles Label9.MouseLeave
    PictureBox1.Image = Image.FromFile("C:\Users\Chok\Desktop\Tablas\imagen1.jpg")
End Sub
 
Private Sub Label10_MouseMove(sender As Object, e As MouseEventArgs) Handles Label10.MouseMove
    PictureBox1.Image = Image.FromFile("C:\Users\Chok\Desktop\Tablas\call CO.jpg")
End Sub
 
Private Sub Label10_MouseLeave(sender As Object, e As EventArgs) Handles Label10.MouseLeave
    PictureBox1.Image = Image.FromFile("C:\Users\Chok\Desktop\Tablas\imagen1.jpg")
End Sub
 
Private Sub Label11_MouseMove(sender As Object, e As MouseEventArgs) Handles Label11.MouseMove
    PictureBox1.Image = Image.FromFile("C:\Users\Chok\Desktop\Tablas\call Early.jpg")
End Sub
 
Private Sub Label11_MouseLeave(sender As Object, e As EventArgs) Handles Label11.MouseLeave
    PictureBox1.Image = Image.FromFile("C:\Users\Chok\Desktop\Tablas\imagen1.jpg")
End Sub
 
Private Sub Label12_MouseMove(sender As Object, e As EventArgs) Handles Label12.MouseMove
    PictureBox1.Image = Image.FromFile("C:\Users\Chok\Desktop\Tablas\cold4.jpg")
End Sub
 
Private Sub Label12_MouseLeave(sender As Object, e As EventArgs) Handles Label12.MouseLeave
    PictureBox1.Image = Image.FromFile("C:\Users\Chok\Desktop\Tablas\imagen1.jpg")
End Sub

...Y así hasta 30

Gracias!

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Novato, Novatisimo aprendiendo desde cero

Publicado por Phil Rob (1554 intervenciones) el 09/03/2019 18:02:12
Hola,

Te propongo de veo el video en DropBox y el codigo siguiente.
Entonces tiene que diceme si esta te convene y luego puebo enviar el projecto completo.
Saludos
Video DropBox : https://www.dropbox.com/s/p3i2cy42ymb9b0p/LasImagenes.mp4?dl=0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Dim LesImagenes() As String
Dim NumeroImagenes As Integer
Dim MiExplorador As OpenFileDialog
Dim WithEvents Etiqueta As Label
 
Dim ImagenPrederteminada As String = Nothing  ' Escribir ahi el nombre de la imagen predeterminada, ej : "C:\Users\xxx\Desktop\images\imageBase.jpg"
 
Private Sub BCargar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BCargar.Click
    MiExplorador = New OpenFileDialog
    MiExplorador.Filter = "Todos|*.*|Imagen|*.bmp; *.png; *.jpg"
    MiExplorador.Multiselect = True
    If (MiExplorador.ShowDialog() = DialogResult.OK) Then
        NumeroImagenes = MiExplorador.FileNames.Count
        ReDim LesImagenes(NumeroImagenes - 1)
        For I As Integer = 0 To NumeroImagenes - 1
            LesImagenes(I) = MiExplorador.FileNames(I)
        Next
    End If
    MiExplorador.Dispose()
    PonerEtiquetas(NumeroImagenes)  ' Es ahi la algoritmica mas dificile 
    AgregarEventos()
End Sub
 
' ....................
 
Private Sub AgregarEventos()
    For Each Control In GBImagenes.Controls
        If TypeOf Control Is Label Then
            Dim Etiqueta As Label = CType(Control, Label)
            AddHandler Etiqueta.MouseEnter, AddressOf Me.Etiqueta_MouseEnter
            AddHandler Etiqueta.MouseLeave, AddressOf Me.Etiqueta_MouseLeave
        End If
    Next
End Sub
 
Private Sub Etiqueta_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Etiqueta.MouseEnter
    Dim NombreImagen As String
    Dim IndiceDeNombreImagen As Integer
    Dim NombreEtiqueta As String = sender.Name
    IndiceDeNombreImagen = NombreEtiqueta.LastIndexOf("_") + 1
    NombreImagen = LesImagenes(CType(NombreEtiqueta.Substring(IndiceDeNombreImagen), Integer))
    PBImagen.Image = Image.FromFile(NombreImagen)
End Sub
 
Private Sub Etiqueta_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Etiqueta.MouseLeave
    If ImagenPrederteminada Is Nothing Then
        Exit Sub
    End If
    PBImagen.Image = Image.FromFile(ImagenPrederteminada)
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Novato, Novatisimo aprendiendo desde cero

Publicado por chok (3 intervenciones) el 09/03/2019 18:42:23
Phil Rob, muchas gracias por el esfuerzo
Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Novato, Novatisimo aprendiendo desde cero

Publicado por Phil Rob (1554 intervenciones) el 09/03/2019 22:23:38
Creo comprender que mi codigo te gusta.
Adjunto el archivo MultiImagen.zip que contene mi projecto para probar.
El procedimiento PonerEtiquetas() que pone las Label en el Form es dificil pero puede modificar.
Puede preguntar explicaciones sobre la gestion de los Eventos en uno solo procedimiento.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 135
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Novato, Novatisimo aprendiendo desde cero

Publicado por Agustin (39 intervenciones) el 11/03/2019 19:00:17
Acá dejo un ejemplo de cómo se haría esto usando un framework moderno en lugar de winforms: https://github.com/agleiva/visordeimagenes

Hace exactamente lo mismo que tu proyecto Multiimagen.zip, pero con mucho menos codigo, y sin hacer ninguna manipulación por código de elementos visuales.

Tiene las siguientes ventajas respecto del approach de winforms:

1 - se auto ajusta al tamaño de la ventana.
2 - los nombres de los archivos se visualizan completos, incluso si son largos
3 - la lista de archivos se visualiza en columnas de forma automática dependiendo del espacio disponible.
4 - no se crean controles dinámicamente sino que se utiliza un approach MVVM.
5 - el código es muchísimo más simple y sencillo, y opera con DATOS en lugar de operar con elementos visuales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar