NekroAyuda: Introducción a las Variables, Constantes y Tipos de Datos.

<< < (2/3) > >>

NekroByte:
Constantes


A menudo verá que el código contiene valores constantes que reaparecen una y otra vez. O puede que el código dependa de ciertos números que resulten difíciles de recordar (números que, por sí mismos, no tienen un significado obvio).

En estos casos, puede mejorar mucho la legibilidad del código y facilitar su mantenimiento si utiliza constantes. Una constante es un nombre significativo que sustituye a un número o una cadena que no varía. Aunque una constante recuerda ligeramente a una variable, no puede modificar una constante o asignarle un valor nuevo como ocurre con una variable. Hay dos orígenes para las constantes:
Constantes intrínsecas o definidas por el sistema proporcionadas por aplicaciones y controles. Las constantes de Visual Basic se muestran en Visual Basic (VB) y Visual Basic para aplicaciones (VBA) y las bibliotecas de objetos en el Examinador de objetos. Otras aplicaciones que proporcionan bibliotecas de objetos, como Microsoft Excel y Microsoft Project, también proporcionan una lista de constantes que puede usar con sus objetos, métodos y propiedades. También se definen constantes en la biblioteca de objetos de cada control ActiveX.Las constantes simbólicas o definidas por el usuario se declaran mediante la instrucción Const. Las constantes definidas por el usuario se describen en la próxima sección, "Crear sus propias constantes".
En Visual Basic, los nombres de constantes tienen un formato que combina mayúsculas y minúsculas, con un prefijo que indica la biblioteca de objetos que define la constante. Las constantes de las bibliotecas de objetos de Visual Basic y Visual Basic para aplicaciones tienen el prefijo "vb"; por ejemplo, vbTileHorizontal.

Se ha diseñado el sistema de prefijos para evitar colisiones accidentales en casos donde las constantes tienen nombres idénticos y representan valores diferentes. Incluso con prefijos, es posible que dos bibliotecas de objetos puedan contener constantes idénticas que representen valores diferentes. La constante a la que se hace referencia en cada caso depende de la biblioteca de objetos que tenga mayor prioridad.

Para estar totalmente seguro de evitar colisiones en los nombres de constantes, puede calificar las referencias a constantes con la sintaxis siguiente:

[nombreBiblioteca.][nombreMódulo.]nombreConstante

nombreBiblioteca suele ser el nombre de clase del control o la biblioteca, nombreMódulo es el nombre del módulo que define la constante y nombreConstante es el nombre de la constante. Cada uno de estos elementos se define en la biblioteca de objetos y se puede ver en el Examinador de objetos.


Crear constantes propias

La sintaxis para declarar una constante es la siguiente:

[Public|Private] Const nombreConstante[As tipo] = expresión

El argumento nombreConstante es un nombre simbólico válido (las reglas son las mismas que para crear nombres de variable) y expresión está compuesta por constantes y operadores de cadena o numéricos; sin embargo, no puede usar llamadas a funciones en expresión.

Una instrucción Const puede representar una cantidad matemática o de fecha y hora:

Código:

Const conPi = 3.14159265358979
Public Const conMaxPlanetas As Integer = 9
Const conFechaSalida = #1/1/95#


Se puede usar también la instrucción Const para definir constantes de cadena:

Código:

Public Const conVersion = "07.10.A"
Const conNombreClave = "Enigma"


Puede colocar más de una declaración de constante en una única línea si las separa con comas:

Código:

Public Const conPi = 3.14, conMaxPlanetas = 9, conPobMundial = 6E+09


A menudo, la expresión del lado derecho del signo igual ( = ) es un número o cadena literal, pero también puede ser una expresión que dé como resultado un número o una cadena (aunque la función no puede contener llamadas a funciones). Puede incluso definir constantes en términos de constantes previamente definidas:

Código:

Const conPi2 = conPi * 2


Una vez que defina las constantes, puede colocarlas en el código para hacerlo más legible. Por ejemplo:

Código:

Static SistemaSolar(1 To conMaxPlanetas)
If numPersonas &gt; conPopMundial Then Exit Sub



Alcance de las constantes definidas por el usuario

Una instrucción Const tiene igual alcance que una declaración de variable y se le aplican las mismas reglas:
Para crear una constante que sólo exista en un procedimiento, declárela dentro del procedimiento.Para crear una constante disponible para todos los procedimientos de un módulo, pero no para el código que está fuera del módulo, declárela en la sección Declaraciones del módulo.Para crear una constante disponible en toda la aplicación, declare la constante en la sección Declaraciones de un módulo estándar y coloque delante de Const la palabra clave Public. No se pueden declarar las constantes públicas en un módulo de clase o de formulario.


Evitar referencias circulares

Como es posible definir constantes en términos de otras constantes, deberá tener cuidado para no establecer un ciclo o referencia circular entre dos o más constantes. Se produce un ciclo cuando se tienen dos o más constantes públicas, cada una de las cuales está definida en función de la otra.

Por ejemplo:

Código:

' En Module 1:
Public Const conA = conB * 2      ' Disponible en toda la
                                 ' aplicación.
' En Module 2:
Public Const conB = conA / 2      ' Disponible en toda la
                                 ' aplicación.


