de vb 6.0 a VB.NET

<< < (2/3) > >>

MaLkAvIaN_NeT:
¿Extrañas los arreglos de controles en VB.NET?
Bueno para muchos, los arreglos de controles en algunos casos nos daban eficacia y rapidez para programar, y cuando arrastré un Button a un formulario vb.net lo copie y volví a pegar para crear la matriz, pero me daba error, efectivamente no podían crearse, este VB.NET acaso no se equivocó al  quitar las matrices de controles, es menos eficaz programar cada button de 20 que recorrer cada uno de ellos con una matriz ?(esto es solo un supuesto, pues se podría hacer con un for each in me.controls) ,bueno hay que recordar que ya no hay controles, sino clases y que estamos en la POO. Bueno en verdad hubo un caso en que si necesitaba urgentemente usarlos y me puse a investigar de como hacerlo, me informe bien en el MSDN y aquí les doy un ejemplo de cómo crear un array de controles:

Aquí tratraremos nuevos conceptos:

Herencia en vb.net:
Código:

Public Class persona 'clase persona
    Dim nombre, telefono As String
    Dim edad As Integer
    Public Sub correr()

    End Sub
    Public Function devuelve_edad() As Integer
        Return edad
    End Function
End Class

Public Class alumno Inherits persona 'clase alumno
    Dim nro_matricula As String
End Class
Acabamos de crear dos clases persona y alumno que hereda de persona, la separamos en dos pues toda persona no tiene nro_matricula solo un alumno, consumiendo la clase:
Código:

Dim Renziño As New alumno
        Renziño.edad = 7
        Renziño.nro_matricula = "0001"
Como vemos creamos un objeto de la clase alumno el cual hereda el campo edad de persona.

Clase CollectionBase
Esta clase nos ayudará para crear una colección , -inflexible a tipos-

Código:

System.Collections.CollectionBase  ‘DETALLES DE LA CLASE
      [Visual Basic]
MustInherit Public Class CollectionBase
   Implements IList, ICollection, IEnumerable
