none
Como puedo validar para que no se salga del form y no haga nada el form ? RRS feed

  • Pregunta

  • saludos amigos, les traigo un inconveniente, la variable resgistros es un array string, el el valo 0 esta almacenada la cantidad de registros del sql, en el valor 1 esta el nombre del empleado y en el 2 esta la ruta de la imagen del empleado, hasta todo claro, bueno he estado como 3 horas dandole vueltas al asunto para usar una forma de validar el if, en tabla empleados existen solo 4 empleados, cuando ejecuto el programa se queda en el 5, el error que me vota es:

    El programa '[12884] Sistema de Facturacion v.2016.1.0.vshost.exe' terminó con código -1073741819 (0xc0000005) 'Access violation'.

    lo que quiero hacer es poner las imagenes de los empleados en un form y son como maximo 12 imagenes, osea 12 empleados, a continuacion les dejo el codigo porfavor si me pueden ayudar ya que llevo 3 horas en lo mismo y nada, gracias de antemano,

    rudolf heiner.

            If registros(0, 1).ToString.Length <> 0 Then
                lblNomEmp1.Text = registros(1, 1)
                pbEmpleado1.ImageLocation = registros(2, 1)
                pbEmpleado1.Enabled = True
            Else
                pbEmpleado1.Enabled = False
            End If
            If registros(0, 2).ToString.Length <> 0 Then
                lblNomEmp2.Text = registros(1, 2)
                pbEmpleado2.ImageLocation = registros(2, 2)
                pbEmpleado2.Enabled = True
            Else
                pbEmpleado2.Enabled = False
            End If
            If registros(0, 3).ToString.Length <> 0 Then
                lblNomEmp3.Text = registros(1, 3)
                pbEmpleado3.ImageLocation = registros(2, 3)
                pbEmpleado3.Enabled = True
            Else
                pbEmpleado3.Enabled = False
            End If
            If registros(0, 4).ToString.Length <> 0 Then
                lblNomEmp4.Text = registros(1, 4)
                pbEmpleado4.ImageLocation = registros(2, 4)
                pbEmpleado4.Enabled = True
            Else
                pbEmpleado4.Enabled = False
            End If
            If registros(0, 5).ToString.Length <> 0 Then
                lblNomEmp5.Text = registros(1, 5)
                pbEmpleado5.ImageLocation = registros(2, 5)
                pbEmpleado5.Enabled = True
            Else
                pbEmpleado5.Enabled = False
            End If
            If registros(0, 6) <> "0" Then
                lblNomEmp6.Text = registros(1, 6)
                pbEmpleado6.ImageLocation = registros(2, 6)
                pbEmpleado6.Enabled = True
            Else
                pbEmpleado6.Enabled = False
            End If
            If registros(0, 7) <> "0" Then
                lblNomEmp7.Text = registros(1, 7)
                pbEmpleado7.ImageLocation = registros(2, 7)
                pbEmpleado7.Enabled = True
            Else
                pbEmpleado7.Enabled = False
            End If
            If registros(0, 8) <> "0" Then
                lblNomEmp8.Text = registros(1, 8)
                pbEmpleado8.ImageLocation = registros(2, 8)
                pbEmpleado8.Enabled = True
            Else
                pbEmpleado8.Enabled = False
            End If
            If registros(0, 9) <> "0" Then
                lblNomEmp9.Text = registros(1, 9)
                pbEmpleado9.ImageLocation = registros(2, 9)
                pbEmpleado9.Enabled = True
            Else
                pbEmpleado9.Enabled = False
            End If
            If registros(0, 10) <> "0" Then
                lblNomEmp10.Text = registros(1, 10)
                pbEmpleado10.ImageLocation = registros(2, 10)
                pbEmpleado10.Enabled = True
            Else
                pbEmpleado10.Enabled = False
            End If
            If registros(0, 11) <> "0" Then
                lblNomEmp11.Text = registros(1, 11)
                pbEmpleado11.ImageLocation = registros(2, 11)
                pbEmpleado11.Enabled = True
            Else
                pbEmpleado11.Enabled = False
            End If
            If registros(0, 12) <> "0" Then
                lblNomEmp12.Text = registros(1, 12)
                pbEmpleado12.ImageLocation = registros(2, 12)
                pbEmpleado12.Enabled = True
            Else
                pbEmpleado12.Enabled = False
            End If

    domingo, 14 de febrero de 2016 20:05

Respuestas

  • El problema está en la clase Empleado:

    Public Class empleado
    
        Friend Class Empleado
            Property Nombre As String
            Property Ruta As String
        End Class
    
    End Class

    Estás definiendo una clase "Empleado" dentro de otra clase "empleado".

    Deberías dejarlo como:

    Public Class Empleado
    
        Property Nombre As String
        Property Ruta As String
    
    End Class

    La diferencia de declararla como Public o como Friend es que, si la defines como Public, la clase puede ser utilizada desde otros ensamblados (desde otros proyectos), mientras que si la defines como Friend, únicamente puede ser utilizada dentro del propio proyecto.

    Cualquiera de las dos te va a funcionar. Aunque "las buenas prácticas de programación" marcan que se debería utilizar el más restrictivo posible. Es decir, si no tienes intención de utilizar la clase fuera del proyecto en el que se encuentra declararla como Friend.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta Rudolf Heiner lunes, 15 de febrero de 2016 10:53
    lunes, 15 de febrero de 2016 10:41

