Introducción.
Si no ha visto las Publicaciones anteriores en el Módulo de clase de Microsoft Access, revíselas antes de continuar, los enlaces se proporcionan a continuación.
- Módulo de clases de MS-Access y VBA.
- Matriz de objetos de clase MS-Access VBA.
El ClsArea La clase puede funcionar como una clase base en otro objeto de clase, el cálculo realizado por la clase base se puede usar como parte de los cálculos del nuevo objeto. Por ejemplo, puede ser parte de un Objeto que calcula el Volumen de algo,
El dbl en dblLength y dblAncho Nombres de procedimientos de propiedad para Get/Let Los procedimientos son simplemente una indicación de que el objeto de clase espera los valores de longitud y anchura en números de doble precisión. De manera similar, si cambiamos los nombres de los procedimientos de propiedad a cantidad y precio unitario, el primer valor multiplicado por el segundo valor nos da el precio total de algún artículo.
Simplemente significa que puede usar ClsArea Class como clase base, siempre que necesite el resultado del primer valor multiplicado por el segundo valor, como Precio total * Tasa de impuestos para calcular el monto del impuesto o Precio total * Tasa de descuento para encontrar el monto del descuento y así.
Aunque hemos desarrollado un módulo de clase simple, puede ser parte de muchas otras clases derivadas. Las posibilidades están abiertas a tu imaginación y creatividad.
Nuestra clase ClsArea calcula el área de materiales, habitaciones o elementos similares solo con propiedades de longitud y anchura. No calcula el área del Triángulo o Círculo. Pero, puede ser parte de un nuevo objeto de clase que calcula el volumen de habitaciones, almacenes para encontrar la capacidad de almacenamiento. Para eso, necesitamos un valor más de Altura de Habitación, Almacén, etc.
La clase de volumen:ClsVolume.
Vamos a crear un nuevo módulo de clase ClsVolume, utilizando ClsArea como clase base. Inserte un módulo de clase y cambie su nombre Propiedad de ClsVolume . Escriba o copie y pegue el siguiente código en el módulo de clase.
Option Compare Database Option Explicit Private p_Area As ClsArea Private p_Height As Double Private Sub Class_Initialize() Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() Set p_Area = Nothing End Sub Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) Do While Val(Nz(dblNewValue, 0)) <= 0 dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height = dblNewValue End Property Public Function Volume() As Double If (p_Area.Area() > 0) And (p_Height > 0) Then Volume = p_Area.Area * p_Height Else MsgBox "Enter Valid Values for Length,Width and Height.", , "ClsVolume" End If End Function
El código del objeto de clase ClsVolume aún no está completo. Examinemos el código línea por línea. En la tercera línea declarada como Propiedad Privada p_Area del objeto de clase ClsArea.
La siguiente línea declara una propiedad privada con el nombre p_Height de tipo de dato Doble.
Las subrutinas Class_Initialize() y Class_Terminate().
Las siguientes dos subrutinas (Inicializar() y Terminar() ) son muy importantes aquí.
El Inicializar() ejecuta e instancia el objeto ClsArea en memoria cuando usamos e instanciamos la ClsVolume Class Objeto en nuestro programa Módulo Estándar.
Cuando ejecutamos la Declaración Set ClsVolume =Nothing en el programa Módulo estándar, para borrar el objeto ClsVolume de la memoria, Terminate() La subrutina se ejecuta y libera el espacio de memoria ocupado por el objeto ClsArea.
La propiedad Obtener dblHeight El procedimiento devuelve el valor de p_Height Propiedad al Programa llamante.
La propiedad Let dblHeight El procedimiento valida el valor pasado al NewValue parámetro y lo asigna a la propiedad privada p_Height .
La función pública Volume() calcula el Volumen llamando a p_Area.Area() Función y el valor del área devuelta se multiplica por p_Altura para calcular el Volumen, con la expresión:Volumen =p_Area.Area * p_Altura. Pero, antes de ejecutar esta declaración, estamos realizando una verificación de validación para garantizar que la función p_Area.Area() devuelva un valor mayor que cero, lo que indica que las propiedades p_Area.dblLength, p_Area.dblWidth tienen valores válidos y el valor de la propiedad p_Height es mayor que cero.
Los procedimientos de propiedad Let/Get.
Agregue la siguiente propiedad Get/Let Procedimientos y Área() función al código del módulo de clase ClsVolume:
Public Property Get strDesc() As String strDesc = p_Area.strDesc End Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc = NewValue End Property Public Property Get dblLength() As Double dblLength = p_Area.dblLength End Property Public Property Let dblLength(ByVal NewValue As Double) p_Area.dblLength = NewValue End Property Public Property Get dblWidth() As Double dblWidth = p_Area.dblWidth End Property Public Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth = NewValue End Property Public Function Area() As Double Area = p_Area.Area() End Function
Compruebe los procedimientos de propiedad strDesc() Get/Let líneas de código. El uso del nombre del procedimiento strDesc es simplemente una cuestión de elección, si desea utilizar un nombre diferente, es bienvenido. Pero, el nombre de propiedad original que hemos usado en la clase ClsArea es strDesc. Usar ese nombre original aquí nos recuerda la relación con el objeto de clase ClsArea original.
En el siguiente procedimiento de propiedad Get dblLength(), la expresión a la derecha de = firmar p_Area.dblLength lee el valor de dblLength almacenado en el objeto de clase ClsArea y vuelve al programa de llamada.
El procedimiento Let Property asigna el valor del parámetro en la variable NewValue a la propiedad p_Area.dblLength del objeto de clase ClsArea. Aquí, no estamos ejecutando ninguna verificación de validación en el valor recibido en la variable de parámetro NewValue. La comprobación de Validación se realizará dentro de la propia Clase ClsArea cuando asignemos el valor a p_Area.dblLength propiedad.
De manera similar, los procedimientos de propiedad Get/Let también se agregan para la propiedad p_Area.dblWidth,
A continuación, el p_Area.Area() La función se hace visible a través del objeto de clase ClsVolume para el programa que llama.
El código del módulo de clase derivado de ClsVolume.
El código completo del módulo de clase ClsVolume se proporciona a continuación.
Option Compare Database Option Explicit Private p_Area As ClsArea Private p_Height As Double Private Sub Class_Initialize() ‘Open ClsArea Object in Memory with the name p_Area Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() ‘Removes the Object p_Area from Memory Set p_Area = Nothing ‘ End Sub Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) Do While Val(Nz(dblNewValue, 0)) <= 0 dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height = dblNewValue End Property Public Function Volume() As Double If (p_Area.Area() > 0) And (Me.dblHeight > 0) Then Volume = p_Area.Area * Me.dblHeight Else MsgBox "Enter Valid Values for Length,Width and Height.",vbExclamation , "ClsVolume" End If End Function ‘ClsArea Class Property Procedures and Method are exposed here Public Property Get strDesc() As String strDesc = p_Area.strDesc End Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc = NewValue End Property Public Property Get dblLength() As Double dblLength = p_Area.dblLength End Property Public Property Let dblLength(ByVal NewValue As Double) p_Area.dblLength = NewValue End Property Public Property Get dblWidth() As Double dblWidth = p_Area.dblWidth End Property Public Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth = NewValue End Property Public Function Area() As Double Area = p_Area.Area() End Function
Sé lo que está pensando ahora:como "esto es un trabajo doble, sería bueno si podemos, de alguna manera, omitir estos pasos de repetir los procedimientos de propiedad ClsArea nuevamente en la clase ClsVolume". O digamos, podríamos haber agregado la propiedad dblWidth en el propio ClsArea y ejecutar los métodos Area() y Volume() desde allí, ¿verdad?
El punto aquí es cómo un objeto de clase base puede convertirse en parte del diseño de otro objeto de clase.
Recuerde, la idea general de diseñar un objeto de módulo de clase reutilizable es que los programas principales, que utilizan el objeto de clase, serán simples y las complejidades integradas en el objeto de clase permanecerán ocultas.
Sí, podemos hacerlo de más de una manera, también con un código compacto. Los exploraremos más adelante, pero por ahora, continuemos con nuestro plan original.
El programa principal que usa la clase ClsVolume.
Probemos nuestra nueva clase ClsVolume en el programa principal en el módulo estándar. El código de muestra se proporciona a continuación.
Public Sub TestVolume() Dim vol As ClsVolume Set vol = New ClsVolume vol.strDesc = "Warehouse" vol.dblLength = 25 vol.dblWidth = 30 vol.dblHeight = 10 Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With vol Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area(), .Volume() End With End Sub
¿Puedes ver lo simple que es el programa principal, sin las líneas de impresión?
Copie y pegue el código en un módulo estándar. Presione las teclas Ctrl+G para mostrar la ventana de depuración si aún no está abierta. Haga clic en algún lugar en el medio del Código y presione F5 Clave para ejecutar el Código. El resultado de muestra en la ventana de depuración se muestra a continuación.
Description Length Width Height Area Volume Warehouse 25 30 10 750 7500
Descripción Largo Ancho Alto Área Volumen
Almacén 25 30 10 750 7500
Pruebas de rendimiento de las comprobaciones de validación.
Ejecutaremos pruebas para ver que la verificación de validación del valor de entrada de la clase base ClsArea Class funciona cuando se le pasan valores a través de la clase ClsVolume. También hemos realizado algunas comprobaciones de validación en las funciones Area() y Volume().
Intentémoslos uno por uno:
Primero, pasaremos un valor negativo a la propiedad ClsArea.dblLength a través de la clase ClsVolume. Debería activar el mensaje de error y abrir la función Inputbox() dentro del ciclo Do While… para ingresar el valor correcto.
1. Reemplace el Valor 25, en la línea Vol.dblLength =25 , con –5 y presiona F5 Clave para ejecutar el Código.
La verificación de validación activará el error y solicitará un valor mayor que cero. Ingrese un valor mayor que 0. Luego restaure el valor 25 en la línea, reemplazando –5.
2. Deshabilite la línea Vol.dblHeight =10 insertando un símbolo de comentario (') al comienzo de la línea como se muestra:'Vol.dblHeight =10 . Después del cambio, presione la tecla F5 para ejecutar el Código.
Dado que no se pasa ningún valor de entrada a la propiedad, la función Vol.Volume() generará un error que indica que las tres propiedades:dblLength, dblWidth y dblHeight, deben tener valores para ejecutar la función de volumen.
Del mismo modo, también puede comprobar el rendimiento de la función Vol.Area().
Podemos crear una función de impresión de datos y pasar el objeto ClsVolume como parámetro a la función e imprimir los valores en la ventana de depuración.
El código modificado de los programas principales.
El código modificado para ambos programas se proporciona a continuación:
Public Sub TestVolume() Dim Vol As ClsVolume Set Vol = New ClsVolume Vol.strDesc = "Warehouse" Vol.dblLength = 25 Vol.dblWidth = 30 Vol.dblHeight = 10 Call CVolPrint(Vol) Set Vol = Nothing End Sub
Public Sub CVolPrint(volm As ClsVolume) Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With volm Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area, .Volume End With End Sub
La próxima semana construiremos el objeto de clase de volumen con menos código.
Los enlaces de todas las páginas 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
- Actualizar elemento del diccionario de objetos de clase en el formulario