Objetos almacenados en variables variantes
Los objetos se pueden almacenar en variables variantes. Esto puede resultar útil cuando necesita manejar de manera eficiente varios tipos de datos, incluidos los objetos. Por ejemplo, todos los elementos de una matriz deben tener el mismo tipo de datos. Establezca el tipo de datos de la matriz en Variante para almacenar objetos junto con otros tipos de datos en la misma matriz.
formación
Si tienes experiencia programando en otros lenguajes, debes estar familiarizado con el concepto de arrays. Gracias a los arrays, puedes hacer referencia a una serie de variables con el mismo nombre e identificarlas numéricamente (indexadas). En muchas situaciones, el uso de matrices puede acortar y simplificar los programas porque puede diseñar un bucle utilizando valores de índice para manejar múltiples situaciones de manera eficiente. Las matrices tienen límites superior e inferior, y los elementos de la matriz son continuos dentro de los límites superior e inferior. Dado que Visual Basic asigna espacio para cada valor de índice, no declare una matriz que sea irrealmente grande.
Tenga en cuenta que las matrices analizadas en esta sección son matrices de variables declaradas en el programa. Son diferentes de las matrices de control, que se especifican en tiempo de diseño estableciendo la propiedad Índice del control. Las matrices de variables siempre son contiguas; a diferencia de las matrices de control, los elementos de la matriz no se pueden cargar ni descargar desde el medio de una matriz.
Todos los elementos de una matriz tienen el mismo tipo de datos. Por supuesto, cuando el tipo de datos es Variante, cada elemento puede contener diferentes tipos de datos (objetos, cadenas, valores, etc.). Se pueden declarar matrices de cualquier tipo de datos básico, incluidos los tipos definidos por el usuario (consulte "Crear sus propios tipos de datos" en el Capítulo 8, "Programar nuevamente") y variables de objeto (consulte el Capítulo 9, "Programación con objetos").
Hay dos tipos de matrices en Visual Basic: matrices de tamaño fijo, que siempre mantienen el mismo tamaño, y matrices dinámicas cuyo tamaño puede cambiar en tiempo de ejecución. Los arreglos dinámicos se analizan en detalle en "Arreglos dinámicos" más adelante en este capítulo.
Declarar una matriz de tamaño fijo
Hay tres formas de declarar una matriz de tamaño fijo, y el método que utilice depende del rango válido que debe tener la matriz:
Para crear una matriz pública, declare la matriz usando la declaración Pública en la sección de declaración del módulo.
Para crear una matriz a nivel de módulo, declare la matriz usando la declaración PRIvate en la sección de declaración del módulo.
Cree una matriz local y declare la matriz con la declaración privada en el proceso.
Establecer límites superiores e inferiores
Al declarar una matriz, el nombre de la matriz va seguido de un límite superior entre paréntesis. El límite superior no debe exceder el rango del tipo de datos Long (-2.147.483.648 a 2.147.483.647). Por ejemplo, la siguiente declaración de matriz puede aparecer en la sección de declaración de un módulo:
DimCounters(14)AsInteger '15 elementos.
DimSums(20)AsDouble '21 elementos.
Para crear una matriz pública, reemplace directamente Dim con Public.
Contadores públicos(14)Como entero
PublicSums(20)ComoDoble
La misma declaración utiliza Dim en el procedimiento: DimCounters(14)AsIntegerDimSums(20)AsDouble La primera declaración crea una matriz con 15 elementos, indexados de 0 a 14. La segunda declaración crea una matriz con 21 elementos, indexados del 0 al 20. El límite inferior predeterminado es 0.
Para especificar un límite inferior, utilice la palabra clave To para proporcionar un límite inferior explícito (para el tipo de datos Largo):
Contadores tenues (1 a 15) como entero
DimSums(100To120)AsString
En la declaración anterior, los contadores tienen valores de índice que van de 1 a 15, mientras que las sumas tienen valores de índice que van de 100 a 120.
Matrices que contienen otras matrices
Es posible crear matrices de tipos de datos variantes y ubicarlas junto con matrices de diferentes tipos de datos. El siguiente código crea dos matrices, una que contiene números enteros y la otra que contiene cadenas. Luego declare una tercera matriz Variant y coloque las matrices de enteros y cadenas en ella:
PrivadoSubCommand1_Click()
DimintXAsInteger 'Declarar variable de contador.
'Declara y coloca una serie de números enteros.
DimcountersA(5)AsInteger
FlorínX=0To4
contadoresA(intX)=5
SiguienteintX
'Declara y coloca una serie de cadenas.
Contadores atenuadosB(5)AsString
FlorínX=0To4
contadoresB(intX)=hola
SiguienteintX
DimarrX(2)AsVariant 'Declara una nueva matriz con dos miembros.
arrX(1)=countersA() 'Mueve otras matrices a la matriz.
arrX(2)=contadoresB()
MsgBoxarrX(1)(2) 'Muestra cada miembro de la matriz.
MensajeBoxarrX(2)(3)
FinSub
matriz multidimensional
A veces es necesario rastrear información relevante en una matriz. Por ejemplo, para rastrear cada píxel en la pantalla de una computadora, es necesario hacer referencia a sus coordenadas X e Y. En este momento, se deben utilizar matrices multidimensionales para almacenar valores. Las matrices multidimensionales se pueden declarar con Visual Basic. Por ejemplo, la siguiente declaración declara una matriz bidimensional de 10×10 dentro de un procedimiento.
Matriz estáticaA(9,9)AsDouble
Puede declarar una o ambas dimensiones con un límite inferior explícito:
Matriz estáticaA(1A10,1A10)ComoDoble
Todo esto se puede generalizar a matrices de más de dos dimensiones. Por ejemplo:
DimMultiD(3,1A10,1A15)
Esta declaración crea una matriz tridimensional de tamaño 4×10×15. El número total de elementos es el producto de las tres dimensiones, que es 600.
Tenga en cuenta que al aumentar la dimensión de una matriz, el espacio de almacenamiento ocupado por la matriz aumentará significativamente, por lo que las matrices multidimensionales deben usarse con precaución. Tenga mucho cuidado al utilizar matrices Variant porque requieren mayor espacio de almacenamiento.
Usar bucles para manipular matrices
Puede utilizar bucles For anidados para procesar eficazmente matrices multidimensionales. Por ejemplo, en MatrixA, a cada elemento se le asigna un valor según su posición en la matriz:
DimIAsInteger,JAsInteger
Matriz estáticaA(1A10,1A10)ComoDoble
ParaI=1A10
ParaJ=1A10
MatrizA(I,J)=I*10 J
SiguienteJ
siguienteyo
Más información Para obtener más información sobre los bucles, consulte la sección "Estructuras de bucles" más adelante en este capítulo.
matriz dinámica
A veces se desconoce el tamaño que debe tener una matriz. Así que espero tener la capacidad de cambiar el tamaño de la matriz en tiempo de ejecución.
Las matrices dinámicas pueden cambiar de tamaño en cualquier momento. En Visual Basic, las matrices dinámicas son las más flexibles y convenientes y ayudan a administrar la memoria de manera efectiva. Por ejemplo, puede utilizar una matriz grande durante un período breve y luego liberar espacio de memoria para el sistema cuando la matriz no esté en uso.
Si no utiliza una matriz dinámica, declare una matriz con el tamaño más grande posible y luego borre los elementos innecesarios. Sin embargo, si este método se usa excesivamente, hará que el entorno operativo de la memoria se ralentice.
Para crear una matriz dinámica, siga estos pasos:
1. (Si desea que la matriz sea una matriz pública, entonces) declare la matriz con la declaración Pública, o (si desea que la matriz sea un nivel de módulo, entonces) declare la matriz con la declaración Dim a nivel de módulo , o (si desea que la matriz sea una matriz local, entonces) en Utilice la instrucción Static o Dim para declarar la matriz durante el procedimiento. Declare la matriz como dinámica agregándole una tabla de dimensiones vacía.
DimDynArray()
2. Utilice la instrucción ReDim para asignar el número real de elementos.
ReDimDynArray(X 1)
Las declaraciones ReDim sólo pueden aparecer dentro de los procedimientos. A diferencia de la declaración Dim y la declaración estática, la declaración ReDim es una declaración ejecutable. Debido a esta declaración, la aplicación realiza una operación en tiempo de ejecución. La instrucción ReDim admite una sintaxis que es la misma que se usa con matrices fijas. Para cada dimensión, cada declaración ReDim puede cambiar la cantidad de elementos y los límites superior e inferior. Sin embargo, las dimensiones de la matriz no se pueden cambiar.
ReDimDynArray(4a12)
Por ejemplo, utilice la matriz dinámica Matrix1 creada a nivel de módulo por primera vez:
DimMatrix1()ComoEntero
Luego, asigne espacio para la matriz en el procedimiento:
SubCalcValuesNow()
.
.
.
ReDimMatrix1(19,29)
FinSub
La declaración ReDim aquí asigna una matriz entera de 20 × 30 a Matrix (el tamaño total del elemento es 600). Hay otra forma de utilizar variables para establecer los límites de las matrices dinámicas:
ReDimMatrix1(X,Y)
Tenga en cuenta que puede asignar una cadena a una matriz de bytes de tamaño variable. También se puede asignar una matriz de bytes a una cadena de longitud variable. Es importante tener en cuenta que la cantidad de bytes en la cadena variará según la plataforma. La misma cadena tiene el doble de bytes en una plataforma Unicode que en una plataforma que no es Unicode.
Preservar el contenido de una matriz dinámica
Cada vez que se ejecuta una instrucción ReDim, se pierden todos los valores actualmente almacenados en la matriz. Visual Basic restablece el valor de un elemento de matriz a Vacío (para una matriz Variant), a 0 (para una matriz numérica), a una cadena de longitud cero (para una matriz de cadenas) o a Nada (para una matriz de objetos). .
Esto resulta útil al preparar una matriz para datos nuevos o cuando desea reducir el tamaño de la matriz para ahorrar memoria. A veces desea cambiar el tamaño de una matriz sin perder los datos de la matriz. Esto se puede hacer usando la declaración ReDim con la palabra clave Preserve. Por ejemplo, usar la función UBound para hacer referencia al límite superior hace que la matriz se expanda y agregue un elemento sin perder el valor del elemento existente:
ReDimPreserveDynArray(UBound(DynArray) 1)
Cuando utiliza la palabra clave Preservar, solo puede cambiar el límite superior de la última dimensión en una matriz multidimensional; si cambia el límite inferior de otras dimensiones o la última dimensión, se producirá un error en tiempo de ejecución. Entonces se puede programar así:
ReDimPreserveMatrix(10,UBound(Matriz,2) 1)
En lugar de programar así:
ReDimPreserveMatrix(UBound(Matriz,1) 1,10)
Para obtener información más detallada sobre las matrices dinámicas, consulte "Función ReDim" en la referencia del idioma. Para obtener información sobre matrices de objetos, consulte el Capítulo 9, "Programación con objetos".
->