Si se produce un ciclo, Visual Basic generará un error cuando intente ejecutar la aplicación. No puede ejecutar el código hasta que resuelva la referencia circular. Para evitar la creación de un ciclo, restrinja todas las constantes públicas a un único módulo o, al menos, al menor número posible de módulos.

NekroByte:
Tipos de Datos


Las variables son marcadores de posición que se utilizan para almacenar valores; tienen nombre y un tipo de dato. El tipo de dato de la variable determina cómo se almacenan los bits que representan esos valores en la memoria del equipo. Cuando declare una variable, también puede proporcionarle un tipo de dato. Todas las variables tienen un tipo de dato que determina la clase de datos que pueden almacenar.

De forma predeterminada, si no proporciona un tipo de dato, la variable toma el tipo de dato Variant. El tipo de dato Variant es como un camaleón; puede representar diferentes tipos de datos en distintas situaciones. No tiene que convertir estos tipos de datos cuando los asigne a una variable Variant: Visual Basic realiza automáticamente cualquier conversión necesaria.

Sin embargo, si sabe que una variable almacenará siempre un tipo de dato determinado, Visual Basic tratará de forma más eficiente los datos si declara la variable con ese tipo. Por ejemplo, se representa mejor una variable que va almacenar nombres de personas como el tipo de dato String, ya que un nombre está siempre compuesto de caracteres.

Los tipos de datos se aplican a otras cosas además de a las variables. Cuando asigna un valor a una propiedad, dicho valor tiene un tipo de dato; los argumentos de las funciones tienen también tipos de datos. De hecho, todo lo relacionado con datos en Visual Basic tiene un tipo de dato.

También puede declarar matrices de cualquiera de los tipos fundamentales.




Declarar variables con tipos de datos

Antes de usar una variable que no sea Variant debe usar las instrucciones Private, Public, Dim o Static para declararla As tipo. Por ejemplo, la siguiente instrucción declara un tipo Integer, Double, String y Currency, respectivamente:

Código:

Private I As Integer
Dim Cantidad As Double
Static SuNombre As String
Public PagadoPorJuan As Currency


La instrucción de declaración puede combinar varias declaraciones, como en las instrucciones siguientes:

Código:

Private I As Integer, Amt As Double
Private SuNombre As String, PagadoPorJuan As Currency
Private Prueba, Cantidad, J As Integer


Nota: Si no proporciona un tipo de dato, se asigna a la variable el tipo predeterminado. En el ejemplo anterior, las variables Prueba y Cantidad tienen un tipo de dato Variant. Esto puede sorprenderle si su experiencia con otros lenguajes de programación le lleva a esperar que todas las variables contenidas en la misma instrucción de declaración tengan el mismo tipo que ha especificado (en este caso, Integer).


Tipos de datos numéricos

Visual Basic proporciona varios tipos de datos numéricos: Integer, Long (entero largo), Single (signo flotante de simple precisión), Double (signo flotante de doble precisión) y Currency. Usar un tipo de dato numérico emplea normalmente menos espacio de almacenamiento que un tipo Variant.

Si sabe que una variable siempre va a almacenar números enteros (como 12) en vez de números fraccionarios (como 3,57), declárela como un tipo Integer o Long. Las operaciones con enteros son más rápidas y estos tipos consumen menos memoria que otros tipos de datos. Resultan especialmente útiles como variables de contador en bucles For...Next.


Si la variable contiene una fracción, declárela como variable Single, Double o Currency. El tipo de dato Currency acepta hasta cuatro dígitos a la derecha del separador decimal y hasta quince dígitos a la izquierda; es un tipo de dato de signo fijo adecuado para cálculos monetarios. Los números de signo flotante (Single y Double) tienen más intervalo que Currency, pero pueden estar sujetos a pequeños errores de redondeo.

Nota: Los valores de signo flotante se pueden expresar como mmmEeee o mmmDeee, donde mmm es la mantisa y eee el exponente (potencia de 10). El valor positivo más alto de un tipo de dato Single es 3,402823E+38 ó 3,4 veces 10 a la 38a potencia; el valor positivo más alto de un tipo de dato Double es 1,79769313486232D+308 o alrededor de 1,8 veces 10 a la 308a potencia. Si utiliza D para separar la mantisa y el exponente en un literal numérico, el valor se tratará como un tipo de dato Double. Igualmente, usar E de la misma manera hace que el valor se trate como un tipo de dato Single.


El tipo de dato Byte

Si la variable contiene datos binarios, declárela como matriz de tipo Byte. (Las matrices se describen en "Matrices", más adelante en este mismo capítulo). Usar variables Byte para almacenar datos binarios los preserva durante las conversiones de formato. Cuando se convierten las variables String entre los formatos ANSI y Unicode, los datos binarios de la variable resultan dañados. Visual Basic puede convertir automáticamente entre ANSI y Unicode al:
Leer archivosEscribir archivosLlamar a archivos DLLLlamar a métodos y propiedades en objetos
Todos los operadores que funcionan con enteros funcionan con el tipo de dato Byte excepto el de resta unaria. Puesto que Byte es un tipo sin signo con el intervalo 0-255, no puede representar un valor negativo. Así, para la resta unaria, Visual Basic convierte antes el tipo Byte en un entero con signo.

