de vb 6.0 a VB.NET

Iniciado por MaLkAvIaN_NeT, 13 Junio 2006, 00:00 AM

0 Miembros y 2 Visitantes están viendo este tema.

MaLkAvIaN_NeT

...Bien a raíz de un comentario en algún post, es porque decidí escribir este manual

CitarEl hecho de que conozcas visual Basic 6.0 no te garantiza que sepas nada en visual basic.net.

..A decir verdad Vb 6.0 fue uno de los lenguajes con el que me inicié, y como tal resultó un poco reacio probar posteriormente con otros lenguajes como C++, Pascal, .NET, Delphy, php, etc. y este manual trata de ilustrar potencialmente como migré a .NET, y las preguntas que me fui haciendo y poco a poco logrando despejarlas.

Acerca de la tecnología .NET Y Microsoft
Cada día Microsoft se mete más y más entre nosotros, la mayoría de usuarios domésticos usan su plataforma, los usuarios no experimentados desconocen de otros S.O., no piensen que estoy en contra de Microsoft o en favor, tampoco quiero decir que estoy en contra de la tecnología ni proclamando que la X tecnología sea la mejor, simplemente quiero dar a entender de que hay que estar a la vanguardia con las nuevas tecnologías para no quedar desfasados, ahora tenemos la tecnología .NET que según expertos dará mucho que hablar; proporcionándonos un nuevo modelo de programación orientado al gran mundo del Internet y a los smart client.

Acerca del desarrollador 5 estrellas
Una de las principales razones por la que se inició el programa 5 estrellas es el marketing, que es emprendendido por compañías comerciales de software, en este caso tenemos a Microsoft que no encuentra mejor manera de hacer probar su nuevo producto, capacitando a los que deciden incursionar en él para que pronto esta nueva tecnología se convierta en una necesidad de todo usuario inmerso en la globalización, este programa ofrece buenas ventajas desde el punto de vista que te facilita mucha documentación, foros de desarrollo y discusión, webcast en línea, etc.  También son buenas las certificaciones que puedes obtener. 

Algunos enlaces:
MSDN
http://msdn.microsoft.com/library/spa/
Ineta:
http://www.ineta.org/latam/

PD. Todo lo que escribo aquí no es más que un punto de vista personal.
a por las buenas ideas

MaLkAvIaN_NeT

Acerca del NET Framework
Bueno si eres nuevo en la tecnología .NET te preguntarás para que fuck se tuvo que inventar este marco de trabajo, bueno hay muchas razones entre unas de las principales son;
como sabrán un lenguaje que a dado mucho que hablar a sido Java por ser orientado a objetos y sobretodo por ser multiplataforma, sabemos que java necesita un motor de apoyo al cual conocemos como Virtual Machine, con el tiempo mucha gente optaba por elegir esa tecnología desplazando las propuestas de etiqueta Microsoft; el cual se vio forzado a hacer algo al respecto, empezaron con un lío judicial en el que Microsoft quería dejar impotente al Virtual Machine dentro de sus plataformas, y no logrando hacerlo.  Luego apareció el NET Framework que análogamente sería algo como el Virtual Machine y que buscaría desplazarlo.
Otra razón es que la tecnología .NET está pensada para el gran mundo distribuido... la INTERNET, mundo que se ha convertido en una necesidad del hombre actual y no es fundamental una PC para entrar al él, podemos hacerlo desde un Pocket PC, un móvil , etc. y  .NET también pensó en esto.
Ahora veamos que es el Net framework.- Aquí no pienso explayarme tanto pues no cuesta nada entrar a tu browser > digitar 'define: NET framework' > search   y marearte con tanto resultado, yo sólo te explico lo que entiendo.
Sencillamente diría que cualquier aplicación escrita en .NET no podría correr si no está instalado el NET framework, ahora yo si podría programarme una aplicación consola en un block de notas y compilarla con el NET Framework y correrla no necesitando tener instalado el .NET. dentro del framework tenemos:
-Biblioteca de clases: abarca interfaces, tipos y clases; que pueden ser usadas en cualquiera de los lenguajes soportados (usando el CLS que es algo así como un traductor); sobre esto es que se construyen las aplicaciones, componentes, controles de .NET, etc.  Aki tampoco podemos dejar de mencionar al espacio de nombres System al cual conocemos como tipo de datos, los más usuales en 6.0 eran Integer, Boolean, string, double.  Hay tipos que no existen como el variant  pero que podríamos sustituir con Object, y ahora hay que tener en cuenta que por ejemplo un integer no es simplemente un tipo de dato sino una clase al igual que las demás, en la clase integer entran a tallar otros conceptos como el unsigned que nos recurda al C++, así tenemos dentro de la categoría enteros la clase byte que es un entero de 8 bits sin signo, tenemos el int16, int32 de 16 y 32 bits con signo, así como uint16, uint32 sin signo. Ahora como podemos usarlos
Si por ejemplo declaro una variable contador que no almacenara un valor muy grande uso int16 para ahorrar memoria pues cada variable ocupa un espacio en ella.
Dim intCont as system.int16=0 'inicializo en 0
intCont +=1 'esto sería lo mismo que intCont=intCont+1
'
Messagebox.show("El valor de contador es" & intCont.tostring)

Como vimos; se instancia un objeto intCont de la clase int16 el cual adopto todos los métodos y propiedades de dicha clase, uno de esos métodos es tostring que haría lo mismo que hacer un cstr(intCont)
-ADO.NET, un tema muy amplio, la nueva evolución de ADODB incluyendo mejor performance entre nuestros sistemas de información, mas seguridad y mejor interoperabilidad con el gestor de BD, plataforma y demás.
-ASP.NET, la tecnología active service page a evolucionado ayudándonos en algunos puntos del asp convencional, y posiblemente sea el futuro de las aplicaciones, optimizado para trabajar con el IIS.
-entre otros como:
Ensamblados
http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art109.asp
Comon Lenguaje Runtime
http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art80.asp
GDI+
http://www.elguille.info/colabora/puntoNET/tutGDI/indice.htm
.Net remoting
http://www.microsoft.com/spanish/msdn/articulos/archivo/091101/voices/remoting.asp
WMI
http://www.elguille.info/colabora/NET2005/juanlosa_ArticuloWMI.htm
Servicio XML y otros WEB Services
http://web-services.bankhacker.com/

una ventaja: cuando se programaba en 6.0 y por ejemplo empleábamos el control toolbar en el Server de nuestro troyano, y queríamos redistribuir nuestra aplicación teníamos que registrar la dll u ocx MSCOMCTL, u optar por generar el instalador. Ahora solo vasta con tener instalado el framework para usar dicha clase, y la desventaja de esto sería que los usuarios domésticos no tienen necesidad de instalar el NET Framework

a por las buenas ideas

MaLkAvIaN_NeT

#2
Crear una aplicación consola desde un block de notas

...Bien como dije hace poco teniendo instalado el Net Framework puedo crear una aplicación de cualquier lenguaje de .NET en un notepad, ahora veamos un ejemplo, para este ejemplo necesitas saber la ruta donde está tu NET Framework (x ejemplo C:\WINDOWS\Microsoft.NET\Framework\) , en este path vemos que versión de Framework tenemos instalado si tenemos el 1.1 encontraremos algo así v1.1.4322, y si tenemos el 2 sería: v2.0.50727. ahora abrimos la consola y entramos al path por ejemplo a C:\WINDOWS\Microsoft.NET\Framework\ v1.1.4322.
Abrimos el notepad y ponemos el siguiente code:
Imports System
Public Class Prueba
 Public Shared Sub Main()
   Dim I as Integer
   For I=1 To 10
      Console.Writeline(I)
   Next I
      Console.Read
 End Sub
End Class

Luego lo guardamos como prueva.vb en la carpeta del Framework.
Ahora entramos a la ventana de comandos y compilamos con el siguiente comando VBC Prueba.vb, ahora vemos que se genera un


Como se ve en la imagen estoy usando la versión de framework 1.1 porque ahora tengo el .NET 2003.
Luego de haberlo compilado se genera un exe y es el que podemos ejecutar.

Tambíen con C#

{
   public static int main (void)
   {
       System.Console.WriteLine ("hola mundo");
       return 0;
   }
}
luego la compilas
csc /target:exe /out:Demo.exe Demo.cs
a por las buenas ideas

MaLkAvIaN_NeT

Acerca de los lenguajes que soporta en el Net Framework Entre los lenguajes soportados tenemos a C#, Visual Basic,C++, J# ,Perl, Pyton, Fortran, Cobol entre otros,,, cómo podemos elegir por algún lenguaje de .NET, si programaste en VB6.0 puedes migrar a VB.NET, si usabas C puedes usar C# si usabas Java puedes optar por J#.

CitarEl hecho de que conozcas visual Basic 6.0 no te garantiza que sepas nada en visual basic.net.

Esto se da porque vb.net es un lenguaje mixto y puede soportar dicha sintaxis, pero si programamos en vb.net como 6.0 sería desperdiciar todo lo que nos brinda.

VB .NET es la nueva versión de VB 6.0?

VB.net cambió completamente la filosofía de programación en 6.0 pero pensó que no sería tan conveniente crear un lenguaje netamente de objetos con un estilo diferente, no hay que creer que forzó la programación estructurada a POO, la creó basándose en una sintaxis conocida por el programador  de 6.0 y le dio flexibilidad para soportar la programación estructurada, pero en .NET hay que tener en cuenta que en VB.NET:

no hay controles hay clases, no hay variables hay objetos, hay optional pero es mejor la sobrecarga, puedes usar composición pero existe la herencia, no hay Initialize use los constructores, olvídese de los caption ahora los objetos tendrán la propiedad text, si quiere finalizar una clase busque el método dispose.

Creo que un code es mejor que cualquier prolija explicación, para este code creamos un nuevo proyecto y agregamos una clase:


Imports System.Windows.Forms

Public Class objForm : Inherits Form
    Dim Cont As System.Int32 = 1
    Public Sub New()
        Me.Text = "Formulario"
    End Sub
    Public Sub New(ByVal strTitulo As String)
        Me.Text = strTitulo & " " & Me.Cont.ToString
        cont += 1
    End Sub
    Public Overloads Sub Dispose()
        MessageBox.Show("acabas de hacer dispose a " & Me.Text)
        Me.cont = 0
        MyBase.Finalize()
    End Sub
End Class

Esta clase no es más que un formulario personalizado, que hereda de la clase Windows.form por tanto hereda todo los métodos y propiedades, ahora tenemos el constructor (new) que emplea la sobrecarga(un New sin parámetro y el otro con el parámetro strTitulo), al crear un objeto con ésta clase podemos elegir a si instanciar un objeto con el título del formulario definido o por defecto.
También le agregamos un sub Dispose que vendría a ser como un Unload, pero como la clase padre de la que heredamos ya tiene un método dispose, lo que hacemos es sobrecargarlo utilizando el término Overloads.
Public Class botonDestruyeForm : Inherits Windows.Forms.Button
    Private tmp_Form_a_destruir As objForm
    Public Property form_a_destruir() As objForm
        Get
            Return Me.tmp_Form_a_destruir
        End Get
        Set(ByVal Value As objForm)
            Me.tmp_Form_a_destruir = Value
        End Set
    End Property
    Public Sub Cerrar(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Click
        Me.tmp_Form_a_destruir.Dispose()
    End Sub
End Class

La clase botonDestruyeForm hereda de la clase button, tiene un objeto tmp_form_a_destruir de la clase objForm (este objeto viene a ser el formulario desde donde se instancian los objetos de la clase botonDestruyeForm, osea el ME) este objForm puede ser asignado y leido a través de la property form_a_destruir.
Luego programamos el evento click del button personalizado (botonDestruyeForm) en el cual ponemos la linea:
Me.tmp_Form_a_destruir.Dispose()
Que hace un llamado al sub que creamos en la clase del formulario personalizado(form):
Public Overloads Sub Dispose()

Ahora estamos listos para probar nuestras clases, para esto en el form inicial agregamos un button y en ponemos lo siguiente:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     Dim x As New objForm("Algunos tips .NET")
        x.Size = New Size(400, 100)
        x.Location = New Point(8, 8)
        x.Show()
        Dim objBotonDestruyeForm As New botonDestruyeForm
        objBotonDestruyeForm.Location = New Point(20, 9)
        objBotonDestruyeForm.Size = New Size(300, 20)
        objBotonDestruyeForm.Text = "Dispose a " & x.Text
        objBotonDestruyeForm.form_a_destruir = x
        x.Controls.Add(objBotonDestruyeForm)
    End Sub


Bien ahora tenemos un concepto mejor de lo que es herencia(especificaré esto mejor mas adelante) y como podemos crear objetos que hereden de las clases del net framework (form, button), usamos la sobrecarga de los métodos que traen dichas clases en las nuevas que creamos, como usar el dispose.

a por las buenas ideas

MaLkAvIaN_NeT

#4
Tengo buenos códigos probados y re-probados en 6.0 para qué volverlos a hacer en .NET?

Bueno sería recomendable migrar el código, existen asistentes de migración de código  que nos facilitan el trabajo, y también podemos usar componentes 6.0 en alguna aplicación .NET esto significa que creamos una dll en 6.0 y luego la agrego a las referencias de mi aplicación y la uso como si fuese un componente mas de mi aplicación, hasta allí no hay problemas pero si deseo transportar mi proyecto con la dll de 6.0 hay que registrarla (regsvr32 /u 'directorio'*.dll) o generar el instalador sin embargo a veces he experimentado conflictos inesperados, pero temporales si encuentras la solución.

Utilizando componentes 6.0 en .NET
Bien abrimos el 6.0 elegimos un proyecto DLL ActiveX y en la clase que genera ponemos esto:

este code esta escrito en 6.0, lo baje de una página en donde figura como autor  Javier de la Cruz - 21/11/2005 - dela.javi(at)gmail(dot)com  

Option Explicit
Public Function cifra(UnaCadena As String, UnaLlave As String) As String
   Dim CadenaResultante As String
   Dim i                As Long
   Dim Llave()          As Integer
       If (Not UnaCadena = "") And (Not UnaLlave = "") Then
       If GeneraLlave(UnaLlave, Llave()) Then
           For i = 1 To Len(UnaCadena)
               CadenaResultante = CadenaResultante & Chr(Llave(i Mod (Len(UnaLlave) - 1), Asc(Mid(UnaCadena, i, 1))))
           Next
       Else
           MsgBox "La llave debe tener al menos dos caracteres.", vbError, ""
       End If
   End If
       cifra = CadenaResultante
End Function
Public Function descifra(UnaCadena As String, UnaLlave As String) As String
     Dim CadenaResultante As String
   Dim i                As Long
   Dim Llave()          As Integer
   Dim Posicion         As Integer
   If Not UnaCadena = "" Then
       If GeneraLlave(UnaLlave, Llave()) Then
           For i = 1 To Len(UnaCadena)
               Posicion = Asc(Mid(UnaCadena, i, 1)) - Llave(i Mod (Len(UnaLlave) - 1), 0)
               If Posicion > 0 Then
                   CadenaResultante = CadenaResultante & Chr(Posicion)
               Else
                   CadenaResultante = CadenaResultante & Chr(Posicion + 255)
               End If
           Next
       Else
           MsgBox "La llave debe tener al menos dos caracteres.", vbError, ""
       End If
   End If
   descifra = CadenaResultante
End Function
Private Function GeneraLlave(ByVal UnaLlave As String, ByRef Llave() As Integer) As Boolean
Dim i As Integer
   Dim j As Integer
   Dim N As Integer
   If Len(UnaLlave) > 1 Then
       ReDim Preserve Llave(Len(UnaLlave) - 1, 254)
       For i = 1 To Len(UnaLlave)
           Llave(i - 1, 0) = Asc(Mid(UnaLlave, i, 1))
       Next
       For i = 0 To Len(UnaLlave) - 1
           For j = 1 To 254
               N = Llave(i, j - 1) + 1
               If N = 256 Then N = 1
               Llave(i, j) = N
           Next
       Next
       GeneraLlave = True
   End If
End Function

Al proyecto le ponemos CmpEncriptador y a la clase DCEncriptar, luego generamos la dll (CmpEncriptador.dll)


y abrimos un nuevo proyecto de aplicación Windows en .NET  y a las referencias agregamos


Ahora vamos y
Imports CmpEncriptador
Dim objEncripta As New DCEncriptar
MessageBox.Show(objEncripta.cifra("tips .net", "malkavian_net"))

Y la clase de 6.0 cifrará el texto, también podríamos desencriptarlo usando la misma llave.

Migrando nuestro código 6.0 a VB.NET
Para que la programación anterior utilize el code nativo de vb.net debemos hacer algunos cambios
-Funciones
Public Function cifra(ByVal UnaCadena As String, ByVal UnaLlave As String) As String
       Dim CadenaResultante As String
       Return CadenaResultante
   End Function

Si hubiese algún codigo luego del return ya no se ejecutaría pues el precompilador al llegar al return sale de la faunción, maneras de sobrellevar esto:
       Try
           'sentencia
           Return CadenaResultante
       Finally
           'aqui otras sentencias
       End Try

Así al dar un Return la function ejecutará lo que encuentre en el Finally, sirve mucho en algunos casos.

-Arrays

En el code 6.0 se usa un arreglo:
Dim Llave() As Integer

Podemos inicializar los arreglos de la siguiente manera
Dim llave() As Integer = {1, 2, 3}
Dim i As Byte
For Each i In llave
    MessageBox.Show(i.ToString)
Next
'este mismo ejemplo en C# sería parecido hay que declarar
int[] llave= new int[3]= {1, 2, 3}


Ya no existe la función Ubound para saber el máximo índice de un arreglo tan solo necesitamos un n.Lengt, podemos saber la dimensión del array con la propiedad Rank ,un array nos brinda una infinidad de métodos y propiedades que podemos usar a placer.

-Cadenas de texto que pasó con las funciones mid, left, right, len, chr ,ascBueno la forma de trabajar con cadenas a cambiado, ahora son propiedades de todo objeto (variable) string  
Obtener la longitud de una cadena
UnaCadena.Length
Obtener el asc y chr de una cadena, estos métodos son parte de la clase VisualBasic
Microsoft.VisualBasic.Asc(UnaCadena)
Microsoft.VisualBasic.Chr(UnaCadena)

Usar operador &=, mod
Mod tiene la misma funcionalidad que en  6.0
Operador &=
Dim str1 As String = "Hola "
 Dim str2 As String = "Visita el nuevo foro .NET"
 str1 &= str2 'el resultado: "Hola Visita el nuevo foro .NET"

Usar metodos de cadena
Mid(UnaCadena, i, 1)]
Esta funciones podrían remplazarse por los métodos Remove o Substring
unacadena.Remove([star index],[count])
unacadena.Substring([star index])


-Option Explicit
También tenemos esta sentencia para forzar a declarar todas las variables:
Option Explicit On
Su valor podría ser Off si no queremos esta comprobación. Tambien tenemos una nueva alternativa:
Option Strict On
Option strinct nos da una regla de conversión para restringir las conversiones de datos que podrían ocacionar pérdida de datos.
Option Compare Text
Tendiendo a option compare en Text entonces la letra 'a' minúsculas sería mayo a la letra 'A' mayúsculas
Option Compare Binary
Aquí 'a' = 'A'
Estas declaraciones tienen que hacerse en la parte general
-Ahora que acabamos de tratar el tema de mayúsculas y minúsculas:
Si tengo a option compare en Text y me encuentro en la siguiente situación:
Dim Info As MessageBox
       If "javier" = "Javier" Then
           Info.Show("Se trata del mismo nombre")
       Else
           Info.Show("No se trata del mismo nombre")
       End If

Si por ejemplo la variable de comparación es 'javier' y el usuario ingresa el nombre desde una caja de texto y pone 'Javier'; en una comparación se habla del mismo nombre, pero si está en: Option Compare Text (que está por defecto) no sería lo mismo, entonces podemos solucionarlo cambiando a Binary ó:
If "javier" = "Javier".ToLower Then
El método ToLower convierte al el texto del objeto en minúsculas esto es algo como un LCase y Ucase de 6.0

-Según el ejemplo estos serían los casos en que habría que cambiar, aparte de remplazar el msgbox por la clase message, y al hablar de objetos podríamos decir:
if unacadena < > "" then
If Not UnaCadena Is Nothing Then

-funciones Round , Abs en .net
Éstas funciones de redondeo, absoluto entre otras como coseno, seno, max,min, entre otras las tenemos en la clase Math
Dim NroEntero = Math.Round(2.3333)
a por las buenas ideas

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

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.

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

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

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:

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

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.
a por las buenas ideas

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:

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

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

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

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

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

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:

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

Listar procesos

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

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í:
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
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.
a por las buenas ideas

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:

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

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


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

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

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

   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
   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)

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

    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
a por las buenas ideas

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



a por las buenas ideas

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