[C#]
public abstract class CollectionBase : IList, ICollection,
   IEnumerable

Ahora nosotros creamos un proyecto y le agregamos una clase llamada DCArregloBotones y la haremos heredar de la clase CollectionBase, al cual le agregaremos unas cuantas funcionalidades que explicaré posteriormente.

Código:

Public Class ArregloBotones : Inherits System.Collections.CollectionBase

    Private pos_left As Integer
    Private pos_arriba As Integer
    Private formulario_fuente As System.Windows.Forms.Form

    Public Function NuevoBoton() As System.Windows.Forms.Button
        Dim aButton As New System.Windows.Forms.Button
        Me.List.Add(aButton)
        formulario_fuente.Controls.Add(aButton)
        aButton.Top = Me.pos_arriba
        aButton.Left = pos_left
        aButton.Tag = Me.Count
        aButton.Text = "Button " & Me.Count.ToString
        AddHandler aButton.Click, AddressOf ClickHandler
        Return aButton
    End Function
    Public Sub New(ByVal formulario As System.Windows.Forms.Form, ByVal left As Integer, ByVal top As Integer)
        pos_left = left
        pos_arriba = top
        formulario_fuente = formulario
    End Sub
    Public ReadOnly Property Item(ByVal Index As Integer) As _
       System.Windows.Forms.Button
        Get
            Return CType(Me.List.Item(Index), System.Windows.Forms.Button)
        End Get
    End Property
    Public Sub ClickHandler(ByVal sender As Object, ByVal e As _
       System.EventArgs)
        MsgBox("Hiciste click en " & CType(CType(sender, _
           System.Windows.Forms.Button).Tag, String))
    End Sub
End Class
Luego en el form1 que se creo por defecto probamos el code, para esto agregamos un button(cmd_add).
Dim cont As Integer = 20 ‘en general

Código:

Private Sub cmd_add_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_add.Click
Dim objControl As New ArregloBotones(Me, 100, cont)
cont += 20
objControl.NuevoBoton()
End Sub

Bueno probamos y vemos que se van agregando botones, cada botón está en un array y al hacer click en cualquiera nos mostrará su índice.

..ahora, creo que me referí a los constructores, aquí tenenemos un ejemplo:

Constructores
Código:

Public Sub New(ByVal formulario As System.Windows.Forms.Form, ByVal left As Integer, ByVal top As Integer)

Los constructores son la analogía a los Initialize de 6.0, pero nos da mas funcionalidad, en primer lugar podemos tener sobrecarga de constructores, es decir tener dos métodos con el mismo nombre pero con diferentes parámetros, también llamado polimorfismo y así al crear mi variable e instanciarla con la clase estaré activando el constructor:

Código:

Dim objControl As New ArregloBotones(Me, 100, cont)

Al instanciar el objeto objControl estoy llamando al constructor el cual requiere 3 parametros, puedo hacer la siguiente sobrecarga en la clase Agregabotones:

Código:

Public Sub New()

Y así al instanciar el objControl podré elegir entre usar los 3 parámetros o instanciar sin parámetros (que luego pueden asignarse desde otra manera).

Ahora tengo objControl que contiene un objeto formulario, en este caso este formulario lo asignamos en el constructor, luego ya en la clase creo objetos de la clase button y los agrego al formulario

Código:

Dim aButton As New System.Windows.Forms.Button
formulario_fuente.Controls.Add(aButton)

Luego agregamos los botones a la colección que heredo la clase, y asignamos los handles a cada control éste es un tema mas amplio bueno sender viene a ser el objeto con el que se está tratando ya sea button, combo ,etc. Y el e es el evento que ejecuta ya sea click, moumove,etc., si te preguntas porque use el msgbox fue porque no agregué las referencias de la clase message al componente.

MaLkAvIaN_NeT:
ALGUNOS OTROS TIPS

Ubicar el paht actual

El path , o el nombre del ejecutable entre otras cosas la obteníamos con app.exename, app.path
En vb.net tenemos la clase application:

Código:

Dim strRutaActual = Application.StartupPath
Dim NombreProyecto = Application.CompanyName

Obtener nombre de equipo.

Ya no tenemos que usar una api o incluir un socket para saberlo, en la version del .net 2005 basta con poner my.computername, incluso hay muchas otras opciones como para reproducir un audio, etc.
Esta manera es en la 2003 que es la que estoy usando

Código:

Dim ObjInfoSys As SystemInformation   
Dim strNombrePc = ObjInfoSys.ComputerName()

Llamar a un evento de algún control

Bueno si te ha sucedido de que quieres ejecutar las instrucciones que están en algún evento de un control, para no volver a escribir el code (en casos de que es dificultoso usar una function claro) tienes que llamar al evento.

En .net siempre hay que enviar el sender y el evento (eventargs) como parámetros, en la mayoría de casos se llaman al evento click y puedes hacerlo así:

Código:

Me.Button2.PerformClick()

Si quisieras llamar al evento click del button2
Si quieres hacerlo desde otro form a veces no te es permitido por el ámbito, para esto tienes que hacer lo siguiente
Al crear tu formulario y llenarlo de controles, internamente el .net va generando un codigo que guarda en una Rergion

Código:

#Region " Código generado por el Diseñador de Windows Forms "

En esta region crea los objetos y los ajusta a las propiedades que tu le hayas asignado en tiempo de diseño al crear por ejemplo un control hace:

Código:

Friend WithEvents Button2 As System.Windows.Forms.Button

Para que podamos acceder a métodos y objetos desde otro ámbito, tenemos que modificar esta línea en este código para que quede así:

Código:

Public Shared WithEvents Button2 As System.Windows.Forms.Button

Ejecutar procesos

Si en 6.0 queríamos ejecutar un proceso lo hacíamos con shell, si queríamos algo mas funcional y con mas amplitud teníamos que usar la api del shellexecute, ahora tenemos algo aún mas completo, fácil de usuar y con una variedad de nuevas opciones:

Código:

System.Diagnostics.Process.Start("e:\hola.html")


Listar procesos

Código:

System.Diagnostics.Process.GetProcesses

Probando cada clase de estos componentes podemos encontrar muchas cosas pues .net es tán amplio

Control de errores

Bueno si usaste java o un lenguaje a fin a éste sabras de que trata del try match, si no es así; recuerdas el control de errores en 6.0 ( on error go to mother fuck)
Básicamente Microsoft se basó en otros lenguajes para hacer esto, dicen que .net esta basado en delphy , otros dicen que Microsoft es un copión, y otros que aprende de los demás dejo a su albedrío la definición =), ahora vamos con el control de errores