Es posible asignar todas las variables numéricas entre sí y a variables del tipo Variant. Visual Basic redondea en vez de truncar la parte fraccionaria de un número de signo flotante antes de asignarlo a un entero.




El tipo de dato String

Si tiene una variable que siempre contendrá una cadena y nunca un valor numérico, puede declararla del tipo String:

Código:

Private S As String


Así podrá asignar cadenas a esta variable y manipularla mediante funciones de cadena:

Código:

S = "Base de datos"
S = Left(S, 4)


De forma predeterminada, una variable o argumento de cadena es una cadena de longitud variable; la cadena crece o disminuye según le asigne nuevos datos. También puede declarar cadenas de longitud fija. Especifique una cadena de longitud fija con esta sintaxis:

String * tamaño

Por ejemplo, para declarar una cadena que tiene siempre 50 caracteres de longitud, utilice un código como este:

Código:

Dim NombreEmp As String * 50


Si asigna una cadena con menos de 50 caracteres, NombreEmp se rellenará con espacios en blanco hasta el total de 50 caracteres. Si asigna una cadena demasiado larga a una cadena de longitud fija, Visual Basic simplemente truncará los caracteres.

Puesto que las cadenas de longitud fija se rellenan con espacios al final, verá que las funciones Trim y RTrim, que quitan los espacios en blanco, resultan muy útiles cuando se trabaja con ellas.

Las cadenas de longitud fija se pueden declarar en módulos estándar como Public o Private. En módulos de clase y formulario, las cadenas de longitud fija deben declararse como Private.




Intercambiar cadenas y números

Puede asignar una cadena a una variable numérica si la cadena representa un valor numérico. También es posible asignar un valor numérico a una variable de cadena. Por ejemplo, coloque un botón de comando, un cuadro de texto y un cuadro de lista en un formulario. Escriba el código siguiente en el evento Click del botón de comando. Ejecute la aplicación y haga clic en el botón de comando.

Código:

Private Sub Command1_Click()
   Dim intX As Integer
   Dim strY As String
   strY = "100.23"
   intX = strY               ' Pasa la cadena a una variable numérica.
   List1.AddItem Cos(strY)   ' Agrega el coseno del número de la
                           ' cadena al cuadro de lista.
   strY = Cos(strY)         ' Pasa el coseno a la variable de cadena.
   Text1.Text = strY         ' Se imprime la variable de cadena en el
                           ' cuadro de texto.
End Sub


Visual Basic convertirá automáticamente las variables al tipo de dato apropiado. Debe tener cuidado cuando intercambie números y cadenas, ya que pasar un valor no numérico a una cadena producirá un error de tiempo de ejecución.


El tipo de dato Boolean

Si tiene una variable que siempre contendrá solamente información del tipo verdadero y falso, sí y no o activado o desactivado, puede declararla del tipo Boolean. El valor predeterminado de Boolean es False. En el siguiente ejemplo, blnEjecutando es una variable Boolean que almacena un simple sí o no.

Código:

Dim blnEjecutando As Boolean
   ' Comprueba si la cinta está en marcha.
   If Recorder.Direction = 1 Then
   blnEjecutando = True
End if



El tipo de dato Date

Los valores de fecha y hora pueden almacenarse en el tipo de dato específico Date en variables Variant. En ambos tipos se aplican las mismas características generales a las fechas.


Cuando se convierten otros tipos de datos numéricos en Date, los valores que hay a la izquierda del signo decimal representan la información de fecha, mientras que los valores que hay a la derecha del signo decimal representan la hora. Medianoche es 0 y mediodía es 0.5. Los números enteros negativos representan fechas anteriores al 30 de diciembre de 1899.


El tipo de dato Object

Las variables Object se almacenan como direcciones de 32 bits (4 bytes) que hacen referencia a objetos dentro de una aplicación o de cualquier otra aplicación. Una variable declarada como Object es una variable que puede asignarse subsiguientemente (mediante la instrucción Set) para referirse a cualquier objeto real reconocido por la aplicación.

Código:

Dim objDb As Object
Set objDb = OpenDatabase("c:\Vb5\biblio.mdb")


Cuando declare variables de objeto, intente usar clases específicas (como TextBox en vez de Control o, en el caso anterior, Database en vez de Object) mejor que el tipo genérico Object. Visual Basic puede resolver referencias a las propiedades y métodos de objetos con tipos específicos antes de que ejecute una aplicación. Esto permite a la aplicación funcionar más rápido en tiempo de ejecución. En el Examinador de objetos se muestran las clases específicas.

Cuando trabaje con objetos de otras aplicaciones, en vez de usar Variant o el tipo genérico Object, declare los objetos como se muestran en la lista Clases en el Examinador de objetos. Esto asegura que Visual Basic reconozca el tipo específico de objeto al que está haciendo referencia, lo que permite resolver la referencia en tiempo de ejecución.




Convertir tipos de datos

Visual Basic proporciona varias funciones de conversión que puede usar para convertir valores en tipos de datos específicos. Por ejemplo, para convertir un valor a Currency, utilice la función CCur:

Código:

PagoPorSemana = CCur(horas * PagoPorHora)


