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

Matrices de objetos de clase Ms-Access VBA

Introducción.

La semana pasada tuvimos una breve introducción de un objeto de clase personalizado simple con solo dos Propiedades, para Longitud y Ancho Valores. Un método para calcular el área de cualquier cosa, con valores de longitud y anchura. Espero que haya entendido los conceptos básicos de un módulo de clase personalizado de Ms-Access. Si no, aquí está el enlace:Ms-Access Class Module y VBA. Visite la página antes de continuar.

Class Module Objects ahorra mucho código en sus programas. Cuando encuentre algo que hace repetidamente en el código, piense en un objeto de módulo de clase. El código repetitivo también se puede convertir en una función de utilidad, pero para los objetos de clase, debe adoptar un enfoque diferente.

Para una tarea simple, es posible que se necesite más código para refinar las funciones del objeto del módulo de clase, pero los programas de su módulo principal serán simples y todo el código complicado desarrollado y refinado permanecerá oculto para los demás.

Pero por ahora, tenemos un módulo de clase simple en la mano. Intentaremos crear una matriz de objetos para calcular el área de muchos elementos.

La subrutina ClassArray().

El código VBA de muestra en el módulo estándar crea una matriz de cinco objetos de la clase ClsArea e imprime sus valores de propiedad y el resultado del método en la ventana de depuración. Copie y Pegue (o mejor si los escribe, para saber mejor cada línea lo que hacen) el siguiente código en un Módulo Estándar:

Public Sub ClassArray()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String
Dim L As Long, U As Long

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea

tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
Set tmpA = Nothing 'Remove temporary object from memory.
Next


‘PRINTING SECTION
'Print the Array contents into the Debug Window
L = LBound(CA)
U = UBound(CA)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With CA(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

’stop

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub
 

Haga clic en algún lugar en medio del Código y presione F5 para ejecutar el Código. Ingrese los valores para la descripción, la longitud y el ancho desde el teclado para 5 elementos diferentes, uno tras otro.

La ejecución de muestra del programa se proporciona a continuación:

Description   Length        Width         Area
Door Mat       5             8             40 
Carpet         12            23            276 
Bed Room       21            23            483 
Store Room     15            25            375 
Terrace        40            50            2000 

Revisión del código línea por línea.

Examinemos el código línea por línea. En el área de declaración, hemos declarado una variable de objeto tmpA de tipo ClsArea. En la segunda línea declaró un Array vacío CA() de tipo ClsArea. El número requerido de elementos se redimensionará más adelante en el programa.

En las próximas dos líneas, hemos declarado variables título de tipo String y j, L, y U variables de tipo entero largo.

A continuación, la variable de título se inicializa con la cadena 'ClassArray' y se utilizará como título en la función InputBox(). El Para….Siguiente el bucle se establece con una variable de control j para ejecutar el bucle cinco veces. Después de las siguientes dos líneas de comentarios, el Establecer instrucción instancias (asigna memoria) Objeto de clase ClsArea en memoria con el nombre tmpA .

Las siguientes tres líneas de código sirven para ingresar valores para strDesc , longituddbl, y dblAncho Propiedades del objeto de clase tmpA.

Después de la siguiente línea de comentario, el objeto de clase ClsArea (CA) se redimensiona para 1 a j veces (1 a 1 vez) conservando los elementos Object existentes, si los hay (este es el primer Objeto en el Array). Esto seguirá aumentando, a través de ReDim instrucción, a 1 a 2, 1 a 3, 1 a 4 y 1 a 5 conservando los valores de objeto anteriores, dentro de For . . . Siguiente bucle. La reserva La palabra clave garantiza que los objetos de matriz existentes no se pierdan.

Nota: La declaración Re-Dimension aumenta/disminuye la cantidad de elementos de objeto especificados pero borra los objetos existentes cargados en la matriz anteriormente, sin Preservar palabra clave.

El conjunto La declaración en la siguiente línea copia el Objeto tmpA, con sus datos en el CA(j) ClsArea Objeto recién creado j elemento de matriz

Siguiente línea Establecer tmpA =Nada elimina el objeto temporal de la memoria.

El bucle For...Next repite esta acción cuatro veces más para ingresar otros elementos en el objeto temporal recién instanciado tmpA, uno tras otro, y copia el objeto en CA Object Array.

Las siguientes dos líneas, después de la línea de comentarios, buscan el rango de índice de Object Array (busca los números de índice más bajo y más alto.

El próximo Debug.Print La declaración imprime una línea de título en 14 zonas de columna en la ventana de depuración. El Para . . . Siguiente bucle con la L y U Los rangos de números de índice de matriz enlazada ejecutan las declaraciones internas para acceder a cada objeto de la matriz CA, con número de índice en la variable de control j.

La referencia de objeto actual se establece dentro de Con. . . Terminar con estructura, en lugar de repetir el nombre del objeto CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth y CA(j).Área para imprimir los valores de propiedad del objeto y los resultados del área de método() en la ventana de depuración.

Quitar el símbolo de comentario de 'Detener declaración para crear una pausa en el programa en la declaración de parada. Ejecute el código nuevamente e ingrese los detalles de 5 elementos para que pueda experimentar con el objeto de matriz. Puede abordar de forma selectiva cualquiera de las propiedades del objeto, con el número de índice de matriz, para editar o imprimir cualquier valor en la ventana de depuración, como se muestra a continuación.


La sentencia Establecer CA(j) =Nada dentro del Para. . . Next Loop borra los objetos de la matriz, uno por uno de la memoria.

Pasar matriz de objetos de clase como parámetro de función.

Podemos pasar la matriz de objetos de clase como un parámetro a un programa, como hicimos con el tipo de datos definido por el usuario.

Vamos a crear una subrutina de impresión simple, cortando el código de la sección de impresión del programa principal y colocándolo en el nuevo programa.

Copie el código de la subrutina ClassArray(), péguelo en el mismo módulo estándar y cambie el nombre a ClassArray2(), como se muestra a continuación.

Public Sub ClassArray2()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String
Dim L As Long, U As Long

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea

     tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
 Set tmpA = Nothing 'Remove temporary object from memory.
Next

‘PRINTING SECTION
'Print the Array contents into the Debug Window
L = LBound(CA)
U = UBound(CA)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With CA(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

’stop

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub
 

El código ClassArray2 sin la sección de impresión.

Cree una nueva subrutina como se indica a continuación:

Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
Dim L As Long, U As Long
Dim j As Long

End Sub

Resalte la sección de impresión hasta la instrucción 'Detener en el programa ClassArray2(), corte el área resaltada del código y péguela debajo de Dim declaraciones en ClassPrint() Programa. La versión modificada de ambos Códigos se proporciona a continuación:

Public Sub ClassArray2()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea
     tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
 Set tmpA = Nothing 'Remove temporary object from memory.
Next

Call ClassPrint(CA) ‘Pass the Object Array to print routine

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub

El programa ClassPrint().

Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
Dim L As Long, U As Long
Dim j As Long

'Printing Section
'Print the Array Contents into the Debug Window.
L = LBound(clsPrint)
U = UBound(clsPrint)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With clsPrint(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

End Sub

Verifique los cambios de código en ambos programas y haga las correcciones, según corresponda. Haga clic en el medio del código ClassArray2() y presione F5 para ejecutar el programa.

La declaración de llamada en el primer programa pasa la matriz de objetos de clase CA como parámetro ByRef a la subrutina ClassPrint(). El programa imprime las propiedades del objeto y llama a la función Area() para calcular y devolver el valor a imprimir.

La próxima semana aprenderemos a usar nuestro módulo de clase ClsArea como clase base para crear un nuevo objeto de clase VBA para calcular el volumen de algo.

  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. Actualizar elemento del diccionario de objetos de clase en el formulario