Introducción.
Hay ocasiones en las que es necesario crear una instancia de un módulo de clase en particular más de una vez, para usar un conjunto similar de valores para una aplicación en particular.
Por ejemplo, nuestro módulo de clase ClsArea, que hemos diseñado para calcular el área de la alfombra de las habitaciones, es un candidato para aplicaciones similares. Supongamos que nos gustaría saber cuántas baldosas de piso necesitamos colocar en una habitación, entonces también deberíamos poder ingresar los valores de Largo y Ancho de Baldosa, además de los valores de dimensión de Piso. Dado que Floor y Tile tienen valores de propiedad similares como entrada, podemos usar dos instancias del módulo de clase ClsArea, una instancia para el área FLOOR y la segunda instancia para el área TILE. Floor-Area / Tile-Area proporciona el número total de mosaicos para una habitación en particular.
Dos Instancias del mismo Módulo de Clase.
Podemos hacer esto creando dos instancias diferentes del Módulo de Clase ClsArea en el Programa del Módulo Estándar si solo hay una Sala.
Public Sub FloorTiles() Dim FLOOR As ClsArea Dim TILES As ClsArea Dim flrArea As Double, tilearea As Double Dim lngTiles As Long Set FLOOR = New ClsArea Set TILES = New ClsArea FLOOR.strDesc = "Bed Room1" FLOOR.dblLength = 25 FLOOR.dblWidth = 15 flrArea = FLOOR.Area() TILES.strDesc = "Off-White" TILES.dblLength = 2.5 TILES.dblWidth = 1.25 tilearea = TILES.Area() lngTiles = flrArea / tilearea Debug.Print FLOOR.strDesc & " Required Tiles: " & lngTiles & " Numbers - Color: " & TILES.strDesc Set FLOOR = Nothing Set TILES = Nothing End Sub
Manejo de una matriz de objetos.
Pero, ¿qué pasa si necesitamos aplicar el método anterior para una matriz de varias habitaciones con diferentes tamaños o colores de mosaicos? La respuesta a eso es crear un nuevo módulo de clase con dos instancias del mismo ClsArea Clase, una instancia para Suelo, y el otro para Tejas Propiedades. Ambas instancias están envueltas en un nuevo módulo de clase.
Hagámoslo.
- Abra su base de datos y muestre la ventana de edición de código (ALT+F11).
- Seleccione el Módulo de clase de Insertar Menú.
- Cambiar el Nombre Valor de propiedad para ClsTiles .
- Copie y pegue el siguiente código VBA en el módulo de clase ClsTiles y guarde el código:
Option Compare Database Option Explicit Private pFLOOR As ClsArea Private pTILES As ClsArea Private Sub Class_Initialize() Set pFLOOR = New ClsArea Set pTILES = New ClsArea End Sub Private Sub Class_Terminate() Set pFLOOR = Nothing Set pTILES = Nothing End Sub Public Property Get Floor() As ClsArea Set Floor = pFLOOR End Property Public Property Set Floor(ByRef NewValue As ClsArea) Set pFLOOR = NewValue End Property Public Property Get Tiles() As ClsArea Set Tiles = pTILES End Property Public Property Set Tiles(ByRef NewValue As ClsArea) Set pTILES = NewValue End Property Public Function NoOfTiles() As Long NoOfTiles = pFLOOR.Area() / pTILES.Area() End Function
Ambas instancias, pFLOOR y pTILES se declaran como propiedades privadas del objeto de clase ClsTiles.
El Class_Initialize() La subrutina instancia ambos objetos en la memoria cuando ClsTiles Class Module se instancia en el programa de usuario.
El Class_Terminate() La subrutina elimina ambas instancias (pFLOOR y pTILES) de la memoria cuando la instancia del Módulo de clase ClsTiles se establece en Nada en el programa de usuario.
El Obtener y Establecer Los procedimientos de propiedad permiten la recuperación y asignación de valores, desde y hacia la instancia pFLOOR respectivamente, en el objeto de clase ClsTiles.
El siguiente procedimiento de obtención y establecimiento de propiedades permite las mismas operaciones en la instancia pTILES de la clase ClsArea.
Hemos añadido una nueva función NoOfTiles() en el nuevo módulo de clase, para calcular la cantidad de mosaicos, en función de la dimensión del área del piso y del mosaico.
Escribamos un programa y aprendamos el uso de múltiples instancias del mismo objeto de clase, en un nuevo módulo de clase:ClsTiles.
- Copie y pegue el siguiente código VBA en un módulo estándar:
Public Sub TilesCalc() Dim FTiles As ClsTiles Dim TotalTiles As Long Set FTiles = New ClsTiles FTiles.Floor.strDesc = "Warehouse" FTiles.Floor.dblLength = 100 FTiles.Floor.dblWidth = 50 FTiles.Tiles.dblLength = 2.5 FTiles.Tiles.dblWidth = 1.75 TotalTiles = FTiles.NoOfTiles() Debug.Print "Site Name", "Floor Area", "Tile Area", "No. of Tiles" Debug.Print FTiles.Floor.strDesc, FTiles.Floor.Area, FTiles.Tiles.Area, TotalTiles End Sub
- Mantenga abierta la ventana de depuración (CTRL+G) para imprimir los datos de prueba.
- Haga clic en algún lugar en el medio del código VBA y presione F5 Clave para ejecutar el Código. El resultado se imprime en la ventana de depuración.
Si desea calcular los requisitos de baldosas de varias habitaciones o habitaciones de varios pisos de un edificio de gran altura, debe ejecutar el programa anterior varias veces y anotar los valores, lo cual es prácticamente muy difícil.
Encontrar el requisito de mosaico de varias habitaciones.
Ahora, escribamos otro programa para encontrar los requisitos de mosaico de varias habitaciones, con una matriz de ClsTiles Objetos introduciendo los valores de propiedad directamente desde el teclado.
- Copie y pegue el siguiente código VBA en un módulo estándar.
Public Sub TilesCalc2() Dim tmpFT As ClsTiles Dim FTiles() As ClsTiles Dim j As Long, L As Long, H As Long For j = 1 To 3 Set tmpFT = New ClsTiles 'Floor dimension With tmpFT.Floor .strDesc = InputBox(Str(j) & ") Floor Desc", , 0) .dblLength = InputBox(Str(j) & ") Floor Length", , 0) .dblWidth = InputBox(Str(j) & ") Floor Width", , 0) End With 'Tile Dimension With tmpFT.Tiles .strDesc = InputBox(Str(j) & ") Tiles Desc", , 0) .dblLength = InputBox(Str(j) & ") Tile Length", , 0) .dblWidth = InputBox(Str(j) & ") Tile Width", , 0) End With ReDim Preserve FTiles(1 To j) As ClsTiles Set FTiles(j) = tmpFT Set tmpFT = Nothing Next 'Take Printout L = LBound(FTiles) H = UBound(FTiles) Debug.Print "FLOOR", "Floor Area", "TILES", "Tile Area", "Total Tiles" For j = L To H With FTiles(j) Debug.Print .Floor.strDesc, .Floor.Area(), .Tiles.strDesc, .Tiles.Area(), .NoOfTiles End With Next 'Remove all objects from memory For j = L To H Set FTiles(j) = Nothing Next End Sub
- Mantenga abierta la ventana de depuración para imprimir el resultado allí.
- Ejecute el código como antes e ingrese valores para las dimensiones del piso y mosaico para tres habitaciones.
Como puede ver en el código anterior, ambos valores de las dimensiones Room y Tile van a la misma instancia de Class Object Array, uno al lado del otro.
El programa anterior es una demostración que se ejecuta solo para tres conjuntos de valores dentro de For. . . Siguiente bucle. Se puede modificar con un bucle condicional que se ejecuta un número determinado de veces hasta que un código de interrupción condicional finaliza el programa.
El programa se puede modificar para guardar cada conjunto de valores de datos y resultados de cálculo en una tabla para referencia futura.
Una clase contenedora es un Contenedor Clase para instancias de otras clases, estructuras de datos o colección de instancias de otros objetos. Aquí lo hemos usado para contener dos instancias de la misma clase Objeto.
Lista de todos los enlaces sobre este tema.
- Módulo de clase MS-Access y VBA
- Matrices de objetos de clase VBA de MS-Access
- Clase base de MS-Access y objetos derivados
- Clase base de VBA y objetos derivados-2
- Variantes de clase base y objeto derivado
- Conjunto de registros y módulo de clase Ms-Access
- Módulo de clase de acceso y clases contenedoras
- Transformación de la funcionalidad de la clase contenedora
- Conceptos básicos de Ms-Access y objetos de colección
- Módulo de clase Ms-Access y objeto de colección
- Registros de tabla en objeto y formulario de colección
- Conceptos básicos de objetos de diccionario
- Conceptos básicos de objetos de diccionario-2
- Ordenar elementos y claves de objetos del diccionario
- Mostrar registros del diccionario al formulario
- Agregar objetos de clase como elementos de diccionario
- Agregar objetos de clase como elementos de diccionario
- Actualizar elemento del diccionario de objetos de clase en el formulario