Funciones de conversiónConvierten una expresión enCboolBooleanCbyteByteCcurCurrencyCdateDateCDblDoubleCintIntegerCLngLongCSngSingleCStrStringCvarVariantCVErrError
Nota: Los valores que se pasan a una función de conversión deben ser válidos para el tipo de dato de destino o se producirá un error. Por ejemplo, si intenta convertir un tipo Long en un Integer, el tipo Long debe estar en el intervalo válido del tipo de dato Integer.

Para obtener más información   Busque las funciones específicas de conversión en la Referencia del lenguaje.


El tipo de dato Variant

Una variable Variant es capaz de almacenar todos los tipos de datos definidos en el sistema. No tiene que convertir entre esos tipos de datos si los asigna a una variable Variant; Visual Basic realiza automáticamente cualquier conversión necesaria. Por ejemplo:

Código:

Dim AlgúnValor      ' De forma predeterminada es un tipo Variant.
AlgúnValor = "17"   ' AlgúnValor contiene "17" (cadena de dos
                  ' caracteres).
AlgúnValor = AlgúnValor - 15    ' AlgúnValor ahora contiene
                                 ' el valor numérico 2.
AlgúnValor = "U" &amp; AlgúnValor   ' AlgúnValor ahora contiene
                                 ' "U2" (una cadena de dos
                                 ' caracteres).


Si bien puede realizar operaciones con variables Variant sin saber exactamente el tipo de dato que contienen, hay algunas trampas que debe evitar.
Si realiza operaciones aritméticas o funciones sobre un Variant, el Variant debe contener un número.Si está concatenando cadenas, utilice el operador &amp; en vez del operador +. Para obtener más detalles, vea la sección "Cadenas almacenadas en tipos Variant" en "Temas avanzados sobre Variant".
Además de poder actuar como otros tipos de datos estándar, los Variant también pueden contener tres valores especiales: Empty, Null y Error.


El valor Empty

A veces necesitará saber si se ha asignado un valor a una variable existente. Una variable Variant tiene el valor Empty antes de asignarle un valor. El valor Empty es un valor especial distinto de 0, una cadena de longitud cero ("") o el valor Null. Puede probar el valor Empty con la función IsEmpty:

Código:

If IsEmpty(Z) Then Z = 0


Cuando un Variant contiene el valor Empty, puede usarlo en expresiones; se trata como un 0 o una cadena de longitud cero, dependiendo de la expresión.

El valor Empty desaparece tan pronto como se asigna cualquier valor (incluyendo 0, una cadena de longitud cero o Null) a una variable Variant. Puede establecer una variable Variant de nuevo como Empty si asigna la palabra clave Empty al Variant.


El valor Null

El tipo de dato Variant puede contener otro valor especial: Null. Null se utiliza comúnmente en aplicaciones de bases de datos para indicar datos desconocidos o que faltan. Debido a la forma en que se utiliza en las bases de datos, Null tiene algunas características únicas:
Las expresiones que utilizan Null dan como resultado siempre un Null. Así, se dice que Null se "propaga" a través de expresiones; si cualquier parte de la expresión da como resultado un Null, la expresión entera tiene el valor Null.Al pasar un Null, un Variant que contenga un Null o una expresión que dé como resultado un Null como argumento de la mayoría de las funciones hace que la función devuelva un Null.Los valores Null se propagan a través de funciones intrínsecas que devuelven tipos de datos Variant.
También puede asignar un Null mediante la palabra clave Null:

Código:

Z = Null


Puede usar la función IsNull para probar si una variable Variant contiene un Null:

Código:

If IsNull(X) And IsNull(Y) Then
   Z = Null
Else
   Z = 0
End If


Si asigna Null a una variable de un tipo que no sea Variant, se producirá un error interceptable. Asignar Null a una variable Variant no provoca ningún error y el Null se propagará a través de expresiones que contengan variables Variant (Null no se propaga a través de determinadas funciones). Puede devolver Null desde cualquier procedimiento Function con un valor de devolución de tipo Variant.

Null no se asigna a las variables a menos que se haga explícitamente, por lo que si no utiliza Null en su aplicación, no tendrá que escribir código que compruebe su existencia y lo trate.




El valor Error

En un Variant, Error es un valor especial que se utiliza para indicar que se ha producido una condición de error en un procedimiento. Sin embargo, a diferencia de otros tipos de error, no se produce el tratamiento de errores a nivel normal de aplicación. Esto le permite a usted o a la propia aplicación elegir alternativas basadas en el valor del error. Los valores de error se crean convirtiendo números reales en valores de error mediante la función CVErr.

NekroByte:
Temas avanzados sobre el Tipo de Dato Variant


Representación interna de los valores en los tipos Variant

Las variables Variant mantienen una representación interna de los valores que pueden almacenar. Esta representación determina cómo trata Visual Basic esos valores cuando realiza comparaciones y otras operaciones. Cuando asigna un valor a una variable Variant, Visual Basic utiliza la representación más compacta que graba el valor de forma más fiable. Las operaciones posteriores pueden hacer que Visual Basic cambie la representación si está utilizando una variable determinada. (Una variable Variant no es una variable sin tipo, sino una variable que puede cambiar libremente de tipo.) Estas representaciones internas corresponden a los tipos de datos explícitos mostrados en "Tipos de datos" anteriormente en este capítulo.

