Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Problema al eliminar elementos de un array

Estas en el tema de Problema al eliminar elementos de un array en el foro de Visual Basic clásico en Foros del Web. Amigos de FOROSDELWEB nesecito de su ayuda , tengo dos problemas al eliminar elementos de un array, este array esta asociado a un type y ...
  #1 (permalink)  
Antiguo 06/08/2008, 17:40
Avatar de hiper_xavier  
Fecha de Ingreso: mayo-2008
Mensajes: 7
Antigüedad: 16 años
Puntos: 0
Problema al eliminar elementos de un array

Amigos de FOROSDELWEB nesecito de su ayuda , tengo dos problemas al eliminar elementos de un array, este array esta asociado a un type y lo que nesecito es:

- eliminar todos los elementos de una vez, esto es cuando el usuario hace click en cancelar pero cuando hago click en el formulario deberia estar en blanco pero me muestra todos los elementos que mse ingresaron pero vacios , e intentado con CLEAR, ERASE, NOTHINF ="" pero igual me aparecen bacios, lko que quiero es que no me aparezcan

- eliminar elementos especificos de un array (en forma aleatoria), el mismo problema de arriba pero al eliminarlos despues aparecen los mismos elementos pero vacios, estos elementos los enlisto en un LISTVIEW, pro favor nesecito de su ayuda seria de mucha ayuda si me lo puidieran explicar por que no quiero por ningun motivo vivir copiar/pegar de internet cada vez que haga un programa, de antemano gracias
  #2 (permalink)  
Antiguo 07/08/2008, 07:46
Avatar de hiper_xavier  
Fecha de Ingreso: mayo-2008
Mensajes: 7
Antigüedad: 16 años
Puntos: 0
Exclamación Respuesta: Problema al eliminar elementos de un array

aca especifico mas lo que nesecito:

en un modulo declaro por poner un ejemplo el siguiente type


Código:
PUBLIC TYPE Typ_01 

   x as integer
   y as string
   z as string

END TYPE

Public Arr_01(500) as Typ_01

este arreglo Arr_01 lo ocupo para almacenar datos de un ListView los problemas que tengo son

1- ustedes saben que si el usuario no quiere ingresar los datos de un formulario presiona un boton cancelar y ya no se sabe mas de la informacion que contubo el formulario en los controles mientras el usuario trabajo con el, osea, al momento de que el usuario quiera trabajar con el formulario nuevamente y al llamar al arreglo Arr_01 para llenar el ListView todos los controles deverian estar formateados sin datos y listos para que el usuario empiece de cero pero aun asi al llamar formulario despues de haber puesto cancelar anteriormente, por poner un ejemplo el usuario ingreso 6 registros anteriormente y no los quizo guardar, al momento de trabajar nuevamente con el formulario aparecen los 6 elementos pero en blanco a pesar que al momento de cancelar el formulario e intentado poniendo Arr_01= nothing o erase Arr_01 o Arr_01.x=Nothing Arr_01.y=nothing, los borra pero los espaciosn en el arreglo quedan igual


2- al momento de borrar elementos aleatoriamente dentro del formulario si es que el usuario quiere borrar elementos del Listview borra el contenido del registro pero al llamar nuevamente al Listview aparecen nlos mismos elementos que estaban anteriormente pero en blanco


lo que euiqro yo es eliminar estos registro pero que no se vean despues de borrarlos, al borrarlos aleatoriamente los borra pero quedan los espacios en blanco en el arreglo, a pesar que al borrar con un

Código:
'Arr_02 es un arreglo que contiene los elementos seleccionados del ListView que seran borrados, lleno este arreglo con los elementos a borrar antes de 

'recorro el arreglo en forma inversa para no dañar la integridad de los datos a borrar, el campo clave para borrar los registros es Arr_01.x

For i = Ubound(Arr_02) to  Lbount(Arr_02) STEP -1
   
        For x = Lbound(Arr_01) to Ubond(Arr_01)
     
                    IF Arr_01(x).x = Arr_02(i) then
                                 Arr_01(x).x =Arr_01(x+1).x
                                 Arr_01(x).y =Arr_01(x+1).y
                                 Arr_01(x).z =Arr_01(x+1).z
                   END IF
        
       NEXT X

NEXT i
         
Arr_01
Este es un ejemplo del codigo que ocupo para borrar elementos en forma aleatoria de el array

Les agradezco de antemano si me pueden ayudar en este predicamento de antemano Muchas Gracias

Última edición por hiper_xavier; 07/08/2008 a las 07:54
  #3 (permalink)  
Antiguo 07/08/2008, 10:50
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 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
  #4 (permalink)  
Antiguo 07/08/2008, 12:11
Avatar de hiper_xavier  
Fecha de Ingreso: mayo-2008
Mensajes: 7
Antigüedad: 16 años
Puntos: 0
De acuerdo Respuesta: Problema al eliminar elementos de un array

Muchas gracias Txoco, la solucion estaba en la definicion del array, sin querer contestaste otra interrogante que tenia, lo que pasa es que al borrar elementos de un array en forma aleatoria corres los elementos que estan siguentes arr(x)=arr(x+1) pero los que se corrieron quedan al final duplicado, entonces si borro 3 elementos debo guardarla cantidad "3" en una variable INTEGER y luego al borrar los ultimos elementos queda de esta forma

Código:
 Redim Preserve <array>(Ubound(<array>) - Cant_Elem_Borrados)


gracias por tu ayuda, esta super clara
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:37.