sql >> Base de Datos >  >> RDS >> Access

Módulo de clase de acceso y clases contenedoras

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.

  1. Abra su base de datos y muestre la ventana de edición de código (ALT+F11).
  2. Seleccione el Módulo de clase de Insertar Menú.
  3. Cambiar el Nombre Valor de propiedad para ClsTiles .
  4. 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.

  5. 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
     
  6. Mantenga abierta la ventana de depuración (CTRL+G) para imprimir los datos de prueba.
  7. 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.

  8. 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
    
    
  9. Mantenga abierta la ventana de depuración para imprimir el resultado allí.
  10. 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.

  1. Módulo de clase MS-Access y VBA
  2. Matrices de objetos de clase VBA de MS-Access
  3. Clase base de MS-Access y objetos derivados
  4. Clase base de VBA y objetos derivados-2
  5. Variantes de clase base y objeto derivado
  6. Conjunto de registros y módulo de clase Ms-Access
  7. Módulo de clase de acceso y clases contenedoras
  8. Transformación de la funcionalidad de la clase contenedora
  9. Conceptos básicos de Ms-Access y objetos de colección
  10. Módulo de clase Ms-Access y objeto de colección
  11. Registros de tabla en objeto y formulario de colección
  12. Conceptos básicos de objetos de diccionario
  13. Conceptos básicos de objetos de diccionario-2
  14. Ordenar elementos y claves de objetos del diccionario
  15. Mostrar registros del diccionario al formulario
  16. Agregar objetos de clase como elementos de diccionario
  17. Agregar objetos de clase como elementos de diccionario
  18. Actualizar elemento del diccionario de objetos de clase en el formulario