Código:

Try
'sentencias
Catch ex As Exception
'si las sentencias dan error
Finally
'instrucciones que se ejecuten
'siempre al finalizar la trama
'en un ejemplo anterior lo expliqué mejor
End Try
Ahora te preguntarás porqué al producirse errores no controlados el sistema no nos especifica mucho el error, es por seguridad , pues si un atacante husmera nuestro sistema le provocaría errores intencionalmente para que el sistema le venda información técnica de lo que pasa internamente y así conocerlo y poder planear ataques, en 6.0 nos especificaba el error aquí no, pero si quieres saberlo lo haces así:
Código:

Catch ex As Exception
MessageBox.Show(ex.Message)

Si estás en algún componente quizás tengas error al usar el messagebox, pues no tienes las referencias, puedes optar por el msgbox o agregarlas.


Manipular Fechas en vb.net
Código:

Bueno creo que éste ejemplo lo dirá todo:
Public Function CalcularEdad(ByVal Año As Integer, ByVal Mes As Int16, ByVal Dia As Int16) As Integer
        Dim fecha As Date
        Dim dia_a As Int16 = fecha.Today.Day
        Dim mes_a As Int16 = fecha.Today.Month
        Dim año_a As Integer = fecha.Today.Year
        If Año < año_a Then
            If Mes > mes_a Then
                Return (año_a - Año) - 1
            ElseIf Mes = mes_a Then
                If Dia < dia_a Then
                    Return (año_a - Año) - 1
                ElseIf Dia >= dia_a Then
                    Return (año_a - Año)
                End If
            ElseIf Mes < mes_a Then
                Return (año_a - Año)
            End If
        End If
    End Function

La función anteriormente muestra como obtener el mes, año, día actual, también podrían obtenerse horas.

MaLkAvIaN_NeT:
Usar el registro de Windows desde VB.NET

Bueno para un buen uso del registro hay que conocer la clase regestry, este nos permite tener acceso a claves, subclaves y valores del registro, si conocemos el registro de Windows sabemos o habremos visto las raíces de las claves son
HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE , entre otros. En la clase Regestry éstos pueden pueden ser asignados como campos que pueden ser:
CurrentUser.- Almacena información sobre las preferencias de usuario.
LocalMachine.-Almacena información de configuración correspondiente al equipo local.
ClassesRoot .-Almacena información sobre los tipos (y clases) y sus propiedades.
Users .-Almacena información sobre la configuración de usuario predeterminada.
PerformanceDataAlmacena información del rendimiento de los componentes de software.
CurrentConfig .-Almacena información de hardware no específica del usuario.
DynData .-Almacena datos dinámicos.

La clase RegestryKey.- no encuentro el término exacto para describir esta clase, pero en la ayuda la representa como un nodo de cierta clave, bueno como siempre he dicho no hay nada como mirar el code, este ejemplo crea una nueva clave:

Código:

Dim objRegistro As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser
objRegistro.CreateSubKey("javier")

…como se muestra creo un objeto de la clase RegistryKey que viene a ser un nodo de la clave registry.CurrentUser, luego utilizo el método CreateSubKey para agregar una nueva clave llamada Javier, no confundan una clave con un valor

Bueno para que no se confundan agreguemos un valor a la clave Javier (este code lo agregamos al anterior):

Código:

Dim objValor As Microsoft.Win32.RegistryKey = objRegistro.OpenSubKey("javier")
objValor.SetValue("apellidos", "ulloa sernaque")

si queremos ahorrar code lo hubiésemos hecho así:

Código:

Dim objRegistro As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("javier")
objRegistro.SetValue("apellido", "ulloa")

El siguiente ejemplo muestra las aplicaciones que se inician con el sistema operativo

Código:

Dim objRegistro As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run")
For Each valor As String In objRegistro.GetValueNames
Dim tmpRegistro As Microsoft.Win32.RegistryKey = objRegistro
MessageBox.Show(tmpRegistro.GetValue(valor))
Next

