Fichas de Referencia LO Basic
Ficha nº 3.
Tipos Estructurados
Nivel: Intermedio
|
Esta ficha de referencia está bajo licencia de CreativeCommons BY-SA v3 (fr) o posterior.: https://creativecommons.org/licenses/by-sa/3.0/fr/ |
|
Este documento es una adaptación del documento original, en Francés, que se puede obtener en la Wiki de publicaciones de LibreOffice.
|
Versión |
Fecha |
Comentarios |
|
2.0 |
06/04/2021 |
Mise à jour de la mise en forme ; actualisations |
|
2.0_ES |
15/09/2026 |
Traducción, cambio de formato para esta versión |
Somos como enanos a hombros de gigantes. Si alcanzamos a ver más cosas y más lejanas que ellos, no es por la perspicacia de nuestra visión, ni por nuestra grandeza, sino porque son ellos quienes nos elevan. (atribuido a Bernard de Chartres )
Agrupación de elementos similares, aplicando un índice interno (Long).
Dimensiones
Una matriz puede contener varias dimensiones (max: 60).
Declaración
La base predet. del índice es 0 (cero) Modificable por Option Base 1 (poco usado).
En la tabla siguiente: el índice se expresa como ix.
|
Matrices estáticas |
Características predefinidas |
|
Una dimension («vector») |
|
|
Dim T(ixMin To ixMax) As UnTipo |
Dim T(1 To 12) As UnTipo 1 dimensión, 12 elementos, (ix = 1) |
|
Dim T(ixMax) As UnTipo |
Dim T(9): 1 dimensión, 10 elementos, (íx = 0) (se empieza a contar desde cero) |
|
Varias dimensiones |
|
|
Dim T(ixMin1 To ixMax1, ixMin2 To ixMax2) As UnTipo |
Varias dimensiones (en el ejemplo 2). Dim T(1 To 12, 1 To 31) As Integer 2 dimensiones, 12 y 31 elementos (ix = 1) |
|
Dim T(ixMax1, ixMax2, … ) As UnTipo |
Dim T(2,4) As String: 2 dimensiones. 3 elementos para la 1ª, 5 para la 2ª.(ix = 0) |
|
Matrices dinámicas |
Las dimensiones se definen durante ejecución. |
|
Dim Array1() As UnTipo Dim Array1 As Variant |
Matriz de dimensiones desconocidas. Después será necesario usar ReDim |
Declarada de tipo Variant, una matriz puede contener elementos de distintos tipos.
Matrices anidadas (Nested arrays/Jagged matrices)
O matrices de matrices. Ej: usadas para acceder a los intervalos de datos en Calc.
Una matriz externa (de variants) tiene por elementos matrices de datos:
Dim T As Variant
Anidada = Array(Array(1, 2, 3), Array(10, 20, 30), Array(7, 8, 9))
Anidada(0)(0) vale 1; - Anidada(2)(2) vale 9, etc.
Acceso a un elemento de la matriz
Por índice :
|
Dim Matriz(9) As Integer Matriz(5) = 123 '(modifica el 5º elem). |
Dim Matriz(11, 31) As Integer Matriz(5, 28) = 123 |
Funciones e instrucciones relativas a la matriz
Option Base 1 :Instrucción al inicio de módulo (sólo se aplica donde se declara). Fuerza a los índices de las matrices a empezar por 1 en lugar de 0.
IsArray(): devuelve True si la variable es de tipo matriz (array).
OK = IsArray(Matriz) (OK obtiene el valor true)
Array(): devuelve la matriz creada con valores variados
Matriz = Array("Uno", 2, Now()) (matriz de variants)
Redim: (instrucción) Redimensiona una matriz
Redim Matriz(dimension) – Con pérdida de datos
Redim Preserve Matriz(dimension) – Sin pérdida de datos
Erase: (Instrucción) Borra el contenido de la matriz
Erase Matriz : si la matriz es dinámica la libera de la memoria.
Lbound(): devuelve el límite inferior si no se indica es el índice de la primera dimensión o indicando la dimensión:
LBound(Matriz, 2)
Ubound(): devuelve el límite superior (igual que en el caso anterior).
No tiene dimensiones definidas si UBound(Matriz)=-1 y LBound(Matriz)=0
Split(): crea una matriz (de una dimensión) cortando una cadena de texto mediante un delimitador.
T = Split("C:/file.txt", "/") -► T(0)="C:" y T(1)="file.txt"
Join(): fusiona los elementos de una matriz (de una dimensión) para obtener una cadena.
Join(T, "|") -► "C:|file.txt" (aquí se usa el delimitador |)
Verificación de una matriz
Una variable «Matriz» sólo se procesa si pasa las siguientes (3) comprobaciones:
¿Existe la variable? – Not IsNull(Matriz)
¿Es una matriz? – IsArray(Matriz)
¿Están definidas sus dimensiones? – UBound(Matriz) >= LBound(Matriz)
Recorrer una matriz de una dimensión (vector)
Por sus índices
Dim Matriz(9) As Integer, i As Long
For i = LBound(Matriz) To Ubound(Matriz)
Print Matriz(i)
Next i
Por sus elementos
Dim Element As 'tipo compatible con todos los elementos
For Each Elemento In Matriz
Print Elemento
Next
Recorrer una matriz de dos dimensiones
Dim Matriz(2, 4) '3 filas, 5 columnas
Dim i As Long, j As Long
For i = LBound(Matriz) To Ubound(Matriz)
For j = Lbound(Matriz, 2) To UBound(Matriz, 2)
Print Matriz(i, j)
Next j
Next i
Ordenación de los elementos de matrices
No existe un método predefinido, (busque «QuickSort» o «Bubblesort» en la web).
Duplicar matrices
Método General
Un bucle (For … Next) que copie los valores entre 2 matrices (el proceso puede ser muy largo)
Truco
Por asignación y después usando ReDim Preserve:
Matriz2 = Matriz1 'Dos matrices -> mismos valores
ReDim Preserve Matriz2(Tamaño) '-> 2 matrices distintas
Se aplica sólo a matrices de valores simples (no objeto).
Usar una matriz en subrutinas
Como parámetro de una subrutina
Sub con parámetro matriz)
Sub UsarArray(ByRef Matriz() As String
Llamada a la subrutina
Dim Matriz(9) As String
UsarArray(Matriz)
Como resultado de una función
Función con resultado matriz
Function ObtenArray() As Integer()
ObtenArray = MatrizDeEnteros()'Después de crear la «MatrizDeEnteros»
End function
Llamada a la función desde una sub
Dim Matriz As Integer
Matriz = ObtenArray()
Tablas e intervalos de libros de cálculo
(Vea la Ficha 4. Calc)
Permiten añadir varios valores (miembros) en un tipo de valor único.
Simplifican la manipulación de datos, paso de parámetros o resultado de función.
Tipo de miembros: sin definir o personalizado (excepto matriz).
Declaración de tipo
Type MiTipoPerso
UnMiembro As TipoSimple
OtroMiembro As OtroTipoSimple
End Type
' -----------------
Type Suceso
Nombre As String
FechaHora As Date
End Type
Declaración de una variable de un tipo personalizado
Dim UnaVar As MiTipoPerso
Limitacion: un tipo personalizado sólo es visible en el módulo en que se declara. La declaración As MiTipo por tanto sólo es posible en el seno del mismo módulo donde se ha declarado el tipo MiTipo. Vea Función de «fábrica» (Factory) / Accesor (accessor).
Uso
Asignación: VarPerso.UnMiembro = UnValor
Lectura: UnaVar = VarPerso.OtroMiembro
La palabra clave With – Permite agrupar las referencias a los elementos.
With VarPerso
.UnMiembro = UnValor 'Observe la presencia del punto.
End With
Estructura que permite el acceso rápido a los datos al indexarlos. Una colección se manipula como un tipo Object. Los elementos almacenados pueden ser de cualquier tipo, incluido Object.
La clave de índice es de tipo String. En una colección cada clave es única.
Declarar una colección
Añadir un elemento
Acceso posterior por clave o por índice.
La clave no es sensible a mayúsculas.
Es posible precisar la ubicación del elemento añadido mediante Before/After: oColl.Add(Elt, "Clave", After:="Clave0")
Acceso posterior sólo por índice.
Accceder a un elemento
Por su clave: Valor = oColl("Clave")
Por su índice: Valor = oColl.Item(Index)
Remplazar un elemento
Eliminar y después Añadir
Eliminar un elemento
Por su clave: oColl.Remove("Clave")
Por su índice: oColl.Remove(Index)
Eliminar todos los elementos
Número de elementos
Verificación de la existencia de un elemento
Intento de acceso y tratamiento del error eventual (la función siguiente devuelve true o false)
Function ExistsItem(ByRef pColl As Object, pKey As String) As Boolean
Dim Item As Variant, Exists As Boolean
On Local Error Goto ErrHandler
Exists = False
Item = pColl(pKey) 'si pKey no existe -> ErrHandler:
Exists = True
ErrHandler:
'do nothing
ExistsItem = Exists
End Function
Recorrer una colección
Puede obtener los elementos de una colección recorriéndola.
No hay posibilidad de listar las claves.
Por índices
For i = 1 To oColl.Count
Valor = oColl.Item(i) 'acceso al dato
Next i
Por acceso directo a los elementos
Dim Element As 'tipo compatible con los elementos de la colección.
For Each Element In oColl
'Hacer algo con el elemento(dato)
Next
Embrión de programación orientada a objetos (POO) (OOP en inglés).
Limites: No tiene herencia (utilice la delegación), No tiene polimorfismo
Una clase LibreOffice Basic podría entenderse como un tipo personalizado mejorado, al que se añade un comportamiento (funciones o subrutinas).
Vocabulario
|
Módulo de clase |
Módulo de código destinado a contener las declaraciones de la clase |
|
Clase |
Tipo que permite crear (instanciar) variables objeto. |
|
Sucesos |
Métodos para interceptar la creación y destrucción del objeto. |
|
Miembro |
Variable interna de una clase. |
|
Propiedad |
Refleja el estado del objeto. |
|
Método |
Realiza una acción con el objeto. |
|
Instancia |
Objeto creado a partir de un tipo clase. |
Especificar una clase
Las especificaciones de una clase (miembros, propiedades, métodos) se hacen en el interior de un módulo de código dedicado. En LibreOffice Basic, este módulo no se distingue de un módulo estándar más que por sus opciones iniciales.
Consejo adopte una convención de nombres para los módulos de clase.
Opciones iniciales
Al principio del modulo de clase indique las opciones:
Option Explicit 'como habitualmente
Option Compatible
Option ClassModule
Variables miembros
Son internas, por tanto declaradas Private.
Los miembros de una clase sólo deben llamarse a través de propiedades creadas para este propósito nunca diréctamente a través de la instancia,.
Private mNombre As String
Private mSheet As Object
Sucesos (Events)
Son dos subrutinas internas por tanto, declaradas Private.
Constructor: Private Sub Class_Initialize() Para iniciar el objeto durante su creación.
Destructor: Private Sub Class_Terminate() Para purgar sus componentes internos durante su destrucción.
Fallo de seguridad. Se recomienda encarecidamente no incluir este destructor en sus clases: debido a un error de implementación en VisualBasic, Class_Terminate () constituye una vulnerabilidad de seguridad y, como tal, es rechazado por los antivirus (consulte el certificado CVE-2018-8174).
Limitación: no es posible pasar parámetros a estas subrutinas.
Propiedades (Properties)
Propiedad = estado del objeto. Son visibles desde el exterior, por tanto declarados Public.
De lectura (Get)
(todo tipo de datos, incluidos objetos)
Public Property Get Name() As String
Name = mName
End Property
De escritura (Let)
(todo tipo de datos excepto objetos)
Public Property Let Name(ByRef pName As String)
mName = pName
End Property
De escritura (Set)
(sólo objetos)
Public Property Set Sheet(ByRef pSheet As Object)
Set mSheet = pSheet
End Property
Es posible abandonar prematuarmente una propiedad mediante Exit Property
Una clase puede contener propiedades de lectura y escritura: Escriba sucesivamente las dos propiedades Get y Let/Set si es necesario.
Las propiedades pueden acceder a los miembros, propiedades y métodos de la clase.
Métodos (Methods)
Método = action sobre/de el objeto.
Sub y Function propias de la clase, internas (Private) o visibles (Public). Se escriben como Sub o Function estándar precedidas de la palabra clave Public o Private. Estas tienen acceso a los miembros y propiedades de la clase.
Declarar/crear un objeto
Instanciación inmediata
Instanciación diferida (1ª llamada)
El constructor de la clase se llama en el momento de la instanciación del objeto.
No se puede declarar un objeto As New MiClase fuera de la bibliloteca en la que el módulo clase existe. Por lo general deberá declarar el objeto As Object.
Limitación: Una clase no es visible fuera de la biblioteca en la que se declara.
Vea: Función de «fábrica» (Factory) / Accesor (accessor).
Acceder a las propiedades y métodos de un objeto
Sintaxis de acceso a los elementos de un objeto:
objeto.propiedad u objeto.metodo
Como para los tipos personalizados, puede utilizar la sintaxis With..End With
Liberar un objeto
Cuando un objeto no sea ya necesario, puede destruirlo: Set oObjet = Nothing
En ese momento se hace una llamada al destructor de la clase
Esta instrucción no es totalmente necesaria en Sub o Function, puesto que sus variables internas se destruyen a la salida. Sin embargo, la destrucción efectiva de la variable no está bajo su control.
La instrucción Set oObjet = Nothing:
– muestra claramente la intención.
– asegura el control del momento de destrucción del objeto.
Cuestión de visibilidad de tipos y clases personalizados
Un tipo personalizado sólo es visible en el módulo donde se ha declarado.
Una clase sólo es visible en la biblioteca donde se ha declarado
Para solucionar este problema, cree una función «fábrica» (o accesor) para crear las variables. A esta función se la podrá llamar desde cualquier módulo o biblioteca.
|
|
Uso |
Visibilidad |
Fábrica creada en |
Declarado |
|
Tipo personal. |
As MiTipo |
Mismo módulo |
Mismo módulo |
As Variant |
|
Clase |
As MiClase |
Misma biblioteca |
Misma biblioteca, otro módulo |
As Object |
Creación de la función «fábrica» / accesor
La función fábrica puede también utilizarse para inicializar la variable.
Tipos personalizados
Function CreateMiTipoPerso() As MiTipoPerso
Dim oVar As MiTipoPerso
CreateMiTipoPerso = oVar
End Function
Clases
Function CreateMiClase() As MiClase
Dim oVar As New MiClase
CreateMiClase = oVar
End Function
Uso de la función «fábrica» / accesor
Tipos personalizados
Dim MiVar As Variant
MiVar = CreateMiTypoPerso()
Clases
Dim MiVar As Object
MiVar = CreateMiClase()