índice de vb.net

Cómo usar MessageBox

y, (como siempre), algunas cosillas más...

Actualizado: 22/Mar/2001


Usar el MessageBox es fácil, sobre todo si se sabe lo que hay que saber sobre las constantes que se usan para cambiar el aspecto del mismo, además de saber que valores puede devolver y cómo mostrarlo.
Pero en esta ocasión vamos a ver algunas cosas más, que si bien algunas no tienen nada que ver directamente con el MessageBox, otras sí.

Te voy a relacionar algunas de las cosillas que veremos en este artículo, (para que te animes a seguir leyendo, je, je...)
Al final encontrarás un link al código completo de los formularios usados.


¡Espero que todo esto te sea de utilidad!

Nos vemos.
Guillermo


Asignar valores al dimensionar un array o variables normales:

Seguramente ya sabrás que una de las nuevas características del Visual Basic para .Net es que puedes asignar el valor de una variable al declararla. Pero lo que seguramente no sabrás, (si lo sabes, pues mejor para ti... je!), es que también puedes crear arrays y asignarle los valores que contendrá en el momento de declararla.

Veamos los dos casos:

1. Para asignar un valor a una variable simple:

Dim queOptIconos As Integer = -1 


2. Para asignar valores a un array, se indica el nombre del array, pero sin el número de elementos y los valores a asignar se indican dentro de un par de llaves: {...} y se separa cada uno de los elementos con una coma:

Dim valorIconos() As Integer = { MessageBox.IconAsterisk, MessageBox.IconError, _
			MessageBox.IconExclamation, MessageBox.IconHand, _
			MessageBox.IconInformation, MessageBox.IconQuestion, _
			MessageBox.IconStop}

 


Crear arrays (y ArrayList) para manipular una serie de controles relacionados entre sí:

En el proyecto de prueba de MessageBox, he usado varios RadioButtons para seleccionar los iconos y botones a mostrar en el cuadro de diálogo, como sea que Visual Basic .Net no permite crear array de controles, tuve que crear unos arrays o colecciones para poder saber de forma más o menos fácil que opción se había seleccionado.
No es exactamente un array de controles, pero sirve para saber que control es el que se está usando.
En este caso, lo que necesitaba era averiguar el índice dentro de la colección del RadioButton seleccionado y ese valor me lo da la función IndexOf del ArrayList. El parámetro debe ser uno de los objetos contenidos en el array y devuelve el índice.
Como puedes ver en el código de un poco más abajo, los elementos se añaden con Add, como es habitual en todas las colecciones.

'
' ArrayList para los RadioButtons 0 a 7
Dim optIconos As ArrayList
'
' ...
'
Private Sub AsignarArrays()
	'
	' Crear los arraylist de los RadioButtons
	optIconos = New ArrayList()
	' Añadir cada uno de los elementos
	With optIconos
		.Add(RadioButton0)
		.Add(RadioButton1)
		.Add(RadioButton2)
		.Add(RadioButton3)
		.Add(RadioButton4)
		.Add(RadioButton5)
		.Add(RadioButton6)
		.Add(RadioButton7)
	End With
	'
	' ...
	'
End Sub
'
' ...
'
Protected Sub optIconos_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs)
	' Comprobar si está en el array de iconos                   (20/Mar/01)
	' y asignar el índice a queOptIconos
	'
	queOptIconos = -1
	'
	' Ya que el Windows Form Designer quita la llamada al procedimiento
	' que crea los ArrayList, hay que comprobar si está creada...
	' Por tanto usamos detección de errores
	Try
		queOptIconos = optIconos.IndexOf(sender)
	Catch
		AsignarArrays()
		queOptIconos = optIconos.IndexOf(sender)
	End Try
End Sub
'
Protected Sub RadioButton0_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs)
	optIconos_CheckedChanged(sender, e)
End Sub

Redirigir los eventos de varios controles del mismo tipo a uno genérico:

En esta ocasión, todos los eventos "Checked_Changed" de una serie de RadioButtons deberían hacer lo mismo: saber qué índice del array se había seleccionado.
A diferencia de c# o de la versión pre-beta1, los eventos en Visual Basic .Net (y en el Visual Basic normal) son únicos para cada control, pero el código, aunque en este caso es algo escaso, es el mismo para cada evento de cada uno de los 8 controles usados.
Aquí no voy a descubrir nada del otro mundo, ya que esto mismo se puede hacer en la versión actual de Visual Basic: Crear un procedimiento genérico al cual se llamará desde cada uno de los eventos, la verdad es que echo de menos la posibilidad de redirigir los eventos de varios controles sólo a un procedimiento, pero al estar declarados los controles con WithEvents, esto no es posible, al menos que yo sepa... y si alguien sabe cómo hacerlo, sin que el entorno "deshaga" los cambios manuales... que me lo diga.
El código de ejemplo lo puedes ver un poco más arriba.


Detectar errores con Try y Catch:

En esta ocasión, al trabajar con colecciones de controles, decidí crear las colecciones dentro del código de creación del formulario, pero como el IDE elimina cualquier cosa que no haya generado el propio Entrono de Desarrollo (IDE), tuve que crearlo dinámicamente, pero aprovechando el aviso de error que nos da al intentar acceder a un elemento de la colección (ArrayList).
La forma de usar Try... Catch... Finally... End Try, es: insertar el código que puede dar error después de Try, si no da error, no pasa nada, pero en caso de que ese código de error, se ejecuta el código que hay después de Catch.
Finally se puede usar para procesar el código después de manejar los errores, si no se usa, el código seguirá ejecutándose después de End Try.
En caso de que, al capturar el error con Catch queramos tener una información descriptiva del error ocurrido, podemos usarlo de esta forma:
Catch elError As Exception, el objeto elError nos dará la información que necesitamos: elError.toString.

Ejemplo de lo dicho:

	Try
		queOptIconos = optIconos.IndexOf(sender)
	Catch
		AsignarArrays()
		queOptIconos = optIconos.IndexOf(sender)
	End Try

Usar BitAnd y BitOr (¿en que se diferencian de And y Or?):


Nota:

En la versión definitiva ya no se incluye BitAnd ni BitOr ya que And y Or respectivamente hacen la misma función, es decir operan a nivel de bits, para usar operadores lógicos "cortocircuitados", puedes usar AndAlso y OrElse.
 

En el Visual Basic de toda la vida, (hasta la versión 6), And, Or, Not, etc., se puede usar tanto para usarlo de forma lógica como para manipulación de bits. Pero en Visual Basic .Net se diferencia cada uno de estos usos.
Para la manipulación de bits, se usan los operadores que empiezan por Bit: BitAnd, BitOr, BitNot y BitXor.
(Ahora explicaré qué es eso de la manipulación de bits).
Para la evaluación booleana de expresiones se usan los clásicos: And, Or, Not y Xor.
La principal diferencia (en este caso mejora), de los operadores lógicos (booleanos), es que en el caso de que se evalúen varias expresiones usando estos operadores, si al usar And la expresión da como resultado un valor False, el resto de la expresión no se evalúa, lo mismo ocurre con Or, pero en este caso se dejará de evaluar si el resultado es True. Con las versiones anteriores, siempre se evalúan todas las expresiones incluso aunque no se cumpla cualquiera de ellas.

And, Or, Not y Xor se usará para expresiones lógicas, es decir cuando el resultado deba ser verdadero o falso (True o False).

BitAnd, BitOr, BitNot y BitXor se usará cuando necesitemos manipular bits, por ejemplo 15 BitAnd 4 dará como resultado 4 ya que las operaciones de bits con AND dan como resultado un 1 cuando los dos bits también son 1. La siguiente tabla nos da cómo se manipulan los bits con los diferentes operadores:

Con BitAnd si los dos bits a evaluar son 1, el resultado es 1
Con BitOr si cualquiera de los bits es 1, el resultado es 1
Con BitXor si uno de los bits es 1 y el otro es 0, el resultado es 1, pero el resultado será cero si los dos son 0 o los dos son 1
Con BitNot el resultado será el contrario, es decir, si el bit evaluado es cero, el resultado será 1 y viceversa.

1 BitAnd 1 = 1 1 BitAnd 0 = 0 0 BitAnd 1 = 0 0 BitAnd 0 = 0
1 BitOr 1 = 1 1 BitOr 0 = 1 0 BitOr 1 = 1 0 BitOr 0 = 0
1 BitXor 1 = 0 1 BitXor 0 = 1 0 BitXor 1 = 1 0 BitXor 0 = 0
BitNot 1 = 0 BitNot 0 = 1    

En el caso de MessageBox, BitOr se usará cuando queramos usar varios valores para indicar el icono y el botón o botones a mostrar, aunque también se puede usar el signo + (suma), ya que lo mismo es: 16 BitOr 5 que 16 + 5, es decir: 21.
Para el caso de saber que valores se esconden dentro de un número, podemos usar BitAnd para comprobar si un número está dentro de otro:
If (21 BitAnd 16) = 16 Then (será cierto, ya que 21 BitAnd 16 da como resultado 16. Esto es más fácil verlo si convertimos el número en los bits correspondientes, o lo que es lo mismo, lo convertimos en un número binario (de base 2):

Decimal Binario
21 00010111
BitAnd 16 00010000
= -----------
16 00010000

Mostrar un segundo formulario modalmente y centrado con respecto al que lo llama:

A diferencia del Visual Basic 6 y anteriores, los formularios siempre están disponibles para usarlos, no es necesario crearlos explícitamente, al menos el principal, es cómo si fuesen objetos GlobalMultiuse, o variables declaradas con New, como sabrás, un objeto declarado con New se "auto-instancia" al acceder a él. Pero ahora estamos tratando con la nueva versión de Visual Basic y en esta nueva recreación de nuestro querido Visual Basic, cada objeto hay que crearlo de forma explícita, por tanto, si tenemos en nuestra aplicación un segundo formulario, (al que llamaremos Form2), para poder usarlo, hay que declarar una variable de ese tipo (con o sin New, ya que en esta versión de VB no existe la sobrecarga que había en versiones anteriores).
Veamos un ejemplo:


' Para mostrar otro formulario hay que crearlo con New,
' ya que ya no están creados de forma predeterminada.
Dim frmMostrar As New Form2()

With frmMostrar
	' Para que el propietario sea este formulario
	.Owner = Me
	' Posicionarlo en el centro del formulario propietario
	.StartPosition = FormStartPosition.CenterParent

	' Asignamos el texto a la propiedad creada
	.elTexto = elCodigo
	' Mostramos el formulario de forma modal (es un cuadro de diálogo)
	.ShowDialog()
	' De esta forma se mostraría no modal
	'.Show()
	' Recuperamos el texto, por si se modifica
	elCodigo = .elTexto
	' Esto sólo tendrá efecto si se muestra modal
	'.Close()
End With
' Quitamos la referencia de la memoria
frmMostrar = Nothing

En el código mostrado, vemos que asignamos Me, (que representa al formulario propietario), a la propiedad .Owner y en la propiedad .StartPosition asignamos el valor CenterParent de la enumeración FormStartPosition, con esto lo que conseguimos es indicarle al compilador que el formulario a mostrar "pertenezca" al form desde el que es llamado, en Visual Basic 6 se haría al usar Show: .Show vbModal, Me
La otra cosa que hay que saber, es que para que un formulario se muestre de forma modal, es decir que el código no continue después de mostrarlo hasta que el segundo formulario no se cierre, (con VB6 sería con .Show vbModal), hay que usar el método .ShowDialog del formulario a mostrar.
Para mostrar un formulario de forma no modal, (es decir, que se muestre el formulario pero que el código continue incluso si aún el otro aún está abierto), se usará .Show (igual que en VB6 y anteriores).


Añadir una propiedad a un formulario (y cómo usar las propiedades):

Para añadir una propiedad a un formulario, se hace tal y como se venía haciendo desde la versión 4.
Es decir, se puede declarar una variable pública o bien crear una propiedad propiamente dicha.
¿Dónde está el truco? En ningún sitio, (o casi), pero a que seguramente ha llamado tu atención... je, je... Es que con tantas cosas que no se pueden hacer en la nueva versión de Visual Basic, he querido dejar claro que esto no ha cambiado... o casi, ya que las propiedades se declaran de otra forma (me refiero a los procedimiento Property), además de que el valor a devolver por la propiedad se puede devolver de la forma clásica: asignando el valor al nombre de la propiedad o bien usando Return y el valor a devolver. Para el caso de las asignaciones, se usará Value para indicar el valor a asignar.
Veamos un ejemplo:


Public unaPropiedad As String


Public Property elTexto() As String
	Get
		'elTexto = TextBox1.Text
		' o también:
		Return TextBox1.Text
	End Get
	Set
		TextBox1.Text = Value
	End Set
End Property

La ventaja de usar el procedimiento Property es que podemos hacerlo tanto de sólo lectura (sólo usamos Get), o de sólo escritura, (sólo usamos Set), aunque hay que indicárselo con ReadOnly para las de sólo lectura y con WriteOnly para las de sólo escritura:

'
Public ReadOnly Property Prueba() As Integer
	Get
		Return x
	End Get
End Property

'
Public WriteOnly Property Prueba2() As Integer
	Set
		x = Value
	End Set
End Property


Copiar / pegar texto en/de el portapapeles:

Para copiar el contenido de una variable o de un objeto que contenga algo que se pueda copiar en el portapapeles, se hará lo siguiente:


' Copiar el texto en el portapapeles
Clipboard.SetDataObject(TextBox1.Text, True)

El True del segundo parámetro indica que lo que se ha copiado debe permanecer en el portapapeles cuando la aplicación termine.
Si se indica False, lo que se ha copiado se eliminará, (si esto lo pruebas en el IDE, lo copiado permanecerá, por tanto tendrás que usar el ejecutable creado para comprobar que eso es así... al menos eso es lo que he hecho para comprobarlo, je, je)

Para obtener el texto almacenado en el portapapeles, (sin ningún tipo de comprobación):


TextBox2.Text = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString

Aunque lo correcto sería comprobar si hay algo que pegar del tipo que necesitamos, en nuestro caso sería de tipo texto:
(este código está adaptado de un ejemplo de c# incluido en el .Net Framework, por eso dejo los comentarios en inglés)

'
' Declare an IDataObject to hold the data returned from the clipboard.
' Then retrieve the data from the clipboard.
Dim iData As IDataObject = Clipboard.GetDataObject()
'
' Determine whether the data is in a format you can use.
If CBool(iData.GetDataPresent(DataFormats.Text)) Then
	' Yes it is, so display it in a text box.
	textBox2.Text = CStr(iData.GetData(DataFormats.Text))
Else
	' No it is not.
	textBox2.Text = "Could not retrieve data off the clipboard."
End If

El código del proyecto MessageBox:

El código completo del proyecto está en este fichero zip: (messageboxNet.zip 12.5KB)

 


Una imagen del formulario en ejecución


Ir al índice de vb.net

la Luna del Guille o... el Guille que está en la Luna... tanto monta...