Todas las respuestas

  • Hola Rudolf,

    realmente no tengo claro que el array de strings sea la estructura de datos idónea para tu caso.

    ¿Cómo montas el array?


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    domingo, 14 de febrero de 2016 20:20
  • Aqui es donde monto el array:


      Public Function GetEmpleados()

            Dim cantreg As Integer

            'Calculamos la cantidad de registros
            nue_var.consulta = "SELECT COUNT(*) As cantreg FROM empleados WHERE pais = '" & Sys_Pais & "' AND empresa = '" & Sys_Cia & "'"

            nue_conexion.conectar()
            nue_var.cmd = New MySqlCommand(nue_var.consulta, nue_conexion.conex())
            nue_var.dr = nue_var.cmd.ExecuteReader()

            Do While nue_var.dr.Read
                cantreg = nue_var.dr("cantreg")
            Loop

            nue_var.dr.Close()
            nue_conexion.desconectar()

            'Cargamos el array con los registros
            Dim i As Integer
            Dim registros(2, cantreg) As String

            nue_var.consulta = "SELECT nombre, rutaimagen FROM empleados WHERE pais = '" & Sys_Pais & "' AND empresa = '" & Sys_Cia & "'"

            nue_conexion.conectar()
            nue_var.cmd = New MySqlCommand(nue_var.consulta, nue_conexion.conex())
            nue_var.dr = nue_var.cmd.ExecuteReader()

            i = 1
            Do While nue_var.dr.Read

                registros(0, i) = cantreg.ToString
                registros(1, i) = nue_var.dr("nombre").ToString
                registros(2, i) = nue_var.dr("rutaimagen").ToString

                i = i + 1
            Loop

            nue_var.dr.Close()
            nue_conexion.desconectar()

            Return registros

        End Function

    domingo, 14 de febrero de 2016 20:49
  • Vale te comento cómo lo haría yo.

    En primer lugar me crearía una clase Empleado para mantener los datos de cada empleado, esto, entre otras cosas, mejorará mucho la legibilidad del código:

        Friend Class Empleado
            Property Nombre As String
            Property Ruta As String
        End Class
    

    En la función GetEmpleados haría una única consulta, no tiene sentido hacer dos consultas (una para recuperar el número de registros y otra para obtener los registros), con la segunda es suficiente, con contar el número de registros del segundo resultado ya tendrías el dato que te da el primero.

    Por otro lado siempre, por diversas razones (legibilidad, seguridad, rendimiento...) es conveniente utilizar parámetros en las consultas en lugar de concatenar los valores directamente en ésta.

    Como resultado de la función devolvería una colección de elementos Empleado.

        Public Function GetEmpleados() As IEnumerable(Of Empleado)
            nue_var.consulta = "SELECT nombre, rutaimagen FROM empleados WHERE pais = @pais AND empresa = @empresa"
            nue_conexion.conectar()
            nue_var.cmd = New MySqlCommand(nue_var.consulta, nue_conexion.conex())
            nue_var.cmd.Parameters.AddWithValue("@pais", Sys_Pais)
            nue_var.cmd.Parameters.AddWithValue("@empresa", Sys_Cia)
            nue_var.dr = nue_var.cmd.ExecuteReader()
            Dim empleados As New List(Of Empleado)
            Do While nue_var.dr.Read
                empleados.Add(New Empleado With { _
                            .Nombre = nue_var.dr("nombre").ToString, _
                            .Ruta=nue_var.dr("rutaimagen").ToString})
            Loop
            nue_var.dr.Close()
            nue_conexion.desconectar()
    
            Return empleados
         End Function
    


    En la función en la que asignas valores a los controles sí que utilizaría arrays para tener una lista de los controles a actualizar.

    De esta forma puedes recorrer con el mismo índice los arrays de los controles y la colección devuelta por la función GetEmpleados:

            Dim labelsEmpleados() As Label = { lblNomEmp1, lblNomEmp2, lblNomEmp3, lblNomEmp4, lblNomEmp5, lblNomEmp6, lblNomEmp7, lblNomEmp8, lblNomEmp9, lblNomEmp10, lblNomEmp11, lblNomEmp12 }
            Dim pictureEmpleados() as PictureBox = { pbEmpleado1, pbEmpleado2, pbEmpleado3, pbEmpleado4, pbEmpleado5, pbEmpleado6, pbEmpleado7, pbEmpleado8, pbEmpleado9, pbEmpleado10, pbEmpleado11, pbEmpleado12 }
            Dim empleados As IEnumerable(Of Empleado) = GetEmpleados()
            For i As Integer = 0 To empleados.Count() - 1
                labelsEmpleados(i).Text = empleados(i).Nombre
                pictureEmpleados(i).ImageLocation = empleados(i).Ruta
                pictureEmpleados(i).Enabled = True
            Next

    Si necesitas alguna aclaración sobre alguna parte del código me comentas.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    domingo, 14 de febrero de 2016 21:15
  • saludos Asier, una pregunta, tengo mi clase que se llama vfacturas y el form atencionalcliente, lo cual en la clase vfacturas tendria que poner los codigos y en atencionalcliente los resultados, dime como haria para poner los codigos que me enviaste, en donde irian todos los codigos, solo eso quiero que me aclares, quedo de ti, saludos,

    rudolf heiner.

    lunes, 15 de febrero de 2016 9:27
  • Hola Rudolf,

    la clase Empleado debería ser una clase independiente de la clase vfacturas. Puedes ponerla en un archivo separado Empleado.vb. Aunque ahora mismo sólo tendría 4 líneas, imagino que según vayas desarrollando tu aplicación irá creciendo.

    La función GetEmpleados debería reemplazar a la que utilizas ahora. Podrías convertirla a una función Shared dentro de la clase Empleado de forma que pudieses invocarla desde cualquier punto de tu aplicación con Empleado.GetEmpleados(). Aunque para ello deberías pasarle como parámetro el objeto para realizar la conexión a la base de datos.

    El último código, el que carga el resultado en los controles, sí debería ir en el formulario.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 15 de febrero de 2016 10:09
  • hola Asier, mira asi queda mi codigo, el de la clase empleado:

    Public Class empleado

        Friend Class Empleado
            Property Nombre As String
            Property Ruta As String
        End Class

    End Class

    el getempleados asi:

        Public Function GetEmpleados() As IEnumerable(Of empleado)
            nue_var.consulta = "SELECT nombre, rutaimagen FROM empleados WHERE pais = ?pais AND empresa = ?empresa"
            nue_conexion.conectar()
            nue_var.cmd = New MySqlCommand(nue_var.consulta, nue_conexion.conex())
            nue_var.cmd.Parameters.Add("?pais", MySql.Data.MySqlClient.MySqlDbType.VarChar).Value = Sys_Pais
            nue_var.cmd.Parameters.Add("?empresa", MySql.Data.MySqlClient.MySqlDbType.VarChar).Value = Sys_Cia
            nue_var.dr = nue_var.cmd.ExecuteReader()
            Dim empleados As New List(Of empleado)
            Do While nue_var.dr.Read
                empleados.Add(New empleado With { _
                    .Nombre = nue_var.dr("nombre").ToString, _
                    .Ruta = nue_var.dr("rutaimagen").ToString})
            Loop
            nue_var.dr.Close()
            nue_conexion.desconectar()

            Return empleados

        End Function

    y para mostar los resultados asi :

            Dim labelsEmpleados() As Label = {lblNomEmp1, lblNomEmp2, lblNomEmp3, lblNomEmp4, lblNomEmp5, lblNomEmp6, lblNomEmp7, lblNomEmp8, lblNomEmp9, lblNomEmp10, lblNomEmp11, lblNomEmp12}
            Dim pictureEmpleados() As PictureBox = {pbEmpleado1, pbEmpleado2, pbEmpleado3, pbEmpleado4, pbEmpleado5, pbEmpleado6, pbEmpleado7, pbEmpleado8, pbEmpleado9, pbEmpleado10, pbEmpleado11, pbEmpleado12}
            Dim empleados As IEnumerable(Of Empleado) = nue_fac.GetEmpleados()

            For i As Integer = 0 To empleados.Count() - 1
                labelsEmpleados(i).Text = empleados(i).Nombre
                pictureEmpleados(i).ImageLocation = empleados(i).Ruta
                pictureEmpleados(i).Enabled = True
            Next

    ahora tiene errores porque creo que no invoco a la clase Empleado, como podria invocar la clase tanto para el getempleados y para mostrar los resultados ? quedo de ti y gracias,

    rudolf heiner.

    lunes, 15 de febrero de 2016 10:26
  • El problema está en la clase Empleado:

    Public Class empleado
    
        Friend Class Empleado
            Property Nombre As String
            Property Ruta As String
        End Class
    
    End Class

    Estás definiendo una clase "Empleado" dentro de otra clase "empleado".

    Deberías dejarlo como:

    Public Class Empleado
    
        Property Nombre As String
        Property Ruta As String
    
    End Class

    La diferencia de declararla como Public o como Friend es que, si la defines como Public, la clase puede ser utilizada desde otros ensamblados (desde otros proyectos), mientras que si la defines como Friend, únicamente puede ser utilizada dentro del propio proyecto.

    Cualquiera de las dos te va a funcionar. Aunque "las buenas prácticas de programación" marcan que se debería utilizar el más restrictivo posible. Es decir, si no tienes intención de utilizar la clase fuera del proyecto en el que se encuentra declararla como Friend.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta Rudolf Heiner lunes, 15 de febrero de 2016 10:53
    lunes, 15 de febrero de 2016 10:41
  • Hola Asier, mil gracias ya funciona como me dijiste, muchas gracias por al ayuda, si tengo otro inconveniente te preguntare ok, muchas gracias de nuevo, saludos,

    rudolf heiner.

    lunes, 15 de febrero de 2016 10:53