Professional Documents
Culture Documents
Consejos y Trucos
para el
desarrollador de
Visual Basic .NET
En este captulo aprender a:
Crear dinmicamente controles
Windows.
Gestionar y trabajar con arrays.
Programar aplicaciones que utilicen la impresora.
Utilizar el control ColorDialog.
Utilizar tcnicas de arrastrar y soltar (Drag & Drop).
Volcar datos XML en el control
DataGrid.
Programar aplicaciones que utilicen el control ListBox.
Conocer la versin de Microsoft
.NET Framework instalada en un
sistema.
410 Captulo 20
Introduccin
Este libro de programacin avanzada de Visual Basic .NET, nos ofrece los
aspectos avanzados sobre la programacin de Visual Basic .NET abordando algunas de las caractersticas poco corrientes para el programador,
orientndolo en la prctica.
Evidentemente, no es muy amplio el espacio del libro que se dispone
para hablar de tantas cosas nuevas y anteriores aunque mejoradas y
aspectos avanzados para el desarrollador, y por eso, se ha decidido
preparar este captulo, dedicado a introducir pequeas porciones de
cdigo que sirvan de utilidad para los desarrolladores de aplicaciones
de Visual Basic .NET, donde veremos y aprenderemos a trabajar con las
utilidades ms habituales.
Un captulo que espero sirva de ayuda y apoyo al programador de aplicaciones de Visual Basic .NET.
412 Captulo 20
El cdigo es muy fcil de entender. Al iniciar nuestro formulario, creamos
un control TextBox con un conjunto de propiedades que hemos modificado inicialmente.
Posteriormente, cuando pulsamos el botn, somos capaces de cambiar el
texto del control creado dinmicamente.
Estas operaciones complejas, requieren algo de habilidad y el uso de la
propiedad Tag del control Button que hemos utilizado para recuperar
el identificador del control TextBox.
Por otro lado, existe otra clase que se encarga de iniciar el depurador
asocindolo al proceso. Para ello, haremos uso de la siguiente clase:
System.Diagnostics.Debugger.Launch()
414 Captulo 20
fecha de sistema determinada, deseemos recoger parte de su informacin,
por ejemplo, el tiempo o la fecha del calendario propiamente dicha.
El ejemplo siguiente soluciona esta duda. Aprovechando la interfaz de
diseo del ejemplo anterior, escribiremos el siguiente cdigo fuente asociado a nuestra aplicacin:
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
'Mostramos una fecha/hora en diferentes formatos
MessageBox.Show(FormatDateTime(Now,
DateFormat.GeneralDate) & vbCrLf & _
FormatDateTime(Now, DateFormat.LongDate) & vbCrLf & _
FormatDateTime(Now, DateFormat.LongTime) & vbCrLf & _
FormatDateTime(Now, DateFormat.ShortDate) & vbCrLf & _
FormatDateTime(Now, DateFormat.ShortTime))
End Sub
Estas operaciones de trabajo con fechas y horas, suelen ser de uso frecuente
en las aplicaciones Windows. Adicionalmente, podemos necesitar realizar
otras operaciones, pero stas que hemos visto, suelen ser habituales.
Aunque este ejemplo nos permite mostrar los datos de la matriz en pantalla, tambin podemos agregar ms posibilidades al trabajo con matrices.
416 Captulo 20
De hecho, se nos ocurre la posibilidad de incrementar una matriz
dinmicamente, aadiendo nuevos datos.
Esta operacin comn tambin por su uso, en los desarrollos de aplicaciones, quedara resuelta analizando el siguiente cdigo fuente, que lleva a
cabo esta operacin:
Dim strMiArray() As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles MyBase.Load
ReDim strMiArray(2)
strMiArray(0) = "0"
strMiArray(1) = "1"
strMiArray(2) = "2"
End Sub
Private Sub Mostrar_Datos(ByVal miArray As Array)
Dim I As Integer
Dim strDatos As String
'Mostramos los valores como los tenemos declarados
For I = 0 To (miArray.Length - 1)
strDatos = strDatos & miArray.GetValue(I) & vbCrLf
Next
MessageBox.Show(strDatos)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
'Guardamos el valor de la longitud del array
Dim intValor As Integer = strMiArray.Length
'redimensionamos el array preservando los valores
existentes
ReDim Preserve strMiArray(intValor)
'Aadimos un nuevo valor
strMiArray(intValor) = intValor
'Mostramos los valores del array
Mostrar_Datos(strMiArray)
End Sub
En este ejemplo, hemos podido ver cmo aadir una imagen al portapapeles
y cmo recuperarla al hacer clic sobre el botn. Nuestra aplicacin en ejecucin despus de recuperar el contenido de la imagen del portapapeles, es el
que puede verse en la figura 20.4. Este mismo cdigo puede ser simplificado accediendo directamente al portapapeles. El cdigo anterior por tanto,
podra quedar como se detalla a continuacin:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles MyBase.Load
418 Captulo 20
'La aplicacin se ejecuta en el directorio bin, por lo
'que es necesario bajar un nivel y recoger la imagen
Dim MiImagen As New
System.Drawing.Bitmap("..\Imagen.jpg")
'Copiamos al portapapeles la imagen
Dim Objeto_de_Datos As New DataObject()
Objeto_de_Datos.SetData(DataFormats.Bitmap, True,
MiImagen)
Clipboard.SetDataObject(Objeto_de_Datos, True)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
'Si hay datos en el portapapeles
If Not (Clipboard.GetDataObject() Is Nothing) Then
'Vaciamos el control PictureBox1
PictureBox1.Image = Nothing
Try
'Mostramos la imagen
PictureBox1.Image =
Clipboard.GetDataObject().GetData("Bitmap")
Catch ex As Exception
'Si hay error vaciamos el control PictureBox1
PictureBox1.Image = Nothing
End Try
End If
End Sub
En este caso, hemos reducido el cdigo un poco y hemos declarado alguna variable en otro lugar, cambiando la ubicacin de declaracin.
Ahora bien, quizs nuestro deseo sea el de mostrar texto. En este
caso, recuperar los datos de texto del portapapeles es igualmente
fcil.
420 Captulo 20
sora, ese dispositivo que tantos quebraderos de cabeza da al programador.
La primera porcin de cdigo que vamos a presentar, ser la posibilidad
de mostrar todas las impresoras instaladas en el sistema.
El cdigo de esta utilidad, es el siguiente, suponiendo que hemos insertado en el formulario un control ListBox:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles MyBase.Load
Dim strImpresoras As String
ListBox1.Items.Clear()
For Each strImpresoras In
System.Drawing.Printing.PrinterSettings.InstalledPrinters
ListBox1.Items.Add(strImpresoras)
Next
End Sub
Truco
Podemos utilizar el nombre de espacio de acceso a las impresoras
instaladas en el sistema o bien el complemento PrintDocument.
En este caso, accederamos a las impresoras instaladas en el
sistema mediante la llamada a PrintDocument1.PrinterSettings
.PrinterName.
A continuacin, veremos otros ejemplos diferentes de trabajo con otras
funciones de inters general para el programador.
422 Captulo 20
.SolidColorOnly = True
'Abrimos la ventana de seleccin de
'colores; Si se selecciona un color
'se pinta el objeto con ese color
If .ShowDialog() = DialogResult.OK Then
Label1.BackColor = .Color
End If
'Limpiamos el componente de colores
'para poder utilizarlo nuevamente
'recargando todos los colores
.Reset()
End With
End Sub
Este efecto de arrastrar y soltar es muy til para desarrollo de aplicaciones en los que se requiera operaciones rpidas y efectivas de mover datos
entre controles.
424 Captulo 20
<nombre>Roberto</nombre>
<apellidos>Sanchez Lopez</apellidos>
<edad>16</edad>
</alumno>
<alumno>
<nombre>Fernando</nombre>
<apellidos>Sanz Ruiz</apellidos>
<edad>16</edad>
</alumno>
<alumno>
<nombre>Maria</nombre>
<apellidos>Toribio Gomez</apellidos>
<edad>17</edad>
</alumno>
<alumno>
<nombre>Rosa</nombre>
<apellidos>Fernandez Solis</apellidos>
<edad>16</edad>
</alumno>
</Alumnos>
426 Captulo 20
A continuacin, veremos el cdigo fuente relacionado con nuestra aplicacin.
Form1.vb
Public Class Form1
Inherits System.Windows.Forms.Form
...
Private Const App_Titulo As String = "Lista de Elementos"
Private Const inputbox_Pregunta As String = "Introduzca el
elemento a aadir en la lista de elemento"
Private Const msgbox_Eliminar As String = "Debe seleccionar
al menos un elemento para poder eliminarlo de la lista de
elementos"
'Funcin para mostrar los elementos cargados en el control
ListBox1
Private Sub Elementos_ListBox1()
Label1.Text = ListBox1.Items.Count &
IIf(ListBox1.Items.Count = 1, " Elemento", " Elementos")
End Sub
428 Captulo 20
For I = 1 To UBound(Elementos_Indices) + 1
ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
Next
Elementos_ListBox1()
Elementos_ListBox2()
End Sub
Private Sub btnSelectIzq_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
btnSelectIzq.Click
'Pasamos los elementos seleccionados del control
ListBox2 al control ListBox1
'Primero pasamos los ndices y los elementos a una
matriz
Dim Elementos_Indices(ListBox2.SelectedIndices.Count 1) As Integer
Dim Elementos_Cadenas(ListBox2.SelectedIndices.Count 1) As String
ListBox2.SelectedIndices.CopyTo(Elementos_Indices, 0)
ListBox2.SelectedItems.CopyTo(Elementos_Cadenas, 0)
'Ahora recorremos la matriz y aadimos
'los elementos seleccionados al control ListBox1
'y posteriormente eliminamos los elementos
'seleccionados del control ListBox2
Dim I As Integer
'Aadimos los elementos seleccionados del control
ListBox2 al control ListBox1
For I = 1 To UBound(Elementos_Indices) + 1
ListBox1.Items.Add(Elementos_Cadenas(I - 1))
Next
'Eliminamos los elementos seleccionados del control
ListBox2
For I = 1 To UBound(Elementos_Indices) + 1
ListBox2.Items.RemoveAt(ListBox2.SelectedIndex)
Next
Elementos_ListBox1()
Elementos_ListBox2()
End Sub
Private Sub btnTodosIzq_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
btnTodosIzq.Click
'Pasa todos los elementos del control ListBox2 al
control ListBox1
While ListBox2.Items.Count > 0
ListBox2.SelectedIndex = ListBox2.Items.Count - 1
ListBox1.Items.Add(ListBox2.SelectedItem)
ListBox2.Items.RemoveAt(ListBox2.SelectedIndex)
End While
430 Captulo 20
432 Captulo 20
End With
End Sub
End Class
Uso de delegados
Cuando hablamos de delegados para un programador de Visual Basic,
hablamos de algo que a buen seguro es desconocido o al menos desconcertante.
La definicin vulgar de delegado es la que corresponde a un puntero de
una funcin y proporciona interesantes caractersticas de programacin a
un programador.
La particularidad de los delegados, es que pueden hacer referencia a
funciones Shared y a los mtodos de una instancia, guardando la referencia al punto de entrada del mtodo y la referencia a la instancia del
objeto con el cual se va a llamar al mtodo.
La clase System.Delegate, hereda los miembros de un delegado. Un
delegado pasa por tres fases fundamentales, que corresponden con la
declaracin del delegado, la instancia que se crea del delegado, y por
ltimo, la invocacin del delegado desde nuestra aplicacin.
La mejor forma de trabajar con delegados es trabajando con un ejemplo
que nos ensee cmo se declara, se crea y se invoca un delegado. Para
ello, iniciaremos una nueva aplicacin de Windows y dentro del cdigo,
declararemos el delegado y crearemos una nueva clase que utilizaremos
en el uso de nuestro delegado. El cdigo fuente del ejemplo de programacin de un delegado es el siguiente:
Form1.vb
Delegate Sub MiDelegado(ByVal I As Integer)
Public Class Form1
Inherits System.Windows.Forms.Form
...
Private Sub Form1_Load(ByVal sender As System.Object, ByVal
Nuestra aplicacin en ejecucin permite ejecutar el delegado de forma correcta, permitiendo pasar el resultado del valor a la clase
principal desde la cual hemos creado y llamado al delegado correspondiente.
434 Captulo 20
Por tanto, en nuestro formulario, aadiremos tanto el componente como
el control indicado. En el componente ImageList, modificaremos la propiedad Images a la que aadiremos un conjunto de imgenes que debern poseer el mismo tamao.
A continuacin, modificaremos algunas propiedades del control ToolBar.
Entre ellas, la propiedad Appearance para darla el valor True y la propiedad Buttons
Buttons, la cual modificaremos para aadir un conjunto de botones a nuestra barra de botones.
Dentro de cada botn, podremos modificar una o ms propiedades asociadas a cada botn. Entre ellas, la propiedad ToolTipText es la propiedad ms destacable, y la utilizaremos para asignar la ayuda emergente
del botn que aparecer al acercar el puntero del ratn sobre un determinado botn.
Para asignar un separador entre botones dentro de la barra de botones,
aadiremos un botn y modificaremos la propiedad Style para darle el
valor Separator que asignar un separador real entre los botones de la
barra de botones.
No se necesita por tanto, aadir cdigo a nuestra aplicacin para asignar
una barra de botones. De hecho, nuestro ejemplo de prueba en ejecucin
es el que se muestra en la figura 20.9.
Como vemos, la modificacin y utilizacin de estos controles es realmente sencilla. Estos controles suelen utilizarse en muchas aplicaciones Windows y su uso es casi idntico aunque sean controles
diferentes.
436 Captulo 20
438 Captulo 20
Esta porcin de cdigo, nos permite extraer la versin de Microsoft .NET
Framework instalada en la mquina.
Resumen
Este captulo, ha tratado de recoger un conjunto de ejemplos que suelen
ser usados con frecuencia por los desarrolladores.
Estos ejemplos, consejos y trucos, tratan de ayudar al programador para
facilitarle la tarea de trabajo, indicndole algunas pistas a la hora de trabajar con Visual Basic .NET. Desde estas pistas variadas entre s, podr
aumentar sus conocimientos.
440 Captulo 20
El truco de todo programador de Visual Basic .NET, est en el conocimiento de las clases y mtodos que posee Microsoft .NET Framework.
Una vez conozcamos las clases y mtodos, estaremos cada vez ms preparados para hacer frente a cualquier proyecto que se nos cruce.
El problema es que dentro de .NET Framework existen miles de clases y
mtodos, y es completamente imposible no slo aprendernos todos en
poco tiempo, sino hacer un libro en el que se incluyan cada una con su
explicacin y definicin.
Slo con la prctica, se puede comprender la teora, prctica que he tratado de realizar a lo largo de todos los captulos del libro, haciendo de este
libro, un libro ms didctico que divulgativo, ya que se presupone que el
lector tiene unos conocimientos slidos sobre el lenguaje y la plataforma.