100% encontró este documento útil (1 voto)
1K vistas29 páginas

Arreglos en Visual Basic

Este documento describe los arreglos de dos dimensiones en Visual Basic .NET. Los arreglos permiten agrupar conjuntos de variables con un nombre para poder manipularlas juntas o individualmente. Los arreglos en VB.NET pueden tener hasta 32 dimensiones y todos sus elementos deben ser del mismo tipo. Se definen usando Dim y se pueden acceder a sus elementos mediante índices.

Cargado por

Yelialex
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
1K vistas29 páginas

Arreglos en Visual Basic

Este documento describe los arreglos de dos dimensiones en Visual Basic .NET. Los arreglos permiten agrupar conjuntos de variables con un nombre para poder manipularlas juntas o individualmente. Los arreglos en VB.NET pueden tener hasta 32 dimensiones y todos sus elementos deben ser del mismo tipo. Se definen usando Dim y se pueden acceder a sus elementos mediante índices.

Cargado por

Yelialex
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Arreglos en Visual Basic .

Net
Uso de Arreglos de dos dimensiones
Los Arrays o arreglos son conjuntos de Variables Agrupadas con un nombre, que
se pueden manejar juntas o individualmente, en Visual Basic .Net se pueden tener
arreglos desde una dimensin y hasta un mximo de 32 dimensiones.

Como se definen
Para definir un arrays se utiliza Dim, Private, Friend o Public segn el alcande del
mismo, por ejemplo la orden:
Dim Cursos( , ) As String
Define el array Cursos sin asignarle la cantidad de elementos de cada dimensin. El
array anterior tendr que redefinirse a nivel de procedimiento usando la instruccin
Redim, est funciona unicamente cambiando el tamao de la ltima dimensin.
Generalmente se usa una variable que va aumentando, suponer que la variable
Incluidos es la utilizada, la instruccin podra ser como la siguiente:
Redim Cursos(2,Incluidos)
y para conservar los datos actuales en el Array se utiliza la palabra Preserve:
Redim Preserve Cursos(2,Incluidos)

Algo de lo que contiene


Todos los elementos del arrays deben ser del mismo tipo.En Visual Studio .Net los
arrays derivan de la clase Arrays del NameSpace System. Esta Clase (Array)
proporciona los mtodos para crear, manipular, realizar busquedas y ordenacin de
arrays.
Un elemento es un valor de Array, al que se puede acceder haciendo uso del indice o
indices segn las dimensiones. Por ejemplo, para acceder al elemento de la segunda
fila y la tercera columna del arrays bidimensional con nombre Cursos se debe escribir
Cursos(1,2), cabe adelantar que en Visual Basic .Net el valor inicial de cada
dimensin es CERO. El mtodo GetLowerBound permite obtener el lmite inferior de
una determinada dimensin. Para el lmite superior de la dimensin especificada se
utiliza el mtodo GetUpperBound.
La longitud de Array es el nmero total de elementos que puede contener. El mtodo
GetLength permite obtener el nmero de elementos de un array.
El rango de Array es el nmero de dimensiones de Array. La Propiedad Rank permite
obtener el nmero de dimensiones de una array.

Arrays
Aspectos bsicos
Tambin conocido con las denominaciones de matriz y vector, un array es aquel elemento del
lenguaje que nos permite agrupar un conjunto de valores del mismo tipo, y acceder a ellos a travs
de una misma variable o identificador, especificando la posicin o ndice en donde se encuentra el
dato a recuperar. El Cdigo fuente 350, muestra las operaciones esenciales que podemos realizar
con un array.
Sub Main()
' declarar un array de tipo String,
' el nmero de elementos es el indicado
' en la declaracin ms uno, porque la primera
' posicin de un array es cero
Dim sNombres(3) As String
' asignar valores al array
sNombres(0) = "Ana"
sNombres(1) = "Pedro"
sNombres(2) = "Antonio"
sNombres(3) = "Laura"
' pasar un valor del array a una variable
Dim sValor As String
sValor = sNombres(2)
' mostrar en la consola el valor pasado a una variable
' y un valor directamente desde el array
Console.WriteLine("Valor de la variable sValor: {0}", sValor)
Console.WriteLine("Valor del array, posicin 1: {0}", sNombres(1))
Console.ReadLine()
End Sub

A lo largo de este texto, emplearemos de forma genrica el trmino array, para referirnos a este
elemento del lenguaje. Por otra parte, recomendamos al lector la creacin de un nuevo proyecto en
el IDE de tipo consola, para realizar las pruebas mostradas a lo largo del tema.

La clase Array
Esta clase, perteneciente a la jerarqua de clases del sistema, es decir, incluida en el espacio de
nombres System, proporciona a travs de sus miembros, acceso orientado a objeto para los arrays
que manipulemos en nuestras aplicaciones. Esto quiere decir que los arrays, como sucede con otros
elementos del lenguaje, son tambin objetos. Al igual que el resto de elementos del entorno, los
arrays son tipos pertenecientes al sistema comn de tipos de la plataforma o CTS, y se encuentran
clasificados como tipos por referencia; esto quiere decir, que durante la ejecucin, un array ser
gestionado en la zona de memoria conocida como montn o heap.
Aunque podemos trabajar con los arrays como objetos, no ser necesario instanciar un objeto de
esta clase para poder disponer de un array. Al declarar una variable como array, implcitamente se
instancia un objeto de la clase. En sucesivos apartados de este tema, haremos una descripcin de los
miembros de instancia y compartidos ms importantes de la clase Array.

Adecuacin de los arrays en VB con los arrays de la


plataforma .NET
Los arrays son uno de los elementos de VB que menos han evolucionado a lo largo de las sucesivas
versiones aparecidas de este lenguaje. Todo esto, sin embargo, ha cambiado con la llegada de la
plataforma .NET.

La especificacin CLS del entorno .NET, dicta que todos los lenguajes que cumplan con la misma,
podrn ser utilizados bajo .NET Framework. Esto quiere decir adems, que dos ensamblados
escritos en distintos lenguajes de la plataforma, podrn compartir cdigo entre ellos. En el caso que
nos ocupa, una aplicacin VB.NET podr llamar a un mtodo de un objeto escrito en C# que
devuelva un array, y dicho array, ser manejado desde VB.NET.
Los diseadores de .NET han realizado un gran esfuerzo en proporcionar la mxima optimizacin y
versatilidad a los arrays, siempre y cuando, el lenguaje del entorno que los utilice, cumpla con unos
mnimos requerimientos. En este aspecto, VB.NET como lenguaje, ha obtenido toda la potencia de
base inherente en el sistema para la creacin y manipulacin de arrays; mientras que como
contrapartida, ciertas caractersticas exclusivas en VB para el manejo de arrays han necesitado ser
readaptadas. Algunas de estas caractersticas se describen a continuacin.

El primer ndice de un array debe ser siempre cero


VB.NET no soporta la instruccin Option Base, que nos permita indicar que el primer ndice de un
array poda ser cero o uno. Por lo tanto, al declarar ahora un array en VB.NET, su nmero de
elementos ser el indicado en la declaracin ms uno. Veamos las diferencias en el Cdigo
Cdigo VB6
==========
Option Base 1
Public Sub Main()
Dim sNombres(2) As String
sNombres(1) = "Pedro"
sNombres(2) = "Ana"
End Sub
Cdigo VB.NET
=============
Public Sub Main()
' array de 3 elementos
Dim sNombres(2) As String
sNombres(0) = "Pedro"
sNombres(1) = "Ana"
sNombres(2) = "Jaime"
End Sub

No es posible crear arrays con rangos de ndices