Nota   Un tipo Variant siempre ocupa 16 bytes, independientemente de lo que almacene en él. Los objetos, las cadenas y las matrices no se almacenan físicamente en el Variant; en estos casos, cuatro bytes del Variant se utilizan para almacenar una referencia de objeto, o un puntero a la cadena o a la matriz. Los datos reales se almacenan en otro lugar.

La mayoría de las veces no le importará la representación interna que Visual Basic esté utilizando para una variable en particular; Visual Basic trata las conversiones automáticamente. Sin embargo, si desea saber qué valor está utilizando Visual Basic, puede emplear la función VarType.

Por ejemplo, si almacena valores con fracciones decimales en una variable Variant, Visual Basic utiliza siempre la representación interna Double. Si sabe que su aplicación no necesita la máxima precisión (y menor velocidad) que proporciona el valor Double, puede acelerar los cálculos si convierte los valores a Single e incluso a Currency:

Código:

If VarType(X) = 5 Then X = CSng(X)   ' Convierte a Single.


En una variable de matriz, el valor de VarType es la suma de la matriz y los valores devueltos del tipo de dato. Por ejemplo, esta cadena contiene valores Double:

Código:

Private Sub Form_Click()
   Dim dblEjemplo(2) As Double
   MsgBox VarType(dblEjemplo)
End Sub


Las versiones futuras de Visual Basic podrán agregar representaciones adicionales de los tipos Variant, por lo que el código que escriba que tome decisiones basadas en el valor devuelto de la función VarType podría devolver un valor que no se ha definido.

Para obtener más información acerca de las matrices, vea "Matrices" más adelante en este mismo capítulo. Para obtener más detalles acerca de la conversión de tipos de datos, vea "Tipos de datos" anteriormente en este mismo capítulo.


Valores numéricos almacenados en tipos Variant

Cuando almacena números enteros en variables Variant, Visual Basic utiliza la representación más compacta posible. Por ejemplo, si almacena un número pequeño sin fracción decimal, el Variant utiliza una representación Integer para el valor. Si asigna un número mayor, Visual Basic usará un valor Long o, si es muy largo o tiene un componente decimal, un valor Double.

A veces querrá usar una representación específica para un número. Por ejemplo, deseará tener una variable Variant para almacenar un valor numérico como Currency y evitar errores de redondeo en cálculos posteriores. Visual Basic proporciona varias funciones de conversión que puede usar para convertir valores en un tipo específico (vea "Convertir tipos de datos" anteriormente en este mismo capítulo). Por ejemplo, para convertir un valor a Currency, utilice la función CCur:

Código:

PagoPorSemana = CCur(horas * pagoPorHora)


Se producirá un error si intenta realizar una operación o función matemática sobre un tipo Variant que no contiene un número o algo que se pueda interpretar como un número. Por ejemplo, no puede realizar operaciones aritméticas sobre el valor U2 aunque contenga un carácter numérico, ya que todo el valor no es un número válido. De la misma manera, no puede realizar cálculos sobre el valor 1040EZ; sin embargo, puede realizar cálculos sobre los valores +10 ó -1,7E6 porque son números válidos. Por esta razón, a menudo deseará determinar si una variable Variant contiene un valor que se pueda usar como un número. La función IsNumeric realiza esta tarea:

Código:

Do
   cualquierNúmero = InputBox("Escriba un número")
Loop Until IsNumeric(cualquierNúmero)
MsgBox "La raíz cuadrada es: " &amp; Sqr(cualquierNúmero)


Cuando Visual Basic convierte una representación que no es numérica (como una cadena que contenga un número) a un valor numérico, utiliza la configuración regional (especificada en el Panel de control de Windows) para interpretar el separador de miles, el separador decimal y el símbolo de moneda.

Así, si la configuración regional del Panel de control de Windows está establecida como Estados Unidos, Canadá o Australia, estas dos instrucciones devolverían "verdadero":

Código:

IsNumeric("$100")
IsNumeric("1,560.50")


Mientras que estas dos instrucciones devolverían "falso":

Código:

IsNumeric("DM100")
IsNumeric("1.560,50")


Sin embargo, podría resultar cierto lo contrario: las dos primeras devolverían falso y las segundas verdadero si la configuración regional del Panel de control de Windows fuera para Alemania.

Si asigna un Variant que contiene un número a una variable de cadena o a una propiedad, Visual Basic convierte automáticamente la representación del número a una cadena. Si desea convertir explícitamente un número a una cadena, utilice la función CStr. También puede usar la función Format para convertir un número a una cadena que incluya formato como los símbolos de moneda, separador de miles y separador decimal. La función Format utiliza automáticamente los símbolos adecuados de acuerdo con el cuadro de diálogo Configuración regional del Panel de control de Windows.




Cadenas almacenadas en tipos Variant