algunos códigos

función que valida que en un form se ingresen datos requeridos

Código:

   Public Function ingreso_datos_completos(ByVal objFrm As Windows.Forms.Form) As Boolean
        'LOS textbox,combos que tengan el tag con el valor="*" son requeridos
        Dim objCtl As Control
        For Each objCtl In objFrm.Controls
            If TypeOf objCtl Is TextBox Or TypeOf objCtl Is ComboBox And objCtl.Tag = "*" Then
                If objCtl.Text = "" Then Return False
            End If
        Next
        Return True
    End Function

funcion comprueba ataque sql injector
Código:

   Public Function comprueba_ataque_sql_injector(ByVal str_usuario As String) As Boolean
        With str_usuario
            If .Substring(.TrimEnd.Length - 2) = "--" Then
                Return True
            End If
        End With
        Return False
    End Function

sub que carga una listview mand´andole un registro (sqldatareader)

Código:

Public Sub cargar_listview(ByVal objlstv As ListView, ByVal registro As SqlClient.SqlDataReader)
        With objlstv
            .Columns.Clear()
            .Items.Clear()
            .GridLines = True
            .View = View.Details
            .FullRowSelect = True
        End With
        Dim i As Int16, objItem As ListViewItem
        With registro
            For i = 0 To .FieldCount - 1
                objlstv.Columns.Add(.GetName(i), 100, HorizontalAlignment.Center)
            Next

            Do While .Read
                objItem = objlstv.Items.Add(registro(0))
                For i = 1 To .FieldCount - 1
                    If TypeOf (registro(i)) Is Date Then
                        objItem.SubItems.Add(CStr(registro(i)))
                    Else
                        If TypeOf (registro(i)) Is String Then
                            objItem.SubItems.Add(registro(i))
                        Else
                            objItem.SubItems.Add(registro(i).ToString)
                        End If

                    End If
                Next
            Loop
            registro.Close()
        End With
    End Sub

sub que carga un combo enviándole un registro

Código:

    Public Sub CargarCombo(ByVal str_Registro As String, ByVal myCombo As ComboBox, ByVal CampoPrincipal As String, ByVal CampoSecundario As String, ByVal conexion As SqlClient.SqlConnection)
        Dim oTablaCargo As New DataTable
        Dim DACargo As New SqlClient.SqlDataAdapter(str_Registro, conexion)
        Try
            DACargo.Fill(oTablaCargo)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

        myCombo.DataSource = oTablaCargo
        myCombo.ValueMember = CampoPrincipal
        myCombo.DisplayMember = CampoSecundario
    End Sub

MaLkAvIaN_NeT:
Arquitecturas .NET

http://www.microsoft.com/spanish/msdn/arquitectura/das/distapp.asp


Acerca de las aplicaciones Cliente – Servidor en el futuro con .NET

Se predice un futuro con PC domésticas que incluyan al NET framework como un componente indispensable en el sistema operativo, como sabemos cualquier aplicación creada en .NET necesita tener como base el marco de trabajo NET framework para consumir las librerías indispensables y funcionar, entonces nos olvidaríamos de la programación de grandes API en nuestro código, ya no tendríamos que conocer el Socket Master a perfección para crear un buen Server para tu troyano (aunque se recomienda empezar con el para tener una idea sustancial de lo que el .NET hace internamente y no dejar de que las cosas nos las hagan “fáciles”) .
Bueno quizás cuando tenga un poco mas de tiempo termine este manual profundizando más en Sóckets



BADBYTE-K:
Excelente aporte, se ha ganado una chincheta sin dudar.

Considero que es muy importante que desarrolladores vb6 aprendan algunos de los tips y conceptos que MaLkAvIaN_NeT menciona aqui.

Y pues ademas deben tener en cuenta que como informaticos debemos aceptar cambios, por supuesto cambios que vengan para bien y este es el caso de .net.

No es lujo, no es "querer estar a la vanguardia" actualizarse a .NET, en realidad podria considerarse como una necesidad lo cual nos permite seguir desarrollando soluciones adecuadas en este mundo tan globalizado de hoy en dia.


saludos

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior