Iniciado el 27/Oct/2000
Actualizado: 28/Dic/2003 (11/Abr/2001)
NOTA del 13/Jun/2002:
A partir de esta fecha, todo lo relacionado con .NET se accederá desde una nueva página, así que...
si no quieres perderte nada sobre este nuevo "sistema" de desarrollo, sigue este link.
Los links a partir del 1/Abr/2001:
- Cómo usar un procedimiento para manejar los eventos de varios controles (11/Abr/01)
- Ajustar la posición y tamaño de los controles automáticamente con Anchor (01/Abr/01)
- Implemetar interfaces en nuestras clases (01/Abr/01)
- Copiar un array en otro, dejando un elemento libre al principio (01/Abr/01)
- Copiar un array en otro, dejando un elemento libre al final (01/Abr/01)
- Cómo recorrer los elementos de una clase/colección heredada (01/Abr/01)
- Cómo usar métodos de una clase sin crear un nuevo objeto (usando Shared) (01/Abr/01)
Los links a partir del 22/Mar/2001 (VS.NET Beta1):
- Cómo... usar Threads en vb.Net (27/Mar/01)
- Ejemplo de MessageBox en vb.Net (22/Mar/01)
- Cómo... usar el MessageBox (22/Mar/01)
Los links del 25/Oct/2000 (.NET Framework preview):
- Conceptos básicos: Tipos de ficheros o módulos que se pueden usar en VB.NET
- Cómo... Compilar un formulario creado con Win Forms
- Cómo... Trabajar con un ListBox y otros controles que contienen lista de elementos
- Cómo... Manejar un array
- Cómo... Convertir un número o una cadena en un caracter
- Cómo... usar colecciones mejoradas: ArrayList
- Cómo... saber cuando usar Private, Protected, etc.
- Cómo... declarar variables y la visibilidad de las mismas.
- Cómo... crear métodos y propiedades en las clases.
- Cómo... usar otros modificadores de métodos: Shared, Overridable, etc.
- Ejemplos: Más vale un poco de código que 10.000 palabras.
Conceptos básicos: Tipos de ficheros o módulos que se pueden usar en VB.NET
Aunque los ficheros de código usados para compilar programas para Visual Basic .NET pueden tener cualquier extensión, es recomendable usar la "nueva" extensión .vb; a nuestro criterio queda el usar otras extensiones.
Realmente lo quen interesa es el contenido del fichero. Antes cada tipo de fichero tenía un significado para el entorno integrado del Visual Basic, pero ahora ya no lo tiene... aunque el diseñador de formularios da por hecho que los listados de Visual Basic sean los que tengan la extensión .vb y los de c# los que tengan la extensión .cs.
Como te decía, lo realmente importante es el contenido del fichero en cuestión, dentro de ese fichero pueden existir varias clases, diferentes Namespaces y formularios, etc. Vamos a ver que podemos usar, cómo y cuando es recomendable usarlo:
- Namespace:
Según la ayuda del NGWS SDK (o .NET SDK), un Namespace es la forma de identificar una serie de clases, estructuras de datos, etc. que hacen referencia a un mismo tema. La nomenclatura usada, (o la recomendada), es: NombreCompañía.TipoTecnología
De esta forma evitaremos que hay duplicidad en los nombres asignados a un Namespace, por ejemplo: Microsoft.VisualBasic hará referencia a las clases, datos, etc. que propone Microsoft para VisualBasic...
Todo código usado en cualquier componente para .NET debe residir en, como mínimo, un Namespace, dentro de ese Namespace incluiremos clases y datos relacionados con la funcionalidad que pretendemos que dicho "espacio" tenga; de esta forma, será más fácil "trocear" el código de forma que sólo usemos el código que realmente necesitemos y también servirá para hacer más fácil la localización de dicho código, sobre todo si lo tenemos compilado en forma de librería (DLL). Si no te has enterado... ya lo comprenderás conforme vayamos viendo código de ejemplo.
Todo el código declarado en un Namespace es visible dentro del mismo Namespace, se hayan declarado como se hayan declarado, es decir: una clase declarada Private será visible en todas las clases declaradas dentro del mismo Namespace. NO se pueden declarar variables a "nivel" de Namespace, para esos casos, podemos usar Module:- Module:
El código declarado en un Module es parecido a lo que hasta ahora se codificaba en ficheros con la extensión .bas. Todas las variables, procedimientos e incluso clases declaradas en una sección Module será visible en el mismo Namespace en el que se ha declarado dicho Module. También serán accesibles a todo código que IMPORTE dicho Namespace, usando: Imports NombreDelNamespace.
Se puede usar Module para los casos en que necesitemos usar variables y constantes globales al Namespace y sobre todo para crear un punto de ejecución de nuestro programa, (osea, por donde queramos que nuestro código empiece a ejecutarse), declarando un procedimiento que se llame Main y sea público. Pero si no queremos tener un Module para declarar sólo el procedimiento Main, podemos tener en una clase un procedimiento con ese nombre, aunque en esta ocasión además de público debe estar declarado como Shared: Shared Public Sub Main()
Nota: Sólo puede existir un procedimiento Main en cada ejecutable.- Class:
Las clases son los objetos que podemos crear en Visual Basic, y no es una excepción en VB.NET, la única diferencia es que no es necesario que cada clase resida en un fichero diferente, en un mismo fichero .vb puede haber tantas clases como necesitemos.Salvo Namespace, tanto Module como Class pueden ser Public, Private, Protected, Friend o Protected Friend.
Namespace siempre es Public y no permite usar un modificador de "visibilidad".
En caso de no indicarse el "modificador", se entiende que está declarado como Friend, salvo en el caso de que sean variables, en cuyo caso, serán Private. Por tanto, es recomendable usar siempre el modificador.
Los miembros declarados como Private, sólo serán accesibles en el Namespace en el que se declararon.
Cómo... Compilar un formulario creado con Win Forms
vbc file_principal.vb [file2.vb... fileN.vb] /r:System.dll /r:System.WinForms.dll /r:System.Drawing.dll
Nota:
En la versión definitiva, tendrás que cambiar System.WinForms.dll por System.Windows.Forms.dllEl nombre del ejecutable será el del primer fichero, si se quiere indicar otro: indicarlo con el parámetro /out, por ejemplo: /out:Nombre.exe
Para indicarle el tipo de ejecutable (o fichero compilado), se usará /target: o /t: y uno de estos parámetros:
/target:exe Crea un .exe del tipo consola.
/target:library Crea una librería de código (DLL).
/target:module Crea un módulo.
/target:winexe Crea un ejecutable de Windows. Este es el valor por defecto, osea: cuando no se especifica la opcion target.
Cómo... Trabajar con un ListBox y otros controles que contienen lista de elementos
Un ListBox es del tipo de control que contiene una lista de elementos, aquí veremos cómo manejar y acceder a los elementos, añadirlos, borrarlos, etc. Esto también es aplicable al ComboBox.Borrar el contenido de un ListBox: ListBox1.Items.Clear
Añadir elementos a un ListBox: ListBox1.Items.Add(cadena)
Tomar un elemento de un ListBox (cadena): ListBox1.GetItemText(Elemento)
Elemento será un Item, no un valor numérico:
ListBox1.GetItemText(ListBox1.Items(índice))
También podemos tomar el texto de un elemento mediante un índice numérico usando algo como:
s = ListBox1.Items(índice).ToString()
Tomar el elemento 'Clickeado' y asignarlo a un TextBox:
Esto será válido para los ListBox, pero no para los ComboBoxesProtected Sub ListBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) With ListBox1 TextBox1.Text = .GetItemText(.SelectedItem) End With End SubSaber cuando cambia el elemento seleccionado:
En el caso de los combos se puede usar este evento cuando se selecciona de la lista desplegable (en ese caso el evento Click no funciona...) El evento en cuestión es: SelectedIndexChanged
Para saber el índice del item seleccionado: i = .SelectedIndex
También para indicar el índice seleccionado: .SelectedIndex = 0
Borrar un elemento de la lista: .Items.Remove(i)
Cómo... Manejar un array
Todos los arrays en VB.NET empiezan con el índice cero. Al declarar un array, el número usado, indicará el número de elementos, éstos irán desde 0 hasta el número menos uno:
Dim unArray(3) As String ' Se declara un array de 3 elementos del tipo cadena, de 0 a 2Crear una array de N elementos del tipo indicado (los elementos serán de 0 a N-1): Dim unArray(7) As String
Asignar un valor al array: unArray(0) = "Elemento 0"
Saber el número de elementos del array: x = unArray.Length
Redimensionar el array, (previamente debe estar declarado con Dim): Se puede hacer de estas dos formas:
Redim unArray(x+1) ' Se redimensiona, pero no se mantiene el contenido anterior.
Redim Preserve unArray(x+1) ' Se redimensiona y se mantiene el contenido anterior.
Asignar un valor al array: unArray(0) = "Elemento 0"
Recorrer los elementos de un array usando For Each...
Los elementos de un array se consideran objetos, a pesar de que podamos crearla del tipo String, por poner un caso.
Por tanto, para recorrer los elementos de un array usando For Each, haremos lo siguiente:' En los arrays, para usar For Each, deben ser Objetos Dim t As Object Dim s As String Dim i As Integer ' Esta comprobación es conveniente, ya que si el Array aún no está dimensionado, dará error. Try ' simplemente para saber si se produce error i = m_Array.Length Catch ' Si se produce un error, asignamos el valor cero, que más abajo indicará si el array contien datos o no i = 0 End Try ' If i = 0 Then s = s & "No hay datos en el array" & vbCrLf Else i = 0 For Each t In m_Array i += 1 ' igual que i = i + 1 s = s & t.ToString & " (" & i.ToString & ")" & vbCrLf Next End If
Cómo... Convertir un número en un carácter
Usando CChar(x) podemos convertir un número en un carácter, al estilo de Chr$(x) del VB pre.NET
De esta forma, podemos crear constantes al estilo de las del Visual Basic:Private Const vbCr As Char = CChar(13)
Private Const vbLf As Char = CChar(10)
Private Const vbCrLf As String = vbCr & vbLf
Private Const vbTab As Char = CChar(9)
Nota:
En la versión definitiva CChar() sólo acepta valores de tipo String.
Para convertir un número en un tipo Char, se puede usar Chr() o ChrW()
Cómo... usar colecciones mejoradas: ArrayList
Las colecciones ArrayList son como las colecciones de Visual Basic, pero bastante mejoradas, veamos algunas de las propiedades y métodos, ya que considero que este tipo de lista (o colección) puede ser de gran utilidad.
Nota: Para poder usarla hay que indicar: Imports System.Collections.Propiedades:
Capacity: Asigna o devuelve el número máximo de elementos que contendrá el ArrayList.
Este valor siempre será igual o mayor que el devuelto por Count. Si al añadir un nuevo elemento, Count fuese mayor que Capacity, la capacidad del array interno se duplicaría para que se pudiesen añadir nuevos elementos. Si se asigna directamente un valor, el array interno se adaptaría a ese valor.
Count: Devuelve el número de elementos actuales.
Item: Asigna o devuelve el elemento indicado.
Métodos:
Add: Añade un nuevo elemento al final del array (o colección).
BinarySearch: Realiza una búsqueda binaria en una lista ordenada.
Clear: Borra los elementos de la lista.
Clone: Hace una copia de la lista.
Contains: Determina si un elemento está contenido en la lista.
CopyTo: Copia toda o una parte de la lista en un array unidimensional.
Equals: Determina si el objeto especificado es igual al objeto actual.
FixedSize: Devuelve un ArrayList en la que sólo se pueden modificar elementos, no añadirlos o eliminarlos. La lista devuelta es lo que se llama list wrapper osea una lista que apunta a la lista original, por tanto cualquier cambio realizado en esa lista, se reflejarán en la original.
GetRange: Devuelve una lista con los elementos indicados.
IndexOf: Devuelve el índice de la primera ocurrencia del elemento indicado.
Insert: Inserta un elemento en el índice indicado.
InsertRange: Inserta los elementos de una colección en el índice indicado.
LastIndexOf: Devuelve el índice de la última ocurrencia del elemento indicado.
ReadOnly: Devuelve un list wrapper con acceso de sólo lectura.
Remove: Elimina el elemento indicado, (el elemento debe ser un objeto de los contenidos en la lista).
RemoveAt: Elimina el elemento del índice especificado.
RemoveRange: Elimina el rango indicado.
Repeat: Devuelve un ArrayList cuyos elementos son copias del objeto indicado. Se indicará el objeto a copiar y el número de veces.
Reverse: Invierte el orden de los elementos de la lista o del rango indicado.
SetRange: Copia los elementos de una colección a partir del índice indicado.
Sort: Clasifica los elementos de la lista.
ToArray: Copia los elemetos de la lista en un nuevo Array u objeto.
ToString: Devuelve la representación del objeto como una cadena. Dependiendo de la implementación de este método, puede devolver el nombre completo de la clase o bien la representación del valor.
TrimToSize: Asigna la capacidad de la lista al número de elementos que tiene actualmente, útil cuando sabemos que no vamos a modificar el número de elementos. Para borrar totalmente los elementos de un ArrayList, llamar antes al método Clear y después a TrimToSize.
Cómo... saber cuando usar Protected, Private, etc.
Estos modificadores de declaraciones de clases, métodos, propiedades y variables, se usarán cuando queramos modificar el "alcance" de visibilidad de dichos miembros.Private:
Un miembro declarado como Privado, sólo es accesible en la clase en la que se ha declarado.
Protected:
Un miembro declarado como Protected es accesible en la clase en la que se ha declarado y en las que deriven de ella.
Friend:
Un miembro declarado como Friend es visible en:
- la clase en la que se ha declarado,
- el Namespace en el que está dicha clase,
- en el mismo programa en el que está la declaración; por ejemplo, si se compilan varios ficheros con distintos Namespaces en un mismo programa (ejecutable o componente).
Protected Friend:
Idem que Friend, además de ser visible en las clases derivadas.
Public:
Visible por todo el mundo.
Osea, que si queremos crear miembros de la clase que sólo sean visibles en esa clase, usaremos Private (como hasta ahora).
En el caso de que nos interese que las clases derivadas puedan acceder a esos miembros, pero no nos interesa que el resto del Namespace o módulo en el que está declarado pueda acceder, entonces usaremos Protected.
Si lo que queremos es que determinados miembros sean visibles sólo en el Namespace en el que se ha creado la clase o en el mismo programa en el que está la declaración, habrá que declararlos como Friend.
Y si además de que sea visible en el Namespace o programa, queremos que también sean visibles en las clases derivadas, en ese caso habrá que declararlo como: Protected Friend.
Por último, si no nos importa que esos miembros de nuestra clase sean vistos por cualquier clase, esté o no en el mismo Namespace, módulo o lo que sea... entonces la declararemos como Public.
Nota: Si se declara una clase que se deriva de otra, el modificador debe ser igual o más restrictivo que la clase heredada. Por ejemplo, si Clase1 se declaró como Friend, la siguiente declaración produciría un error: Public Class Clase2 : Inherits Clase1, ya que los miembros de Clase1 no pueden "promoverse" a públicos.
Cómo... declarar variables y la visibilidad de las mismas.
Aquí veremos cómo se declaran variables (y objetos) en la nueva versión de Visual Basic, también veremos cómo ha cambiado el "alcance" o visibilidad de las variables.Aunque había leido por ahí que ya no se pueden declarar variables Públicas en clases para que se conviertan automáticamente en Propiedades... siguen funcionando como si lo fuesen... al menos se pueden asignar valores y devolverlos cuando queramos. Es decir, dentro de la clase, declaras una variable como pública y esa variable se convierte en una propiedad de lectura/escritura, es decir que se le pueden asignar valores y puede devolver el anteriormente almacenado. Aún así, esta no es la forma "deseable" de declarar una propiedad en una clase... ni en la nueva versión de Visual Basic ni en las anteriores...
Ahora la visibilidad de las variables o el alcance que tienen pueden ser locales a cada bloque de código:
Por ejemplo, si dentro de un bucle For declaramos una variable, esa variable es visible dentro del mismo bucle FOR, pero será "desechada" cuando se abandone el bucle. Lo mismo ocurre con el resto de "bloques": IF...THEN...ELSE...END IF, DO...LOOP, SELECT...END SELECT, etc. Lo que no podemos tener es una variable con el mismo nombre fuera y dentro de un bloque de código.
A diferencia de las versiones anteriores de Visual Basic, en esta nueva versión no se pueden declarar variables del tipo STATIC, es decir, variables que se declaraban dentro de un procedimiento y que mantenían el valor entre diferentes llamadas al mismo procedimiento, (cuando un procedimiento acaba, se desechan todas las variables declaradas en dicho procedimiento)
Al declarar una variable podemos asignarle directamente un valor:
Dim N As Integer = 10, incluso el valor devuelto por una función: Dim S As String = tClase1.Nombre()
Los objetos también se pueden declarar para que sean iniciadas en la propia declaración: Dim tClase1 As New Clase1
A diferencia de las versiones anteriores, esto no significa una "sobrecarga" de código, es decir: en las versiones anteriores de Visual Basic, si una clase se declaraba con New, el compilador tenía que comprobar cada vez que se usaba esa clase si ya estaba creada o no, en caso de no estarlo, se creaba una nueva instancia... lo cual significaba un código extra que insertaba de forma automática el compilador. La forma en que el VB.NET declara las variables es igual que si en las versiones anteriores hicieramos esto:
Dim tClase1 As Clase1
Set tClase1 = New Clase1
Cosa que aún podemos seguir haciendo, con la salvedad de que ya no se usa SET para asignar objetos a una variable.
Los modificadores de visibilidad de las variables, son los mismos que para los métodos... ver lo que dice la sección anterior.
Cómo... declarar Propiedades y Métodos en las clases.
Los métodos de una clase se declaran de la misma forma que en versiones anteriores de Visual Basic, ya sabes que un método es un procedimiento Function o Sub, según queramos que devuelva o no un valor.
Como sabrás, una propiedad puede usarse para asignar o devolver un valor, en las versiones anteriores a la 7 (vb.net), se declaraban como Property Get, Property Set y Property Let. En esta nueva versión de Visual Basic, las propiedades se declaran de forma diferente, ya que no existen procedimientos separados para cada tipo de acción a realizar por una propiedad.
Además del modificador de visibilidad: Public, Private, etc. se puede indicar que un propiedad es la propiedad por defecto, si se indica Default, aunque las propiedades por defecto deben aceptar parámetros, si no es así, no nos permitirá que la declaremos como Default. Creo que esto se debe a que las asignaciones de clases se hacen sin usar Set y en caso de que se hiciese esta asignación: Clase2 = Clase1, se crearía una referencia de la Clase1 en la Clase2, no se asignaría el valor de la propiedad por defecto de la Clase1 en la variable Clase2... Aún así, esto de que las propiedades Default deban tener parámetros, puede ser algo engorroso y llevar a errores, sobre todo para los casos en los que debe devolver un valor; por eso, mi recomendación es que las uses para propiedades que actuan al estilo de un array, es decir que reciben el parámetro para devolver un valor determinado
Veamos unos ejemplos de cómo declarar las Propiedades:' Public Property Nombre() As String ' Parte Get (la que devuelve el valor) Get ' Devolvemos el valor de la variable que guarda el Nombre Return m_Nombre End Get ' Parte Set (la que asigna el valor de la propiedad) Set ' Asignamos el nuevo valor a la variable que contendrá el Nombre m_Nombre = Value End Set End PropertyComo puedes ver, dentro del procedimiento Property, se puede crear el código de lo que se hará cuando se asigne un valor a esa propiedad (parte SET) o cuando se devuelva un valor por esa propiedad (parte GET). En el caso de que la propiedad no tenga parámetros, el valor asignado será el indicado por Value.
Fíjate también en que ahora para devolver el valor en la parte Get, se puede usar Return <expresión a devolver>, aunque si lo prefieres, puedes devolver el valor con el formato usado por las versiones anteriores de Visual Basic, es decir: NombrePropiedad = <expresión a devolver>
En el caso de que una propiedad sea de sólo lectura, no contendrá la parte SET, pero además habrá que indicarlo con ReadOnly, lo mismo ocurre con las propiedades de sólo escritura, (las que no tienen la parte GET), pero en este caso habrá que usar WriteOnly:' Public Default ReadOnly Property Item(ByVal unSaludo As String) As String Get Return unSaludo & " " & Nombre1 End Get End PropertySi además quieres que una clase derivada pueda implementar su propia versión de un método o propiedad, habrá que declarar ese procedimiento con: Overridable en la clase base y con Overrides en la clase derivada:
' En la Clase base: Overridable Public Function ShowNombre() As String Return Nombre End Function ' En la clase derivada: Overrides Public Function ShowNombre() As String ' La variable Nombre se declaró en Clase1 Return "El Nombre almacenado en Clase1: " & Nombre End FunctionSi necesitamos acceder al método original de la clase base, habrá que indicarlo de esta forma: MyBase.Método
MyBase representa al objeto del que se ha derivado la clase.En un intento de conseguir que tu "linda" cabecita empiece a echar humo, vamos a ver otra de las nuevas "particularidades" que nos trae el vb.NET con respecto a la "verdadera" (¡por fin!) Programación Orientada a Objetos (OOP según la abreviatura inglesa), en este caso es a la sobrecarga de procedimientos. Esto del Polimorfismo, hasta ahora, sólo nos permitía poder usar métodos con el mismo nombre en diferentes clases y mediante la herencia implementada de otras clases con Implements), el compilador sabía a que objeto llamar... pero sólo se podía hacer con el mismo nombre del método o propiedad en diferentes clases. Con la nueva versión de VB, también podemos hacerlo en la misma clase.
¿Cómo? usando el modificador Overloads.
¿Para que sirve Overloads?, imaginate que un mismo procedimiento permite diferentes tipos de datos como parámetro y según ese tipo de dato devolver el adecuado... o bien que reciba parámetros opcionales y según los parámetros recibidos actúe de una forma u otra... En todos estos casos, puedes definir diferentes procedimientos (con el mismo nombre), pero que cada uno actúe de forma adecuada según los parámetros recibidos. Lo que no se puede hacer es declarar varios procedimientos en los que sólo se diferencia el tipo de dato devuelto.
¡Vaya lío! ¿verdad?
Vamos a aclararlo con algún que otro ejemplo:
' ' Recibe parámetros Integer y devuelve un Integer Public Overloads Function Suma(ByVal a As Integer, ByVal b As Integer) As Integer Return a + b End Function ' Recibe parámetros Double y devuelve un Double Public Overloads Function Suma(ByVal a As Double, ByVal b As Double) As Double Return a + b End Function ' ' Estos procedimientos reciben distintos tipos de parámetros, ' pero devuelven el mismo tipo Public Overloads Function aCadena(ByVal a As Integer) As String Return "Es un Integer convertido a cadena: " & a.ToString End Function ' Public Overloads Function aCadena(ByVal a As Double) As String Return "Es un Double convertido a cadena: " & a.ToString End Function '¿Te quedó más claro ahora?
Nota: Los parámetros a procedimientos ahora son ByVal por defecto, en las versiones anteriores eran ByRef.
Cómo... usar otros modificadores de Métodos (Shared, Overridable, etc.)
Aquí vermos otros modificadores para la definición de métodos.
Además de los modificadores de "alcance" que vimos anteriormente, hay otros modificadores aplicables a los métodos que indicarán la forma de comportarse (o de cómo se dejarán manipular...)
Vamos a ver cada uno de ellos y lo que dice la ayuda del .NET SDK:
- Shared:
Este modificador indica que el método es un método compartido. Los métodos compartidos no actuan en una instancia determinada de un tipo. Aparte de los declarados en módulos estándard, un método declarado sin el modificador Shared se llama un método de instancia. Un método de instancia, opera sobre una instancia de un tipo. Un método compartido no puede ser Overridable (o sobre-escrito), y por tanto no debe especificar ninguno de los modificadores: Overridable, NotOverridable, MustOverridable o Overrides.
Aplicando esto a las actuales versiones de Visual Basic, es como si declarasemos un método en un fichero BAS incluido en un componente, (e incluso en un programa normal), cada vez que se crea un objeto de una clase de ese componente, creamos una nueva instancia de dicha clase, sin embargo los métodos declarados en los módulos BAS de ese componente serían "compartidos" por todas las instancias creadas. En C++ es lo que se llama un método estático (static)- Overridable:
Este modificador indica que el método puede ser "anulable" o "redefinible" (no he encontrado una traducción mejor). Un método redefinible no debe ser declarado como Shared ni NotOverridable y no debería combinarse con MustOverride o Overrides, (ya que ambos implican Overridable). Métodos en clases definitivas no deberían declararse como Overridable y las funciones declaradas con este modificador no deberían ser Privadas (Private).
Este modificador se aplica a los métodos que queremos usar de forma "polimófica", es decir que podemos tener un método en una clase el cual puede ser "redefinido" u ocultado por otro con el mismo nombre en una clase derivada. Esto se usa para que, dependiendo de la clase en la que se defina, actúe de forma adecuada sobre los datos manejados por esa clase.- NotOverridable:
Este modificador indica que el método es final. Un método que especifica NotOverridable también debe especificar Overrides y no debería especificar Shared, Overridable o MustOverride. Métodos finales no deben ser Private ya que es redundante.
Si se especifica este modificador, las clases derivadas no podrán crear métodos con este mismo nombre que "anulen" o redefinan al método de la clase heredada.- MustOverride:
Este modificador indica que las clases derivadas deberán crear explícitamente un método con el modificador Overrides que redefina la funcionalidad del método. Según la ayuda del SDK, este modificador indica que un método es abstracto y los métodos abstractos no deben incluir código, no deben redefinir otro método y deben aparecer sólo en clases (o tipos) abstractos. Un método abstracto no debe especificar Shared, Overridable, NotOverridable ni Overrides. Los métodos abstractos no pueden ser Private.
Es decir, MustOverride se usará sólo como definiciones de métodos a redefinir por las clases derivadas y sólo aparecerá en las clases abstractas, por tanto lo único que se aportará serán los parámetros que tiene, el tipo de datos a devovler y la "visibilidad" de dicho método... no se si en VB se podrán crear clases abstractas... aún no he llegado a eso... pero todo se andará...- Overrides:
El modificador Overrides indica que este método redefine un método incluido en la clase base (de la que se deriva la clase) y debe tener la misma "firma", es decir que tenga los mismos parámetros y el tipo devuelto sea el mismo, (en el caso de que fuese una función). Un método con este modificador no debe especificar Shadows, Shared, Overridable, o MustOverride. Si no existiera un método al que poder redefinir, se produciría un error.
Este modificador se usa cuando queremos crear un método que redefina a otro existente en una de las clases de la que se derive la clase que lo contiene, por ejemplo para manipular los datos de forma más adecuada a esta clase.- Overloads:
Este modificador indica que un método "sobrecarga" a otro existente en la misma clase. Cada uno de los métodos "sobrecargados" deben tener una firma diferente, es decir el número o los tipos de parámetros deben ser diferentes.Nota: El único modificador que debe especificar un método declarado en un módulo es: Overloads.
En la sección que trata los métodos hay varios ejemplos de Overloads, Overridable y Overrides.
Ejemplos: más vale un poco de código que 10.000 palabras.
Pues eso... aquí tienes unos links a páginas con código de ejemplo de las diferentes cosillas que he ido probando en estos días. Espero que los comentarios incluidos sean suficientes... aunque aún no descarto de incluir algo de más explicación.
- Prueba de sobrecarga de procedimientos
- Prueba de declaración de variables y visibilidad
- Prueba de acceso a listas: de un ListBox, Array y Collection (compatible con versiones anteriores de Visual Basic)
- Prueba de acceso a listas: de un ListBox, Array, ArrayList (colecciones mejoradas) y StringCollection
- Prueba de convertir una clase de versiones anteriores a VB.NET (cNum2Text)
Cómo usar el MessageBox: (17~22/Mar/2001)
Talvez parezca una simpleza, pero... como en VB.NET se usa de forma distinta que en el Visual Basic de ahora... pues aquí tienes algunos consejos o formas de cómo usar esta función que sirve para mostrar mensajes en la pantalla.
Para mostrar un mensaje, se usa de esta forma: MessageBox.Show("Texto a mostrar", "Título de la ventana", Botones e icono)
En Botones e icono, se pueden usar cualquiera de los valores devueltos por el objeto MessageBox, veamos algunos de ellos:
AbortRetryIgnore Muestra los botones de Anular, Reintentar, Ignorar DefaultButton1 (2 ó 3) Hace que el botón predeterminado sea el 1º (o el 2º o el 3º) DefaultDesktopOnly El mensaje se muestra en el escritorio activo, siempre que haya un usuario activo. IconAsterisk Muestra el icono de asterisco, (aunque por ahora muestra el de Información). IconError Muestra el icono de error. IconExclamation Muestra el icono de exclamación. IconHand Muestra el icono de una mano, (aunque por ahora muestra el de error). IconInformation Muestra el icono de información. IconQuestion Muestra el icono de interrogación. IconStop Muestra el icono de stop, (aunque es el mismo que el de error). OK Muestra el botón de Aceptar (este es el botón por defecto, si no se indica ningún otro) OKCancel Muestra los botones de Aceptar y Cancelar RetryCancel Muestra los botones de Reintentar y Cancelar RightAlign Justificar el texto por la derecha RTLReading Para los idiomas que se muestran de derecha a izquierda ServiceNotification El mensaje se muestra en el escritorio activo, aunque no haya un usuario activo. YesNo Mostrar los botones Si y No YesNoCancel Mostrar los botones Si, No y Cancelar Para los valores devuelto por MessageBox, se usan las constantes de DialogResult, que son las siguientes:
Abort
Cancel
Ignore
No
None
OK
Retry
YesVeamos ahora algunos ejemplos de uso de MessageBox:
La forma más simple: (como no se indica que tipo de botón mostrar, se muestra el botón OK (Aceptar))
MessageBox.Show("Mensaje en la pantalla")Si queremos que se muestre el icono de interrogación: (idem que antes, se muestra OK)
MessageBox.Show("Mensaje en la pantalla con el icono de interrogación", "Título", MessageBox.IconQuestion)Si queremos mostrar los botones OK y Cancel (Aceptar y Cancelar):
(ret guardará el valor del botón pulsado)
ret = MessageBox.Show("Mensaje en la pantalla con dos botones: Aceptar y Cancelar", "Título", MessageBox.OKCancel)Si queremos mostrar los botones Yes y No (Si / No) además del icono de información:
(ret guardará el valor del botón pulsado)
ret = MessageBox.Show("Mensaje en la pantalla...", "Título", MessageBox.YesNo BitOr MessageBox.IconInformation)
(en lugar de BitOr se puede usar el signo + (más), pero no Or, ya que el significado es diferente)Si queremos indicar qué ventana es la propietaria (owner) del MessageBox, indicar como primer parámetro el formulario propietario:
(ret guardará el valor del botón pulsado)
ret = MessageBox.Show(Form1, "Mensaje en la pantalla...", "Título", MessageBox.YesNo BitOr MessageBox.IconInformation) .Pulsa este link para ver un proyecto con un ejemplo de cómo usar MessageBox además de copiar en el clipboard el código necesario para generar un messagebox.
Cómo usar un procedimiento para manejar los eventos varios controles:
La nueva versión de Visual Basic, (al menos en la Beta1), permite, mediante el modificador Handles, usar un sólo procedimiento para interceptar los eventos producidos en varios controles, siempre y cuando los parámetros recibidos sean del mismo tipo.
Osea que para crear un procedimiento para un evento: Nombre del procedimiento Handles Nombre del evento.
Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button1.Click
Por supuesto, el nombre del procedimiento puede ser cualquiera, no hay porqué seguir las reglas de: NombreDelControl_NombreDelEvento, además de poder usar un mismo procedimiento para manejar los eventos de varios botones:
Private Sub botonesClick(ByVal sender As Object, ByVal e As EventArgs) Handles button1.Click, button2.Click
Para saber que botón se ha pulsado, por ahora sólo puedes comprobar alguna de las propiedades del botón, por ejemplo el texto que tiene (antes llamado Caption), aunque según he oido por ahí, en la versión definitiva estará implementada la propiedad Name o alguna que nos permita distinguirlo del resto de los controles...Private Sub BotonesPulsados(ByVal sender As Object, ByVal e As EventArgs) Handles button1.Click, button2.Click If CType(sender, Button).Text = "Leer..." Then textBox1().Text = "Has pulsado en el botón 1" ElseIf CType(sender, Button).Text = "Guardar..." Then textBox1().Text = "Has pulsado en el botón 2" End If End Sub