La caracterstica que en VB6, nos permita declarar un array en el que sus ndices estuvieran en un
intervalo, tampoco se admite ya en VB.NET. Al tener los arrays que comenzar por cero en su
primer ndice, los rangos de ndices han dejado de tener sentido. Ver Cdigo fuente 352.
Cdigo VB6, no soportado en VB.NET
==================================
Public Sub Main()
' array de 4 elementos, entre los
' ndices 5 y 8
Dim Nombres(5 To 8) As String
Nombres(5) = "Pedro"
Nombres(6) = "Ana"
Nombres(7) = "Jaime"
Nombres(8) = "Elena"
End Sub

Todos los arrays son dinmicos


En VB6, dependiendo del modo de creacin de un array, este poda ser esttico, es decir, con un
nmero fijo e invariable de elementos; o bien dinmico, es decir, su nmero de elementos poda ser
modificado en tiempo de ejecucin.

En VB.NET sin embargo, todos los arrays son de tamao variable, tanto si se especifica como no un
tamao al ser declarados. En este punto debemos matizar un aspecto: cada vez que en VB.NET se
cambia el tamao de un array, el entorno internamente destruye el array actual, y crea un nuevo
objeto de la clase Array, con el nuevo tamao especificado, usando el mismo nombre de la variable
correspondiente al array eliminado en primer lugar.

Declaracin
Declararemos un array de igual forma que hacemos con una variable normal, con la excepcin de
que junto al nombre de la variable, situaremos unos parntesis. Esto indica que dicha variable
contiene un array. Opcionalmente, podemos especificar entre los parntesis las dimensiones del
array, o nmero de elementos que va a contener. Es posible tambin, realizar una asignacin de
valores al array en el mismo momento de su declaracin. El Cdigo fuente 353, muestra algunos
ejemplos.
Sub Main()
' formas de declaracin de arrays
' ===============================
' 1)
' estableciendo el nmero de elementos
Dim sNombres(2) As String
' 2)
' asignando valores al array al mismo tiempo que se declara,
' la lista de valores debe ir encerrada entre llaves
Dim sEstaciones() As String = {"Ana", "Pedro", "Luis"}
' 3)
' indicando el tipo de dato pero no el nmero de elementos,
' de este modo la variable todava no es considerada un array
' ya que contiene una referencia a Nothing
Dim iValores() As Integer
' 4)
' indicando el tipo de dato y estableciendo una
' lista vaca de elementos,
' a diferencia del caso anterior, la variable ahora s
' es considerada un array aunque de longitud cero
Dim iDatos() As Integer = {}
' 5)
' instanciando el tipo de dato, estableciendo el nmero
' de elementos al instanciar, e indicando que se trata de un array
' al situar las llaves
Dim iCantidades() As Integer = New Integer(20) {}
' 6)
' declarar primero la variable que contendr el array,
' asignar valores al array al mismo tiempo que se instancia
' la lista de valores debe ir encerrada entre llaves
Dim iNumeros() As Integer
iNumeros = New Integer() {10, 20, 30, 10, 50, 60, 10, 70, 80}
End Sub

Recomendamos al lector, que en estos ejemplos con arrays, utilice el depurador para ejecutar lnea a
lnea el cdigo, y abra la ventana Locales del depurador para ver en cada caso, el contenido de los
elementos del array.

Asignacin y obtencin de valores


Para asignar u obtener valores de los elementos de un array, emplearemos la variable que contiene
el array haciendo referencia al ndice o posicin a manipular. O bien, puesto que un array es un
objeto, utilizaremos los mtodos SetValue( ) y GetValue( ) que asignan y obtienen respectivamente
los valores del array. Veamos un ejemplo en el Cdigo fuente 354.

Sub Main()
' asignacin de valores a los elementos de un array
' =================================================
Dim sNombres(4) As String
' directamente sobre la variable,
' haciendo referencia al ndice
sNombres(0) = "Juan"
sNombres(1) = "Ana"
sNombres(2) = "Luis"
' o con el mtodo SetValue(), asignando el
' valor en el primer parmetro y especificando
' la posicin en el segundo
sNombres.SetValue("Elena", 3)
sNombres.SetValue("Miguel", 4)
' obtencin de valores de un array
' ================================
Dim sValorA As String
Dim sValorB As String
sValorA = sNombres(2) ' directamente de la variable
sValorB = sNombres.GetValue(3) ' usando el meth GetValue
Console.WriteLine("Contenido de las variables")
Console.WriteLine("==========================")
Console.WriteLine("ValorA: {0} -- ValorB: {1}", sValorA, sValorB)
Console.ReadLine()
End Sub