Generalmente, almacenar y usar cadenas en variables Variant plantea pocos problemas. Sin embargo, como se mencionó anteriormente, algunas veces el resultado del operador + puede resultar ambiguo cuando se utiliza con dos valores Variant. Si ambas variables de tipo Variant contienen números, el operador + realizará una suma. Si ambas contienen cadenas, el operador + realizará una concatenación de cadenas. Pero si uno de los valores se representa como numérico y el otro como cadena, la situación es más complicada. Visual Basic intenta primero convertir la cadena en un número. Si la conversión funciona, el operador + suma los dos valores pero, si falla, genera el error El tipo no coincide.

Para asegurarse de que se produce la concatenación, sin tener en cuenta la representación del valor de las variables, utilice el operador &amp;. Por ejemplo, el siguiente código:

Código:

Sub Form_Click ()
   Dim X, Y
   X = "6"
   Y = "7"
   Print X + Y, X &amp; Y
   X = 6
   Print X + Y, X &amp; Y
End Sub


produce este resultado en el formulario:

Código:

67      67
13      67




Valores de fecha y hora almacenados en tipos Variant

Las variables Variant también pueden contener valores de fecha y hora. Algunas funciones devuelven valores de fecha y hora. Por ejemplo, DateSerial devuelve el número de días que quedan del año:

Código:

Private Sub Form_Click ()
   Dim ahora, días, horas, minutos
   ahora = Now   ' Now devuelve la fecha y la hora actuales.
   días = Int(DateSerial(Year(ahora) + 1, 1, 1) - ahora)
   horas = 24 - Hour(ahora)
   minutos = 60 - Minute(ahora)
   Print "Quedan " &amp;días &amp; "&amp;días en el año."
   Print "Quedan " &amp;horas &amp; "&amp;horas en el día."
   Print "Quedan " &amp;minutos &amp; "&amp;minutos en la hora."
End Sub


También puede realizar operaciones matemáticas sobre valores de fecha y hora. Sumar o restar enteros agrega o resta días; sumar o restar fracciones agrega o resta horas. Por tanto, al sumar 20 se agregan 20 días, mientras que al restar 1/24 se resta una hora.

El intervalo para las fechas almacenadas en variables Variant es 1 de enero de 0100 a 31 de diciembre de 9999. Sin embargo, los cálculos sobre fechas no tienen en cuenta las revisiones del calendario antes del calendario gregoriano, por lo que los cálculos que dan como resultado valores de fechas anteriores al año en que se adoptó el calendario gregoriano (1752 en Gran Bretaña y sus colonias en aquella época, y antes o más tarde en otros países) no serán correctas.

