de vb 6.0 a VB.NET
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
[#] Página Siguiente
[*] Página Anterior