Recorrer el contenido
Para realizar un recorrido por los elementos de un array, disponemos de las funciones LBound( ) y
UBound( ), que devuelven el nmero de ndice inferior y superior respectivamente del array que
pasemos como parmetro. No obstante, la orientacin a objetos proporcionada por el entorno, pone
a nuestra disposicin el nuevo conjunto de caractersticas que comentamos seguidamente.
Length. Esta propiedad de un objeto array devuelve el nmero de elementos que contiene.
GetLowerBound( ), GetUpperBound( ). Estos mtodos de un objeto array, devuelven
respectivamente, el nmero de ndice inferior y superior de una dimensin del array. El resultado es
el mismo que usando LBound( ) y UBound( ), pero desde una perspectiva orientada a objetos.
Enumeradores. Un objeto enumerador pertenece al interfaz IEnumerator, diseado para realizar
un recorrido o iteracin a travs de uno de los diferentes tipos de coleccin (arrays incluidos)
existentes en .NET Framework. Mediante el mtodo GetEnumerator( ) de un objeto array,
obtenemos un objeto que implementa el interfaz Ienumerator, que slo puede realizar labores de
lectura sobre el array, en ningn caso de modificacin.
La estructura de control utilizada para recorrer el array, puede ser indistintamente un bucle
For...Next, For Each...Next, o la novedosa tcnica de los objetos enumeradores proporcionados por
el objeto array.
Como muestra de estas funcionalidades, el Cdigo fuente 355 que vemos a continuacin, contiene
algunos ejemplos de cmo realizar una iteracin sobre los elementos de un array.
Sub Main()
' recorrer un array
' =================
Dim sNombres() As String = {"Ana", "Luis", "Pablo"}
Dim iContador As Integer
Dim sUnNombre As String
' modo tradicional
Console.WriteLine("Recorrido del array con LBound() y UBound()")
For iContador = LBound(sNombres) To UBound(sNombres)
Console.WriteLine("Posicion: {0} - Valor: {1}", _

iContador, sNombres(iContador))
Next
Console.WriteLine()
' con bucle For Each
Console.WriteLine("Recorrido del array con bucle For Each")
For Each sUnNombre In sNombres
Console.WriteLine("Nombre actual: {0}", sUnNombre)
Next
Console.WriteLine()
' usando la propiedad Length
Console.WriteLine("Recorrido del array con propiedad Length")
For iContador = 0 To (sNombres.Length - 1)
Console.WriteLine("Posicion: {0} - Valor: {1}", _
iContador, sNombres(iContador))
Next
Console.WriteLine()
' usando los mtodos GetLowerBound() y GetUpperBound()
Console.WriteLine("Recorrido del array con mtodos GetLowerBound() y
GetUpperBound()")
For iContador = sNombres.GetLowerBound(0) To sNombres.GetUpperBound(0)
Console.WriteLine("Posicion: {0} - Valor: {1}", _
iContador, sNombres(iContador))
Next
Console.WriteLine()
' recorrer con un enumerador
Console.WriteLine("Recorrido del array con un enumerador")
Dim sLetras() As String = {"a", "b", "c", "d"}
Dim oEnumerador As System.Collections.IEnumerator
' obtener el enumerador del array
oEnumerador = sLetras.GetEnumerator()
' con un enumerador no es necesario posicionarse
' en el primer elemento ni calcular la cantidad
' de elementos del array, slo hemos de avanzar
' posiciones con MoveNext() y obtener el valor
' actual con Current
While oEnumerador.MoveNext()
Console.WriteLine("Valor actual: {0}", oEnumerador.Current)
End While
Console.ReadLine()
End Sub

Modificacin de tamao
Para aumentar o disminuir el nmero de elementos de un array disponemos de la palabra clave
ReDim. Esta instruccin crea internamente un nuevo array, por lo que los valores del array original
se pierden.
Evitaremos este problema utilizando junto a ReDim la palabra clave Preserve, que copia en el
nuevo array, los valores del array previo. Veamos unos ejemplos en el Cdigo fuente 356.
Sub Main()
' modificar el tamao de un array
' ===============================
Dim sNombres(2) As String
sNombres(0) = "Juan"
sNombres(1) = "Pedro"
sNombres(2) = "Elena"
Console.WriteLine("Array sNombres original")
MostrarArray(sNombres)
' ampliamos el nmero de elementos
' pero perdemos el contenido previo
ReDim sNombres(4)

sNombres(3) = "Isabel"
sNombres(4) = "Raquel"
Console.WriteLine("Array sNombres con tamao ampliado")
MostrarArray(sNombres)
' creamos otro array
Dim sMasNombres(2) As String
sMasNombres(0) = "Juan"
sMasNombres(1) = "Pedro"
sMasNombres(2) = "Miguel"
Console.WriteLine("Array sMasNombres original")
MostrarArray(sMasNombres)
' ampliamos el array sin perder elementos
ReDim Preserve sMasNombres(4)
sMasNombres(3) = "Antonio"
sMasNombres(4) = "Paco"
Console.WriteLine("Array sMasNombres ampliado sin perder valores")
MostrarArray(sMasNombres)
' reducimos el array, pero sin perder los
' primeros elementos
ReDim Preserve sMasNombres(1)
Console.WriteLine("Array sMasNombres reducido")
MostrarArray(sMasNombres)
Console.ReadLine()
End Sub
Private Sub MostrarArray(ByVal sMiLista() As String)
' este es un procedimiento de apoyo que
' muestra el array pasado como parmetro
Dim iContador As Integer
For iContador = 0 To sMiLista.Length - 1
Console.WriteLine("Elemento: {0} - Valor: {1}", _
iContador, sMiLista(iContador))
Next
Console.WriteLine()
End Sub

Uso del mtodo CreateInstance( ) para establecer el


nmero de elementos en un array
Ya hemos comprobado que al crear un array en VB.NET, el primer ndice es siempre cero, y
adems, el nmero de elementos del array es el indicado en la declaracin ms uno.
Sin embargo, la clase Array dispone del mtodo compartido CreateInstance( ), que como su nombre
indica, permite crear una nueva instancia de la clase, es decir un objeto array, con la particularidad
de que en este caso, el nmero de elementos del array ser realmente el que establezcamos al llamar
a este mtodo.
El Cdigo fuente 357, muestra la diferencia entre crear un array del modo habitual, y empleando
CreateInstance( ).
Sub Main()
' declarar un array del modo habitual:
' este array tiene cuatro elementos,
' desde el ndice 0 al 3
Dim sEstaciones(3) As String
sEstaciones(0) = "Primavera"
sEstaciones(1) = "Verano"
sEstaciones(2) = "Otoo"
sEstaciones(3) = "Invierno"
Console.WriteLine("Array sEstaciones")
MostrarArray(sEstaciones)
' crear un array instancindolo
' con el mtodo CreateInstance()

' de la clase Array


Dim sColores As Array
' este array tendr tres elementos reales
' que van desde el ndice 0 hasta el 2
sColores = Array.CreateInstance(GetType(String), 3)
sColores(0) = "Azul"
sColores(1) = "Rojo"
sColores(2) = "Verde"
Console.WriteLine("Array sColores")
MostrarArray(sColores)
Console.ReadLine()
End Sub
Private Sub MostrarArray(ByVal sMiLista() As String)
' muestra el array pasado como parmetro
Dim iContador As Integer
For iContador = 0 To sMiLista.Length - 1
Console.WriteLine("Elemento: {0} - Valor: {1}", _
iContador, sMiLista(iContador))
Next
Console.WriteLine()
End Sub

Paso de arrays como parmetros, y devolucin desde


funciones
Podemos pasar un array como parmetro a una rutina de cdigo, teniendo en cuenta que los
cambios que realicemos sobre el array en el procedimiento llamado, se mantendrn al volver el flujo
de la ejecucin al procedimiento llamador.
Ello es debido a que los arrays son tipos por referencia del entorno, y por lo tanto, las variables del
array que manejamos tanto desde el procedimiento llamador, como desde el procedimiento llamado,
son en realidad punteros hacia una misma zona de memoria o referencia, la que contiene el array.
En el ejemplo del Cdigo fuente 358, comprobaremos que al pasar un array por valor, los cambios
que realicemos sobre sus elementos se mantendrn al volver al procedimiento que hizo la llamada.
Sub Main()
Dim iValores() As Integer = {10, 20, 30}
' en ambos casos, se pasa una referencia del array
ManipArrayVal(iValores)
ManipArrayRef(iValores)
' al volver de las llamadas a los procedimientos,
' el array ha sido modificado en ambas llamadas,
' independientemente de que haya sido pasado por
' valor o referencia
MostrarArray(iValores)
Console.ReadLine()
End Sub
' a este procedimiento le pasamos un array por valor
Private Sub ManipArrayVal(ByVal iListaPorValor As Integer())
' cambiar elemento del array
iListaPorValor(0) = 888
End Sub
' a este procedimiento le pasamos un array por referencia
Private Sub ManipArrayRef(ByRef iListaPorReferencia As Integer())
' cambiar elemento del array
iListaPorReferencia(2) = 457
End Sub
Private Sub MostrarArray(ByVal sMiLista() As Integer)

' muestra el array pasado como parmetro


Dim iContador As Integer
For iContador = 0 To sMiLista.Length - 1
Console.WriteLine("Elemento: {0} - Valor: {1}", _
iContador, sMiLista(iContador))
Next
Console.WriteLine()
End Sub

Clonacin
Para evitar el problema planteado en el apartado anterior, si necesitamos disponer de un array con
las mismas caractersticas que uno ya existente, y que sea totalmente independiente del primero,
utilizaremos el mtodo Clone( ). Con esto solucionaremos el problema de que al pasar un array
como parmetro, las modificaciones que precisemos realizar, afecten al array original. Veamos un
ejemplo en el Cdigo fuente 359.
Sub Main()
' crear un array
Dim iValores() As Integer = {10, 20, 30}
CambiaArray(iValores)
' mostrar el array original,
' en este no se habrn producido cambios
Console.WriteLine("Array original")
MostrarArray(iValores)
Console.ReadLine()
End Sub
Private Sub CambiaArray(ByVal iListaDatos As Integer())
' crear un array clnico,
' cambiarle valores y mostrarlo
Dim iListaClonada As Array
iListaClonada = iListaDatos.Clone()
iListaClonada(0) = 621
iListaClonada(1) = 900
Console.WriteLine("Array clnico")
MostrarArray(iListaClonada)
End Sub
Private Sub MostrarArray(ByVal sMiLista() As Integer)
Dim iContador As Integer
For iContador = 0 To sMiLista.Length - 1
Console.WriteLine("Elemento: {0} - Valor: {1}", _
iContador, sMiLista(iContador))
Next
Console.WriteLine()
End Sub

Copia
Si intentamos copiar un array asignando la variable que contiene un array a otra, el resultado real
sern dos variables que apuntan a la misma lista de valores, por lo que en definitiva slo tendremos
un array, al cual podremos acceder usando dos variables. Ello es debido a que como explicamos en
un apartado anterior, los arrays son tipos por referencia que apuntan al mismo conjunto de valores.
Podemos clonar el array, como se ha descrito en el apartado anterior, con lo que obtendremos un
nuevo array, que ser idntico al original.
O bien, podemos copiar el array utilizando los mtodos CopyTo( ) y Copy( ) de la clase array. La
diferencia con respecto a la clonacin, consiste en que al copiar un array, el array destino ya debe
estar creado con el nmero suficiente de elementos, puesto que los mtodos de copia de la clase

Array, lo que hacen es traspasar valores de los elementos del array origen al array destino, en
funcin de los parmetros utilizados, copiaremos todos los elementos o un subconjunto. Veamos
unos ejemplos en el Cdigo fuente 360.
Sub Main()
Dim sColores(3) As String
sColores(0) = "Azul"
sColores(1) = "Verde"
sColores(2) = "Rosa"
sColores(3) = "Blanco"
MostrarArray(sColores)
' copiar usando el mtodo CopyTo(),
' copiamos en el array sColorDestino,
' y comenzando por su posicin 2, los
' valores del array sColores
Dim sColorDestino(6) As String
sColores.CopyTo(sColorDestino, 2)
Console.WriteLine("Array sColorDestino")
MostrarArray(sColorDestino)
' copiar usando el mtodo Copy(),
' copiamos en el array sListaColores,
' a partir de su posicin 2,
' 2 elementos del array sColores, comenzando
' desde la posicin 1 de sColores
Dim sListaColores(5) As String
Array.Copy(sColores, 1, sListaColores, 2, 2)
Console.WriteLine("Array sListaColores")
MostrarArray(sListaColores)
Console.ReadLine()
End Sub
Private Sub MostrarArray(ByVal sMiLista() As String)
Dim iContador As Integer
For iContador = 0 To sMiLista.Length - 1
Console.WriteLine("Elemento: {0} - Valor: {1}", _
iContador, sMiLista(iContador))
Next
Console.WriteLine()
End Sub

Inicializacin de valores
Para inicializar o eliminar los valores de los elementos de un array, utilizaremos el mtodo Clear, al
que pasaremos el array a inicializar, el ndice a partir del que comenzaremos, y el nmero de
elementos.
Los valores sern inicializados en funcin del tipo de dato del array; cadena vaca en arrays String;
cero en arrays numricos, etc Veamos el Cdigo fuente 361.
Sub Main()
' array String, asignar valores e inicializar
Dim sLetras(2) As String
sLetras(0) = "a"
sLetras(1) = "b"
sLetras(2) = "c"
' limpiar elementos en un array de tipo String,
' los elementos limpiados quedan como cadena vaca
Array.Clear(sLetras, 0, 1)
Console.WriteLine("Array sLetras")
MostrarArray(sLetras)
' array Integer, asignar valores e inicializar
Dim iNumeros() As Integer = {100, 200, 300, 400, 500, 600}

' limpiar elementos en un array de tipo Integer,


' los elementos limpiados se ponen a 0
Array.Clear(iNumeros, 1, 2)
Console.WriteLine("Array iNumeros")
MostrarArrayNum(iNumeros)
' array Object, asignar valores e inicializar
Dim oVarios(6) As Object
oVarios(0) = "Hola"
oVarios(1) = 456
oVarios(2) = 1200
oVarios(3) = #12/25/2001#
oVarios(4) = 900
oVarios(5) = True
oVarios(6) = "adelante"
' al ser este un array de tipo Object
' los elementos limpiados se establecen a Nothing
Array.Clear(oVarios, 3, 2)
Console.WriteLine("Array oVarios")
MostrarArrayObj(oVarios)
Console.ReadLine()
End Sub
' recorrer un array de cadenas
Private Sub MostrarArray(ByVal sMiLista() As String)
Dim iContador As Integer
For iContador = 0 To sMiLista.Length - 1
Console.WriteLine("Elemento: {0} - Valor: {1}", _
iContador, sMiLista(iContador))
Next
Console.WriteLine()
End Sub
' recorrer un array de nmeros
Private Sub MostrarArrayNum(ByVal iMiLista() As Integer)
Dim iContador As Integer
For iContador = 0 To iMiLista.Length - 1
Console.WriteLine("Elemento: {0} - Valor: {1}", _
iContador, iMiLista(iContador))
Next
Console.WriteLine()
End Sub
' recorrer un array de objetos
Private Sub MostrarArrayObj(ByVal oMiLista() As Object)
Dim iContador As Integer
For iContador = 0 To oMiLista.Length - 1
Console.WriteLine("Elemento: {0} - Valor: {1}", _
iContador, oMiLista(iContador))
Next
Console.WriteLine()
End Sub

Ordenacin
Para ordenar un array disponemos del mtodo Sort( ), que al estar sobrecargado, tiene varias
implementaciones; la ms bsica de ellas es la que ordena la totalidad del array. Tambin podemos
ordenar una parte del array, indicando la posicin inicial y cantidad de elementos a ordenar, etc.
El mtodo Reverse( ), invierte la posicin de todos o parte de los elementos de un array. En este
punto, debemos matizar que no se realiza un orden inverso de los elementos, sino que se cambian
las posiciones de los mismos. Ver Cdigo fuente 362.
Sub Main()
' ordenar todo el array
Dim sLetras1() As String = {"z", "a", "g", "m", "w", "i", "c", "b"}
Array.Sort(sLetras1)

Console.WriteLine("Ordenar todos el array")


MostrarArray(sLetras1)
' ordenar parte del array
Dim sLetras2() As String = {"z", "a", "g", "m", "w", "i", "c", "b"}
Array.Sort(sLetras2, 4, 3)
Console.WriteLine("Ordenar parte del array")
MostrarArray(sLetras2)
' invertir valores dentro del array
Dim sLetras3() As String = {"z", "a", "g", "m", "w", "i", "c", "b"}
Array.Reverse(sLetras3, 2, 4)
Console.WriteLine("Invertir valores del array")
MostrarArray(sLetras3)
Console.ReadLine()
End Sub
Private Sub MostrarArray(ByVal sMiLista() As String)
Dim iContador As Integer
For iContador = 0 To sMiLista.Length - 1
Console.WriteLine("Elemento: {0} - Valor: {1}", _
iContador, sMiLista(iContador))
Next
Console.WriteLine()
End Sub

Bsqueda
Los mtodos IndexOf( ) y LastIndexOf( ) de la clase Array, nos permiten buscar un elemento en un
array comenzando la bsqueda desde el principio o final respectivamente.
Ya que ambos disponen de diferentes implementaciones al estar sobrecargados, consulte el lector la
documentacin de la plataforma. El Cdigo fuente 363 muestra algunos ejemplos de uso.
Sub Main()
Dim sNombres() As String = {"Alberto", "Juan", "Ana", "Paco", "Miguel", "Ana"}
' buscar una cadena a partir del ndice 0 del array
Console.WriteLine("Paco est en la posicin {0}", _
Array.IndexOf(sNombres, "Paco"))
' buscar una cadena a partir del ndice 3 del array
Console.WriteLine("Ana est en la posicin {0}," & _
" comenzando a buscar desde ndice 3", _
Array.IndexOf(sNombres, "Ana", 3))
' introducir un valor a buscar en el array,
' si no existe se devuelve -1
Dim iPosicionBuscar As Integer
Console.WriteLine("Introducir nombre a buscar")
iPosicionBuscar = Array.IndexOf(sNombres, _
Console.ReadLine())
If iPosicionBuscar = -1 Then
Console.WriteLine("El nombre no est en el array")
Else
Console.WriteLine("El nombre est en la posicin {0} del array", _
iPosicionBuscar)
End If
' buscar comenzando por la ltima posicin
Dim iNumeros() As Integer
Dim iUltPosicionBuscar As Integer
iNumeros = New Integer() {10, 20, 30, 10, 50, 60, 10, 70, 80}
Console.WriteLine("El 10 est en la posicin {0} comenzando por el final", _
Array.LastIndexOf(iNumeros, 10))
Console.ReadLine()
End Sub

Arrays multidimensionales
Todos los arrays vistos hasta el momento han sido de tipo unidimensional, es decir, estaban

compuestos de una lista de valores nica .NET Framework nos provee tambin de la capacidad de
crear arrays formados por ms de una lista de valores, o lo que es igual, arrays multidimensionales.
Un array de este tipo, se caracteriza por estar compuesto de varias dimensiones o listas anidadas al
estilo de filas y columnas. Si declaramos un array del modo que muestra el Cdigo fuente 364.
Dim iDatos(2, 4) As Integer

Crearamos un array multidimensional formado por tres filas y cinco columnas. En este caso, el
nmero correspondiente a la primera dimensin denota las filas, mientras que el nmero de la
segunda dimensin hace lo propio para las columnas. La Figura 209 muestra un diagrama con la
estructura de este array.

Figura 209. Estructura de un array multidimensional.

En este tipo de arrays, para acceder a los valores, debemos especificar la dimensin y la posicin a
la que vamos a asignar o recuperar un dato. Ver Cdigo fuente 365.
Sub Main()
' crear array multidimensional y rellenar de valores
Dim iDatos(2, 4) As Integer
iDatos(0, 0) = 1000
iDatos(0, 1) = 2000
iDatos(0, 2) = 3000
iDatos(0, 3) = 4000
iDatos(0, 4) = 5000
iDatos(1, 0) = 25
iDatos(1, 1) = 35
iDatos(1, 2) = 45
iDatos(1, 3) = 55
iDatos(1, 4) = 65
iDatos(2, 0) = 111
iDatos(2, 1) = 222
iDatos(2, 2) = 333
iDatos(2, 3) = 444
iDatos(2, 4) = 555
End Sub

Para recorrer arrays multidimensionales, la clase Array dispone de varios miembros, algunos de los
cuales, describimos seguidamente.
Rank. Devuelve el nmero de dimensiones del array.
GetLength(Dimension). Devuelve el nmero de elementos de la dimensin de array pasada
como parmetro.

GetLowerBound(Dimension). Devuelve el nmero de ndice inferior de la dimensin pasada


como parmetro.
GetUpperBound(Dimension). Devuelve el nmero de ndice superior de la dimensin pasada
como parmetro.

Usa los colores de Visual Studio en tu programa

El control ColorDialog nos presenta una paleta de colores tradicional, pero lo cierto es que
la de visual studio es mucho ms linda y nos muestra todos los colores por su nombre
como estn definidos en las propiedades del objeto System.Drawing.Color.
Dado el problema de que no existe un control que nos muestre esta lista de colores vamos a
ver como podemos constriur una nosotros mismos.
Para el ejemplo necesitaremos un nuevo proyecto y dos formularios.
En el primer formulario solo tendremos un baton para llamar al formulario 2, tal como se
ve en la siguiente figura:

y el cdigo del boton es el siguiente:


view source
print?

1.Private Sub btnColor_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnColor.Click
2.Dim vForm2 As New Form2
3.vForm2.ShowDialog()
4.End Sub

y en el siguiente formulario pondremos yn control ListBox y dos botoes (aceptar y


cancelar) igual que en el siguiente formulario:

En el evento Load del formulario establecemos algunas propiedades del control ListBox y
cargamos los nombres de los colores con el siguiente cdigo:
view source
print?

01.Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles MyBase.Load
02.ListBox1.DrawMode = DrawMode.OwnerDrawFixed
03.ListBox1.ItemHeight = 20
04.
05.ListBox1.Items.Clear()
06.ListBox1.BeginUpdate()
07.For Each pi As Reflection.PropertyInfo In
GetType(Color).GetProperties(Reflection.BindingFlags.Static Or
Reflection.BindingFlags.Public)
08.ListBox1.Items.Add(pi.Name)
09.Next
10.ListBox1.EndUpdate()
11.End Sub

En la primer linea del Load ListBox1.DrawMode = DrawMode.OwnerDrawFixed


establecemos que todos los elementos del control se dibujan manualmente y tienen el
mismo alto. Esto, ademas, desencadena un suceso DrawItem justo antes de mostrar cada
elemento.
Para programar el evento DrawItem del ListBox, seleccionamos (en la vista de diseo) el
ListBox1, presionamos F4 para ver las propiedades, y en la parte de arriba del cuadro de
propiedades seleccionamos el icono del rayo para ver los evento que el control tiene

disponibles, buscamos DrawItem y le damos doble clic. La siguiente imagen ejemplifica


como hacerlo:

y este es el cdigo del evento DrawItem


view source
print?

01.Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As


System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
02.Dim rectangulo As Rectangle = e.Bounds
03.
04.If (e.State And DrawItemState.<A title=Select
href="http://www.solovb.net/index.php/2009/01/11/sqlselect/">Select</A>ed) Then
05.e.Graphics.FillRectangle(SystemBrushes.Highlight, rectangulo)
06.Else
07.e.Graphics.FillRectangle(Brushes.White, rectangulo)
08.End If
09.
10.Dim nombreColor As String = ListBox1.Items(e.Index)
11.
12.Dim b As New SolidBrush(Color.FromName(nombreColor))
13.
14.rectangulo.Inflate(-16, -2)
15.e.Graphics.FillRectangle(b, New Rectangle(rectangulo.X, rectangulo.Y,
30, rectangulo.Height))
16.

17.e.Graphics.DrawRectangle(Pens.Black, New Rectangle(rectangulo.X,


rectangulo.Y, 30, rectangulo.Height))
18.
19.If (e.State And DrawItemState.Selected) Then
20.e.Graphics.DrawString(nombreColor, e.Font, Brushes.White, rectangulo.X
+ 34, rectangulo.Y + 2)
21.Else
22.e.Graphics.DrawString(nombreColor, e.Font, Brushes.Black, rectangulo.X
+ 34, rectangulo.Y + 2)
23.End If
24.End Sub

Ahora solo nos falta programar los eventosde los dos botones como se ve en el siguiente
cdigo:
view source
print?

1.Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnAceptar.Click
2.My.Forms.Form1.BackColor = Color.FromName(ListBox1.SelectedItem)
3.End Sub
4.
5.Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnCancelar.Click
6.Me.Close()
7.End Sub

Bueno, a probar la aplicacin si todo sali bien, se ver as:

Les dejo algunas definiciones:


Graphics.FillRectangle (Mtodo): Rellena el interior de un rectngulo especificado por
un par de coordenadas, un valor de ancho y un valor de alto.
Graphics.DrawRectangle (Mtodo): Dibuja un rectngulo especificado por un par de
coordenadas, un valor de ancho y un valor de alto.
Graphics.DrawString (Mtodo): Dibuja la cadena de texto especificada en la ubicacin
especificada y con los objetos Brush y Font especificados.

Cuadros de Dialogo
Visual Basic .NET cuanta con siete tipos de cuadro de dialogo que facilitan la construccin de interfaz de
usuario:
1.
2.
3.
4.
5.
6.
7.

OpenFileDialog, obtiene unidad, nombre de directorio y nombre de un archivo existente.


SaveFileDialog, obtiene unidad, nombre de directorio y nombre para un archivo nuevo.
FontDialog, para que el usuario seleccione una configuracin para la fuente.
ColorDialog, para que el usuario seleccione un color de una paleta.
PrintDialog, para que el usuario defina opciones de impresin
PrintPreviewDialog, muestra al usuario una vista previa de impresin.
PageSetupDialog, para que el usuario controle las opciones de configuracin de pgina.

Al momento de disear la interfaz de usuario los controles de cuadro de dialogo no aparecen en la pantalla
pero si se muestran visibles al pie de la misma, pudiendo acceder a sus propiedades para configurar el
control.
Si requiere hacer visible el cuadro de dialogo en modo ejecucin tendr que emplear el mtodo
ShowDialog().
El mtodo ShowDialog() regresa un valor denominado DialogResult, indicando el botn del cuadro
de dilogo en el que el usuario dio clic.
OpenFileDialog
El control OpenFileDialog representa un dialogo preconfigurado para seleccionar un archivo que ser abierto.
La propiedad InitialDirectory especifica el directorio inicial desplegado por la caja de dialogo de
archivo. La propiedad Filter determina el formato de archivos que podrn ser presentados en la caja de
dialogo, para desplegar la caja de dialogo de archivo se utiliza su mtodo ShowDialog, la propiedad
FileName mantiene es un string que contiene el nombre del archivo seleccionado.
Suponga un ejercicio donde tiene un control OpenFileDialog y otro PictureBox, a travs del cuadro
de dialogo es posible seleccionar una imagen, misma que ser cargada y presentada por el control de imagen
(*.bmp, *.emf, *.wmf, *.ico, *.cur, *.jpg, *.jpeg, *.png, *.gif), es posible utilizar el mtodo Filter para
especificar solamente los archivos que tengan el formato especificado (entre formato y formato se utiliza como
separador el smbolo | pipe):

ofd.Filter = "formato 1|*.jpg|formato 2|*.bmp"


ofd.ShowDialog()
pb.Image = System.Drawing.Image.FromFile(ofd.FileName)
Dim dr
dr = ofd.ShowDialog()
MsgBox(dr)

La siguiente lnea descarga el control de imagen:

pb.Image = Nothing

ColorDialog
El control ColorDialog representa un dialogo preconfigurado que despliega la caja de dialogo de color
estndar, permitiendo al usuario seleccionar el color o definir un color personalizado, para desplegar la caja de

dialogo de color se utiliza su mtodo ShowDialog, la propiedad color mantiene el color seleccionado por
el usuario.
Es posible agregar el control ColorDialog al formulario aunque est no este visiblemente contenido en el
formulario pero si visible en la bandeja de componentes o es posible agregar el control ColorDialog a travs
de cdigo declarando un objeto de este tipo.

REM Agregando un control ColorDialog al formulario


Private Sub BtnBgColor_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) _
Handles BtnBgColor.Click
CD.ShowDialog()
LblText.BackColor = CD.Color
End Sub
REM Declarando un objeto tipo ColorDialog via cdigo
Private Sub BtnForeColor_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) _
Handles BtnForeColor.Click
Dim FC As New ColorDialog
FC.ShowDialog()
LblText.ForeColor = FC.Color
End Sub