Puede usar en el código literales de fecha y hora si los escribe entre signos de número (#), de la misma forma que pone literales de cadena entre comillas (""). Por ejemplo, puede comparar un Variant que contenga un valor de fecha y hora con una fecha literal:

Código:

If AlgunaFecha &gt; #3/6/93# Then


De forma similar, puede comparar un valor de fecha y hora con un literal completo de fecha y hora:

Código:

If AlgunaFecha &gt; #3/6/93 1:20pm# Then


Si no incluye una hora en el literal de fecha y hora, Visual Basic establece la parte horaria del valor como medianoche (el inicio del día). Si no incluye una fecha en un literal de fecha y hora, Visual Basic establece la parte de fecha del valor como 30 de diciembre de 1899.

Visual Basic acepta una amplia variedad de formatos de fecha y hora en literales. Estos son todos los valores válidos de fecha y hora:

Código:

AlgunaFecha = #3-6-93 13:20#
AlgunaFecha = #Marzo 27, 1993 1:20am#
AlgunaFecha = #Abr-2-93#
AlgunaFecha = #4 Abril 1993#



De la misma forma que puede usar la función IsNumeric para averiguar si una variable Variant contiene un valor que se pueda considerar como valor numérico válido, puede usar la función IsDate para averiguar si una variable Variant contiene un valor que se pueda considerar como valor válido de fecha y hora. Puede entonces usar la función CDate para convertir el valor en un valor de fecha y hora.

Por ejemplo, el código siguiente prueba la propiedad Text de un cuadro de texto mediante IsDate. Si la propiedad contiene texto que pueda considerarse una fecha válida, Visual Basic convierte el texto en una fecha y calcula los días que faltan hasta final de año:

Código:

Dim AlgunaFecha, días
If IsDate(Text1.Text) Then
   AlgunaFecha = CDate(Text1.Text)
   días = DateSerial(Year(AlgunaFecha) + 1, 1, 1) - AlgunaFecha
   Text2.Text = "Quedan " días &amp; "días en el año."
Else
   MsgBox Text1.Text &amp; " no es una fecha válida."
End If





Objetos almacenados en tipos Variant

Es posible almacenar objetos en variables Variant. Esto puede resultar muy útil cuando necesite tratar elegantemente gran variedad de tipos de datos, incluyendo objetos. Por ejemplo, todos los elementos de una matriz deben tener el mismo tipo de dato. Establecer el tipo de dato de una matriz como Variant le permite almacenar objetos junto con otros tipos de datos en una matriz.

NekroByte:
Matrices


Si ha programado en otros lenguajes, probablemente ya conocerá el concepto de matrices. Las matrices le permiten hacer referencia por el mismo nombre a una serie de variables y usar un número (índice) para distinguirlas. Esto le ayuda a crear código más pequeño y simple en muchas situaciones, ya que puede establecer bucles que traten de forma eficiente cualquier número de casos mediante el número del índice. Las matrices tienen un límite superior e inferior y los elementos de la matriz son contiguos dentro de esos límites. Puesto que Visual Basic asigna espacio para cada número de índice, evite declarar las matrices más grandes de lo necesario.

Nota: Las matrices mostradas en esta sección son matrices de variables, declaradas en el código. Son distintas de las matrices de controles que se especifica al establecer la propiedad Index de los controles en tiempo de diseño. Las matrices de variables siempre son contiguas; a diferencia de las matrices de controles, no puede cargar y descargar elementos de la mitad de la matriz.

Todos los elementos de una matriz tienen el mismo tipo de datos. Por supuesto, cuando el tipo de dato es Variant, los elementos individuales pueden contener distintas clases de datos (objetos, cadenas, números, etc.). Puede declarar una matriz de cualquiera de los tipos de datos fundamentales, incluyendo los tipos definidos por el usuario (descritos en la sección "Creación de sus propios tipos de datos", en "Más acerca de la programación ") y variables de objetos (descritas en "Programación con objetos").

En Visual Basic hay dos tipos de matrices: las matrices de tamaño fijo que tienen siempre el mismo tamaño y las matrices dinámicas cuyo tamaño cambia en tiempo de ejecución. Las matrices dinámicas se describen con más detalle en la sección "Matrices dinámicas", más adelante en este mismo capítulo.


Declarar matrices de tamaño fijo

Hay tres formas de declarar una matriz de tamaño fijo, dependiendo del alcance que desee que tenga la matriz:
Para declarar una matriz pública, utilice la instrucción Public en la sección Declaraciones de un módulo para declarar la matriz.Para crear una matriz a nivel de módulo, utilice la instrucción Private en la sección Declaraciones de un módulo para declarar la matriz.Para crear una matriz local, utilice la instrucción Private en un procedimiento para declarar la matriz.

Establecer los límites superior e inferior

Cuando declare una matriz, ponga a continuación del nombre de la matriz el límite superior entre paréntesis. El límite superior no puede exceder el intervalo de un tipo de dato Long (-2.147.483.648 a 2.147.483.647). Por ejemplo, estas declaraciones de matrices pueden aparecer en la sección Declaraciones de un módulo:

Código:

Dim Contadores(14) As Integer   ' 15 elementos.
Dim Sumas(20) As Double            ' 21 elementos.


Para crear una matriz pública, simplemente utilice Public en lugar de Dim:

Código:

Public Contadores(14) As Integer
Public Sumas(20) As Double


Las mismas declaraciones dentro de un procedimiento utilizan Dim:

Código:

Dim Contadores(14) As Integer
Dim Sumas(20) As Double


La primera declaración crea una matriz de 15 elementos, con números de índice que van de 0 a 14. La segunda crea una matriz de 21 elementos, con números de índice que van de 0 a 20. El límite inferior predeterminado es 0.

Para especificar el límite inferior, proporciónelo explícitamente (como tipo de dato Long) mediante la palabra clave To:

Código:

Dim Contadores(1 To 15) As Integer
Dim Sumas(100 To 120) As String


En las anteriores declaraciones, los números de índice de Contadores van de 1 a 15 y los números de índice de Sumas van de 100 a 120.


Matrices que contienen otras matrices

Es posible crear una matriz Variant y llenarla con otras matrices de distintos tipos de datos. El código siguiente crea dos matrices, una que contiene enteros y otra que contiene cadenas. Se declara entonces una tercera matriz Variant y se llena con las matrices de enteros y cadenas.

Código:

Private Sub Command1_Click()
   Dim intX As Integer   ' Declara la variable de contador.
   ' Declara y llena una matriz de enteros.
   Dim contadoresA(5) As Integer
      For intX = 0 To 4
         contadoresA(intX) = 5
      Next intX
   ' Declara y llena una matriz de cadenas.
      Dim contadoresB(5) As String
         For intX = 0 To 4
            contadoresB(intX) = "adiós"
         Next intX
   Dim arrX(2) As Variant         ' Declara una matriz nueva de dos
                                 ' miembros.
      arrX(1) = contadoresA()   ' Llena la matriz con las otras
                                 ' matrices.
      arrX(2) = contadoresB()
      MsgBox arrX(1)(2)            ' Muestra un miembro de cada
                                 ' matriz.
      MsgBox arrX(2)(3)
End Sub



Matrices multidimensionales

A veces necesitará hacer un seguimiento de la información relacionada de una matriz. Por ejemplo, para hacer un seguimiento de cada píxel de la pantalla del equipo, necesitará referirse a sus coordenadas X e Y. Esto se puede hacer mediante una matriz multidimensional para almacenar los valores.

En Visual Basic puede declarar matrices de varias dimensiones. Por ejemplo, la instrucción siguiente declara una matriz bidimensional de 10 por -10 en un procedimiento:

Código:

Static MatrizA(9, 9) As Double


Se puede declarar una o ambas dimensiones con límites inferiores explícitos:

Código:

Static MatrizA(1 To 10, 1 To 10) As Double


Puede hacer que tenga más de dos dimensiones. Por ejemplo:

Código:

Dim MultiD(3, 1 To 10, 1 To 15)


Esta declaración crea una matriz que tiene tres dimensiones con tamaños de 4 por 10 por 15. El número total de elementos es el producto de las tres dimensiones, es decir, 600.

Nota: Cuando comience a agregar dimensiones a una matriz, el almacenamiento total que necesita la matriz se incrementa considerablemente, por lo que debe usar las matrices multidimensionales con sumo cuidado. Tenga especial cuidado con las matrices Variant, ya que son más grandes que otros tipos de datos.


Usar bucles para manipular matrices

Puede procesar eficientemente una matriz multidimensional mediante bucles For anidados. Por ejemplo, estas instrucciones inicializan cada elemento de MatrizA a un valor basándose en su ubicación en la matriz:

Código:

Dim I As Integer, J As Integer
Static MatrizA(1 To 10, 1 To 10) As Double
For I = 1 To 10
   For J = 1 To 10
      MatrizA(I, J) = I * 10 + J
   Next J
Next I

NekroByte:
Matrices dinámicas


A veces necesitará saber exactamente lo grande que debe ser una matriz. Puede que desee poder cambiar el tamaño de la matriz en tiempo de ejecución.

Una matriz dinámica se puede cambiar de tamaño en cualquier momento. Las matrices dinámicas son una de las características más flexibles y cómodas de Visual Basic, y le ayudan a administrar de forma eficiente la memoria. Por ejemplo, puede usar una matriz grande durante un tiempo corto y liberar memoria del sistema cuando no necesite volver a usar la matriz.

La alternativa consiste en declarar la matriz con el mayor tamaño posible y pasar por alto los elementos de la matriz que no necesite. Sin embargo, esta solución, si se utiliza demasiado, puede hacer que el sistema operativo funcione con muy poca memoria.

Para crear una matriz dinámica

Declare la matriz con la instrucción Public (si desea que la matriz sea pública), la instrucción Dim a nivel de módulo (si desea que sea una matriz a nivel de módulo), o con la instrucción Static o Dim en un procedimiento (si desea que la matriz sea local). Declare la matriz como dinámica proporcionándole una lista de dimensiones vacía.

Código:

Dim MatrizDyn()

Asigne el número real de elementos con la instrucción ReDim.

Código:

ReDim MatrizDyn(X + 1)
[/list]

La instrucción ReDim puede aparecer sola en un procedimiento. A diferencia de las instrucciones Dim y Static, ReDim es una instrucción ejecutable; hace que la aplicación realice una acción en tiempo de ejecución.

La instrucción ReDim acepta la misma sintaxis que se utiliza en las matrices fijas. Cada ReDim puede cambiar el número de elementos, así como los límites inferior y superior de cada dimensión. Sin embargo, no se puede cambiar el número de dimensiones de la matriz.

Código:

ReDim MatrizDyn(4 to 12)

Por ejemplo, la matriz dinámica Matriz1 se crea declarándola primero a nivel de módulo:

Código:

Dim Matriz1() As Integer

Luego, un procedimiento asigna el espacio de la matriz:

Código:

Sub CalcValoresAhora ()
   .
   .
   .
   ReDim Matriz1(19, 29)
End Sub

La instrucción ReDim mostrada aquí asigna una matriz de 20 por 30 enteros (con un tamaño total de 600 elementos). Como alternativa, se pueden establecer los límites de una matriz dinámica mediante variables:

Código:

ReDim Matriz1(X, Y)


Nota  Puede asignar cadenas a matrices redimensionables de bytes. Una matriz de bytes también se puede asignar a una cadena de longitud fija. Tenga cuidado en que el número de bytes de una cadena es diferente según las plataformas. En plataformas Unicode la misma cadena contiene el doble de bytes que los que contiene una plataforma no Unicode.


Preservar el contenido de las matrices dinámicas

Cada vez que ejecute la instrucción ReDim perderá todos los valores almacenados en ese momento en la matriz. Visual Basic restablece los valores al valor Empty (en matrices Variant), a cero (en matrices numéricas), a una cadena de longitud cero (en matrices de cadenas) o a Nothing (en matrices de objetos).

Esto resulta muy útil cuando desee preparar la matriz para contener datos nuevos o cuando desee reducir el tamaño de la matriz para que ocupe menos memoria. Puede que a veces desee cambiar el tamaño de la matriz sin perder los datos de la misma. Para ello puede usar ReDim con la palabra clave Preserve. Por ejemplo, puede ampliar una matriz en un elemento sin perder los valores de los elementos existentes mediante la función UBound para hacer referencia al límite superior:

Código:

ReDim Preserve MatrizDyn(UBound(MatrizDyn) + 1)


Sólo se puede cambiar el límite superior de la última dimensión de una matriz multidimensional cuando se utiliza la palabra clave Preserve; si cambia alguna otra dimensión o el límite inferior de la última dimensión, se producirá un error en tiempo de ejecución. Así pues, puede usar un código como el siguiente:

Código:

ReDim Preserve Matriz(10, UBound(Matriz, 2) + 1)


Pero no puede usar este código:

Código:

ReDim Preserve Matriz(UBound(Matriz, 1) + 1, 10)


|

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior