Ver Mensaje Individual
  #3 (permalink)  
Antiguo 07/08/2008, 10:50
Avatar de Txoco
Txoco
 
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 16 años, 10 meses
Puntos: 7
Respuesta: Problema al eliminar elementos de un array

Hola!

Estás definiendo un array estático, es decir, que no puede variar el número de elementos que contiene, y por ende, no se puede borrar de la manera que pretendes.

La solución sería crear un array dinámico, aunque borrar cualquier elemento que no sea el último requiere algo de código extra.

Puedes plantearte el utilizar colecciones, aunque sólo puedes coleccionar entidades (objetos definidos mediante módulos de clase, por ejemplo), lo cual tal vez sea un poco excesivo dependiendo del caso.

Para trabajar con arrays dinámicos, define el array sin límites:

Código:
Public Arr_01() as Typ_01
Antes de poder utilizarlo, debes inicializarlo con al menos un elemento, porque de lo contrario te producirá un error (interceptable) avisando de que te estás saliendo de los límites del array:

Código:
Redim Arr_01(0)
Con esta línea, tendrás un array de un único elemento.

OJO! para agregar elementos a un array, debes utilizar la palabra reservada Preserve, porque de lo contrario, te borrará todo el contenido del array:

Código:
    Redim Arr_01(2)
    Arr_01(0).x = 100
    Arr_01(1).x = 200
    Arr_01(2).x = 300

    Debug.Print Arr_01(1).x  ' Imprimirá "200"

    Redim Arr_01(3)  ' Se supone que queremos añadir un elemento
    Arr_01(3).x = 400
    Debug.Print Arr_01(1).x  ' Oops! No imprime nada!
Si sustituyes el segundo Redim por "Redim Preserve Arr_01(3)" y lo vuelves a ejecutar, verás que el segundo Debug.Print sí devuelve el valor esperado.

Juntando todo esto, puedes agregar elementos de uno en uno a un array ya inicializado con:

Código:
    Redim Preserve <array>(Ubound(<array>) + 1)
Y para borrar el último elemento, hazlo de igual forma, pero restando.

Si quieres quitar un elemento cualquiera que no sea el último... no hay otra solución que recorrer todos los elementos a partir del que quieras borrar, copiando el contenido en el anterior, y borrar el último del array. Sólo se puede hacer manualmente, ya que los elementos de un array se guardan contiguos en memoria.

Para eliminar totalmente el array, ya te funcionaría Erase(<array>). Ten cuidado cuando la utilices porque a partir de entonces te volverá a dar errores de límites si utilizas ese array sin volver a iniciarlo.

Y te recomendaría, al cerrar el programa, ejecutar un Erase para cada array dinamico definido, para liberar correctamente la memoria.
__________________
wile sona li mute e sona