FontDialog
El control FontDialog representa un dialogo preconfigurado que despliega la caja de dialogo de fuente
estndar, por default la caja de dialogo muestra cajas de listas para la fuente, estilo-fuente, y tamao, cajas de
chequeo para efectos como subrayado o tachado, tambin muestra un ejemplo de como la fuente podra
aparecer, para desplegar la caja de dialogo de fuente se utiliza su mtodo ShowDialog, la propiedad font
mantiene el color seleccionado por el usuario.
Es posible agregar el control FontDialog al formulario aunque este no est visiblemente contenido en el
formulario pero si visible en la bandeja de componentes o es posible agregar el control FontDialog a travs
de cdigo declarando un objeto de este tipo.

Private Sub BtnFont_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) _
Handles BtnFont.Click
Dim FD As New FontDialog
FD.ShowDialog()
LblText.Font = FD.Font
End Sub

PrintDialog
El control PrintDialog es una caja de dialogo preconfigurada, utilizada para seleccionar una impresora,
escoger las pginas a imprimir y determinar otras caractersticas de impresin en aplicaciones Windows. Es
posible habilitar al usuario para imprimir varias partes de sus documentos: imprimir todo, imprimir un rango de
pginas o imprimir una seleccin. La propiedad Document se establece con un objeto PrintDocument,
para desplegar la caja de dialogo de impresin utilice el mtodo ShowDialog, la caja de dialogo de
impresin almacena la configuracin del usuario en el objeto PrintDocument y para imprimir utilice el
mtodo Print.

PrintPreviewDialog
El control PrintPreviewDialog es una caja de dialogo preconfigurada, para presentar como podra ser el
documento cuando se imprima. La propiedad Document se establece con un objeto PrintDocument, el
cual tiene propiedades que describen que ser impreso y la habilidad para imprimir dentro de una aplicacin
Windows, para desplegar la caja de dialogo de impresin-previa utilice el mtodo ShowDialog,
PageSetupDialog
El control PageSetupDialog es una caja de dialogo preconfigurada que permite al usuario manipular la
configuracin de pginas, incluyendo margenes y orientacin del papel. La propiedad Document se
establece con un objeto PrintDocument, para desplegar la caja de dialogo de PageSettings utilice el
mtodo ShowDialog, la seleccin del usuario se almacena en la propiedad PageSettings y debera
entonces ser copiado al objeto PrintDocument.

La clase PrintDialog

Esta clase nos servir para que nuestros usuarios seleccionen la impresora a usar as como
para que indiquen ciertas caractersticas relacionadas con la impresin, como la calidad del
papel, el nmero de copias, etc., con la ventaja de que todo esto lo haremos usando el
mismo cuadro de dilogo comn incluido en Windows y que es el que la prctica totalidad
de aplicaciones de este sistema operativo utilizarn, tal como podemos comprobar en la
figura 1.

Figura 1. El cuadro de dilogo para seleccionar la impresora

En la figura 1 podemos comprobar que hay ciertos elementos que puede que no nos interese
mostrar o dejar habilitados, por ejemplo, si nuestra aplicacin no permite imprimir el
cdigo seleccionado no tiene mucho significado ofrecerle la opcin "Seleccin", (la figura

est capturada de un Windows XP en ingls, por eso se muestran las opciones en ingls), lo
mismo ocurre con el botn de ayuda o con las cajas de texto que permiten indicar el rango
de pginas a imprimir. Todas estas caractersticas las podemos habilitar o deshabilitar
mediante algunas de las propiedades de la clase PrintDialog, tales como: AllowPrintToFile,
AllowSelection, AllowSomePages, PrintToFile, ShowHelp y ShowNetwork.

La ayuda del cuadro de dilogo de imprimir


Como curiosidad, decir que la propiedad ShowHelp nos permite indicar si se
debe mostrar o no el botn de ayuda, (no la interrogacin de la barra de
ttulos que siempre estar funcional), pero entre las propiedades de esta clase
no tenemos ninguna a la que indicarle que ayuda se debe mostrar si pulsamos
en ese botn, en lugar de eso, de lo que disponemos es de un evento:
HelpRequest el cual se producir cuando el usuario pulse en dicho botn, por
tanto si queremos mostrar algn tipo de ayuda, tendremos que usar ese
evento para mostrar la informacin que creamos conveniente para nuestro
cuadro de dilogo.

Al igual que en el resto de cuadros de dilogos de .NET, tenemos el mtodo ShowDialog


que ser el que nos permita mostrar el cuadro de dilogo y saber si el usuario ha pulsado en
el botn OK (Aceptar) o Cancelar, para que de esta forma sepamos si debemos seguir con
el proceso de impresin o no.
La propiedad PrinterSettings ser la que nos permita saber lo que el usuario ha
seleccionado, adems de ser la que usemos para asignar los valores predeterminados o bien
los que tengamos almacenado de ocasiones anteriores; tal como indicamos anteriormente,
lo habitual ser que tengamos una variable del tipo de esta propiedad con las preferencias
del usuario, por tanto antes de llamar al mtodo ShowDialog deberamos asignar a esta
propiedad la variable que tengamos con las preferencias del usuario y si no se ha cancelado,
debemos asignar nuevamente el resultado de dichas preferencias, tal como mostramos en el
listado 2.
''' <summary>
''' Seleccionar la impresora.
''' </summary>
''' <returns>
''' Devuelve True si todo fue bien o false si se cancel
''' </returns>
Private Function seleccionarImpresora() As Boolean
Dim prtDialog As New PrintDialog
If prtSettings Is Nothing Then
prtSettings = New PrinterSettings
End If
With prtDialog
.AllowPrintToFile = False
.AllowSelection = False
.AllowSomePages = False

.PrintToFile = False
.ShowHelp = False
.ShowNetwork = True
.PrinterSettings = prtSettings
If .ShowDialog() = DialogResult.OK Then
prtSettings = .PrinterSettings
Else
Return False
End If
End With
Return True
End Function
Listado 2.

La clase PrintPreviewDialog

Esta clase nos permitir mostrar una ventana con la vista preliminar del documento que
queremos imprimir, de forma que los usuarios de nuestra aplicacin pueden ver lo que se
imprimir. Debido a que esta clase al estar derivada de Form tiene todas las propiedades,
mtodos y eventos de cualquier formulario adems de los relacionados con la
previsualizacin del documento a imprimir, veamos solamente los dos miembros que nos
interesarn ms:

El mtodo ShowDialog ser el que se encargue de mostrar el formulario con la


vista preliminar.

A la propiedad Document le asignaremos un objeto del tipo PrintDocument que


ser el que utilicemos para saber qu es lo que queremos imprimir.

NOTA:
Por regla general deberamos asignar a la propiedad Document de la clase
PrintPreviewDialog el mismo objeto PrintDocument usado para imprimir, ya
que la clase PrintPreviewDialog se encargar de que se produzcan los mismos
eventos que si hubisemos llamado al mtodo Print del objeto PrintDocument
asignado, de forma que lo que se muestre mediante este dilogo sea lo mismo
que se imprima, que es al fin y al cabo lo que queremos conseguir.

Tal como hemos resaltado en la nota, tanto el mtodo Print de la clase PrintDocument como
la clase PrintPreviewDialog utilizan los mismos eventos del objeto PrintDocument, por
tanto podramos usar un mtodo genrico que sea el encargado de mostrar una vista

preliminar de lo que queremos imprimir o de mandarlo a la impresora, de esta forma


podemos usar de forma comn las opciones ofrecidas al usuario, como por ejemplo permitir
la seleccin de la impresora antes de imprimir, etc.
En el listado 3 podemos ver cmo podra ser ese mtodo genrico para elegir entre
imprimir o previsualizar lo que deseamos imprimir.
Private Sub imprimir(ByVal esPreview As Boolean)
' imprimir o mostrar el PrintPreview
If prtSettings Is Nothing Then
prtSettings = New PrinterSettings
End If
If chkSelAntes.Checked Then
If seleccionarImpresora() = False Then Return
End If
If prtDoc Is Nothing Then
prtDoc = New System.Drawing.Printing.PrintDocument
AddHandler prtDoc.PrintPage, AddressOf prt_PrintPage
End If
' la lnea actual
lineaActual = 0
' la configuracin a usar en la impresin
prtDoc.PrinterSettings = prtSettings
If esPreview Then
Dim prtPrev As New PrintPreviewDialog
prtPrev.Document = prtDoc
prtPrev.Text = "Previsualizar documento"
prtPrev.ShowDialog()
Else
prtDoc.Print()
End If
End Sub
Listado 3.

Tal como podemos ver en la figura 2, el formulario (o cuadro de dilogo) de


previsualizacin nos permite seleccionar el nmero de pgina a mostrar, si queremos ver
una o ms pginas a un mismo tiempo, el porcentaje de ampliacin e incluso imprimir lo
que estamos viendo, todos estas caractersticas ya estn incluidas en ese formulario.

Figura 2. El formulario de previsualizacin

La clase PrintPreviewControl

Si nuestra intencin es crear nuestro propio formulario de previsualizacin, tambin


podemos hacerlo si usamos el control PrintPreviewControl que es el que la clase
PrintPreviewDialog utiliza, si bien todos los botones y opciones tendremos que crearlos
nosotros, para ello podemos usar los miembros especficos de este control, tales como:

AutoZoom lo usaremos para que al cambiar el tamao del control se cambie


tambin la pgina mostrada.

Columns indica el nmero de pginas a mostrar cuando se elija la orientacin


horizontal (apaisada).

Document es donde asignaremos el objeto PrintDocument a imprimir.

Rows indica el nmero de pginas a mostrar cuando elijamos la orientacin


vertical.

Zoom para indicar la ampliacin con la que queremos mostrar los documentos.

StartPageChanged en un evento que se producir cada vez que cambiemos la


pgina de inicio (este evento nos servir para crear un equivalente al
NumericDropDown usado en la clase PrintPreviewDialog).

Si tambin quisiramos implementar un botn para imprimir, tendremos que manejar


nosotros mismos la impresin, pero realmente resultara fcil, ya que lo nico que
tendramos que hacer es llamar al mtodo Print del objeto PrintDocument asignado a la
propiedad Document.
Como siempre la ltima palabra la tendremos nosotros y dependiendo de lo que queramos
hacer usaremos una clase u otra.

Conclusin: Imprimir en .NET es fcil

Tal como hemos podido comprobar, imprimir en .NET no es tan complicado como en un
principio pudiera parecer, adems de que tenemos valores aadidos que nos permiten un
mayor control sobre la impresin y, especialmente, sobre las opciones que podemos ofrecer
a los usuarios de nuestras aplicaciones, ya que como hemos visto, hacer algo como la
presentacin preliminar, que en otros lenguajes nos obligara a escribir bastante cdigo, es
tan sencillo como crear un nuevo objeto en la memoria y asignar un par de propiedades.
Por supuesto, lo que no es totalmente sencillo ni automtico es la presentacin o impresin
de los datos que necesitamos mostrar, al menos si queremos darle un toque, digamos,
profesional a nuestra impresin, ya que seremos nosotros los que debamos "afinar" en la
forma de mostrar esos resultados; pero de todas formas eso es algo que siempre nos tocar
hacer, utilicemos el entorno de programacin que utilicemos, la ventaja de usar lo que
.NET nos ofrece es que tenemos ciertas posibilidades de hacerlo de una forma ms o menos
fcil y que de alguna forma nos facilita bastante la tarea, aunque para la mayora de
situaciones ser ms que suficiente e incluso podemos automatizar, principalmente porque
podemos aprovechar las posibilidades que nos da la programacin orientada a objetos de
crear nuestras propias clases e implementar mtodos de impresin que se adapten a los
datos que tengamos que mostrar, ya que una de las claves de la POO es la abstraccin y que
mejor forma de abstraccin que crear un mtodo que se encargue de manejar los datos que
la propia clase mantiene y que "sepa" cmo mostrar esos datos e incluso qu formato deben
aplicarse a la hora de presentar esos datos por la impresora. Posiblemente tengamos que
quemar unas cuantas neuronas ms a la hora de "concebir" esa clase, pero a la larga ese
esfuerzo habr valido la pena ya que puede suponernos una forma de "olvidarnos" de esos
pequeos detalles de ajustar cada una de las lneas que vamos a imprimir.
De seguro que el lector puede pensar que tampoco es necesario ese "esfuerzo" extra para
imprimir una lnea, y seguramente tenga razn, pero precisamente si cuando diseamos
nuestras clases para manejar datos tenemos en cuenta estos detalles, seguramente nos
resultar ms fcil realizar cambios en ocasiones futuras. Por ejemplo, si tenemos una clase
en la que hay datos de cadena y de tipo numrico y queremos mostrar esos datos, la forma
de tratar cada uno de esos datos ser diferente, ya que con toda seguridad los datos
numricos querremos ajustarlos a la derecha y los de cadena a la izquierda, adems de que
si debemos recortar la informacin que tenemos que mostrar, con total seguridad
preferiremos "truncar" los datos de cadena antes que los numricos. En este tipo de

situaciones si dejamos que el cdigo de la clase sea el que decida estos truncamientos,
(realmente el cdigo de la clase no va a decidir nada, ya que tendremos que ser nosotros los
que hagamos esa decisin), siempre ser preferible que tener que hacerlo en el propio
evento de impresin, sobre todo si ese mismo evento es el que usaremos para imprimir
datos de diferentes tipos, que pueden proceder de diferentes clases, pero si las clases usadas
para contener los datos estn "preparadas" para imprimir el contenido de cada lnea,
entonces resultar tan sencillo como llamar a un mtodo de cada una de esas clases...
En el listado 4 podemos ver cmo quedara el evento PrintPage si hiciramos algo de lo que
acabamos de comentar.
' El evento usado mientras se imprime el documento
Private Sub prt_PrintPage(ByVal sender As Object, _
ByVal e As PrintPageEventArgs)
' Este evento se produce cada vez que se va a imprimir una pgina
Dim lineHeight As Single
Dim yPos As Single = e.MarginBounds.Top
Dim leftMargin As Single = e.MarginBounds.Left
Dim printFont As System.Drawing.Font
' Asignar el tipo de letra
printFont = prtFont
lineHeight = printFont.GetHeight(e.Graphics)
Dim fontTitulo As New Font("Arial", 20, FontStyle.Bold)
e.Graphics.DrawString("Listado de " & Ttulo, fontTitulo, _
Brushes.Black, leftMargin, yPos)
yPos += fontTitulo.GetHeight(e.Graphics)
' imprimir la cabecera de la pgina
yPos = Datos(0).CabeceraImpresin(e, printFont, yPos)
' imprimir cada una de las lneas de esta pgina
Do
yPos += lineHeight
e.Graphics.DrawString(Datos(lineaActual).LineaImpresin, _
printFont, Brushes.Black, leftMargin, yPos)
lineaActual += 1
Loop Until yPos >= e.MarginBounds.Bottom _
OrElse lineaActual >= Datos.Count
If lineaActual < Datos.Count Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
End Sub
Listado 4.

En el cdigo completo que acompaa a este artculo, hay un proyecto en el que he definido
una interfaz con cuatro mtodos, una coleccin para almacenar objetos del tipo de la
interfaz, una clase abstracta que define los dos mtodos usados en el evento mostrado en el
Listado 4, tres clases diferentes para ver cmo poder usar tanto la case abstracta como la
interfaz, dos de ellas se basan en la clase abstracta (por tanto parte del cdigo ya estar
disponible) y la tercera simplemente implementa la interfaz y define los cuatro mtodos;
tambin incluyo un formulario el cual podemos utilizar de forma genrica con cualquiera
de esas tres clases o de cualquier otra que utilice la interfaz o la clase abstracta. De esta
forma podrs comprobar que no todo son "palabras".
Lo vamos a dejar aqu, porque aunque sera interesante explicar todo el cdigo con ms
detalle, eso me llevara un montn de horas y no es plan de abusar ;-)))
De todas formas, confo que con lo aqu explicado ms el cdigo incluido en el ZIP sea ms
que suficiente para comprender cmo podemos imprimir en .NET Framework con Visual
Basic para .NET.

Common questions

Con tecnología de IA

'Array.CreateInstance()' permite especificar el número exacto de elementos del array, siendo útil cuando se requiere una dimensión diferente a la predeterminada (la declaración estándar asigna un elemento más de lo indicado). Ofrece flexibilidad y control al inicializar arrays dinámicamente sin los límites de la declaración fija .

'Sort()' ordena los elementos dentro del array en orden ascendente. 'Reverse()' cambia las posiciones de los elementos en el orden inverso sin reordenar el contenido en sí. Ambos métodos transforman la estructura interna del array, reorganizando las posiciones de los elementos .

Dado que los arrays en VB.NET son tipos por referencia, al pasarlos como parámetros, cualquier modificación realizada dentro del procedimiento afectará al array original. Esto garantiza que los cambios se reflejen directamente en el array al retornar al procedimiento llamador .

'PrinterSettings' almacena las preferencias del usuario respecto a la impresora seleccionada y las opciones de impresión, como copias o calidad de papel. Esta propiedad es crucial para personalizar la experiencia de impresión, asegurando que las preferencias del usuario se apliquen consistentemente en distintas sesiones de impresión .

'ShowDialog' es fundamental para interactuar con cuadros de diálogo de impresión como 'PrintDialog' y 'PrintPreviewDialog'. Permite a los usuarios personalizar configuraciones de impresión, seleccionar impresoras y confirmar las acciones mediante un interfaz gráfica amigable, mejorando la experiencia del usuario al preparar documentos para impresión .

El método 'Array.Clear' se usa para inicializar elementos a sus valores predeterminados según su tipo: en arrays de tipo String se establecen como cadenas vacías, en arrays numéricos se les asigna cero, y en arrays de tipo Object se les establece como 'Nothing' .

La clonación crea un nuevo array con los mismos valores y estructura del original. En cambio, la copia transfiere valores de un arreglo a otro previamente creado, de modo que el destino debe ser lo suficientemente grande para contener los nuevos elementos. La clonación genera un objeto independiente mientras que la copia depende de las posiciones asignadas .

'PrintPreviewDialog' permite a los usuarios ver una previsualización del documento antes de imprimir, asegurando que el resultado será el esperado. Esto minimiza errores de impresión y elimina la necesidad de impresiones de prueba, optimizando recursos y mejorando la satisfacción del usuario con el proceso .

'PrintPreviewControl' permite construir interfaces de previsualización personalizadas, otorgando a los desarrolladores control sobre la presentación visual del contenido antes de la impresión. Esto es esencial para integrar características específicas de usuario como múltiples vistas de página, ampliación de documento y orientación personalizada, mejorando significativamente la usabilidad del software .

'ReDim' se utiliza para cambiar el tamaño de un array, pero borra el contenido previo. En contraste, 'ReDim Preserve' permite ampliar o reducir el tamaño del array sin perder los datos existentes hasta el nuevo tamaño especificado .

También podría gustarte