Recorrer lista y mostrar datos de a ciertas cantidades fijas

Iniciado por RiasChan, 16 Octubre 2020, 02:12 AM

0 Miembros y 1 Visitante están viendo este tema.

RiasChan

El problema que tengo es asi.

En una lista ya  tengo cargados datos (40 datos cargados en la lista por ejemplo, siempre en el mismo orden)

Y tengo 6 labels.

Lo que necesito es que al apretar un botón  me cargue en esos 6 labels los primeros 6 items de la lista y deje de recorrer la lista. Luego al apretar de nuevo, saque la info de los 6 labels y ponga lo que está en la lista del 7mo al 12 (o sea los otros 6), y así hasta terminar la lista. Cuando termina la lista, empieza de nuevo. Si encuentra algo en blanco pone un 0 en el label

En fin, que la recorra de 6, pare. Muestre. Muetre de 6. Pare, Muestre y así. cada vez que para es por que llegó a 6. Y cuando continúa es por que se le dio click de nuevo al botón.

Gracias.


Serapis

Cuál es la dificultad o dónde te pierdes?.
...y qué tienes hecho hasta el momento?.

RiasChan

aquí no se como seguir



Private Sub Form_Load()
Recorrido = 2
sumador = 0
List1.AddItem 23
List1.AddItem 56
List1.AddItem 19
List1.AddItem 3
List1.AddItem 4
List1.AddItem 5
List1.AddItem 6
List1.AddItem 9777
List1.ListIndex = 0
End Sub



Private Sub Command1_Click()
Dim j 'igualidad que mostrara el index
Dim i 'recorrido
j = 0
j = List1.ListIndex

For i = 0 To List1.ListCount - 1
If i = j Then
MsgBox List1.List(i)
j = j + 1
sumador = sumador + 1
End If

If sumador = 3 Then
sumador = sumador + 3

Exit For
End If
Next


End Sub


digamos sólo funciona hasta el corte de los primeros 3 pasajes de lal lista a otro objeto (una caja de texto en este caso en vez del label). Luego me pierdo. Ya no deberia empezar de 23 de nuevo, sino desde el 3,y  terminar en el 5.

Serapis

#3
Demos por hecho que tienes cargada la lista con 40 elementos...

Lo siguiente, es acomodar los controles label o textbox, a un array de controles.
Esto se hace creando un control (depositando con el ratón una instancia en la ventana de la interfaz), y luego seleccionarlo, copiarlo y pegarlo,... Preguntará si quieres crear un array de controles, le dices que sí y pegas tantas copias como necesites... Supongamos pues que son 6, y sean labels o textbox, para el ejemplo no importa.

Label1(0) hasta Label1(5).
Fíjate que en vb6, será un array de controles si tienen exactamente el mismo nombre (y están en la misma ventana) ... El índice habitualmente irá desde 0 hasta, 1 menos del total, esto es, si hay 6, hasta el label1(5). En realidad es una diccionario, no es un array, lo que se descubre fácilmente en 2 detalles... 1° es posible asignar un índice como 582 al label(5) durante diseño, y 2° porque dinámicamente se cargan con la instrucción Load y descargan con Unload, y no con redim y erase respectivamente...

El botón, es mejor que llame a una función que será la que hará el trabajo y a la que podremos crear y pasar los parámetros que nos interesen. Como método del botón, el evento click, ya tiene su propios parámetros, lo que da menos juego y lo deja más sucio...

Sabes lo que quieres hacer, te falta aprender a crear los conceptos para transformar luego en código... Analicemos :

- tenemos un listbox, ergo una lista... Aquí aparece una variable (que usaremos como tal)
- tenemos que la lista tiene 3 detalles de interés al caso: La cantidad que contiene, el índice para referirnos a un elemento y su valor... De aquí salen 2 variables (el valor se constata del objeto (ya lo auto contirnr la lista): índice y cantidad en la lista.
- tenemos finalmente una cantidad a copiar con cada llamada, que es exactamente la cantidad de labels... De aquí sale la última variable necesaria.

Ahora, pasemos a la lógica del programa:
1 Hay una lista con 'x' elementos.
2 Hay 'y' labels.
3 Hay un botón, que cuando se pulsa transfiere los siguientes 'y' elementos de la lista a los labels.
La lógica declara que necesitamos 'recordar', por donde vamos, para poder continuar en otra ocasión, justo por el punto en que quedamos.
Hay un detalle necesario, pero que se queda en la ambigüedad, por que no le has dado solución... Y es, qué pasa cuando se llega al final de la lista... Lo dejaré sin terminar (pero dejo esta nota de recordatorio) , queda a tu esfuerzo concretar el caso y aplicar la solución. >:D :laugh: :silbar:

Código (vb) [Seleccionar]

Din Index as integer ' recuerda dónde nos quedamos. De entrada vale 0.

Private sub command1_click()
   Call TransferirSiguienteGrupo(index, 6) ' 6 es la cantidad a transferir...
End sub

Private sub TransferirSiguienteGrupo(byref Indice as integer, byval Items as integer)
   Din k as integer, j as integer

   For k=indice to indice +Items-1
       Label1(j).caption = listbox1.list(k)
       J =(j+1)
   Next

   Indice=(indice+items)
End sub


...y eso es casi todo... Cuando lo pruebes funcionará, hasta llegar al final de la lista que dará error, pues falta por definir, qué sucede en tal situación y que dejo a tu esfuerzo el resolverlo, porque si no, te estaría haciendo la tarea completa...

RiasChan

#4
Primero gracias, me has ayudado mucho.

Pero segundo, no es una tarea ya no voy a la escuela hace rato, es un proyecto personal que ya tengo listo y andando, esto es parte de un recordset de access, traigo muchos datos desde el recordset, y la forma mas facil que tengo para trabajarlo es trayendo todos los códigos a un list box, y desde ahi deribo todo. El tema es que la primera vez que tengo que hacerlo de "a partes" por que en esos primeras 6 partes, pasan cosas muy "grandes" a nivel GUI y no puedo meter todo junto, y con cada click va cargando nuevas entradas.

Una vez q ya puse los 6 codigos donde deben ir, el resto ya se hace solo.

Pero de veras es lo que buscaba.

Tercero: ya lo tomo como desafio ver como termina. ME seria excesivamente fácil si ya hubiera trabajado con matrices, pero nunca las uso, uso otros metodos. Es la primera vez que realmente me es indispensable usar una matriz de esta forma (con ciclos simples me ha alcanzado siempre)


En fin, creí que seria algo que cuando la matriz estaba en "" es reasignar los valores predeterminados a las 3 variables, pero va mas alla de eso. Seguro mañana con tiempo lo saco. Mil gracias me fue de ayuda eterna.

EDIT: Esto va dsp del NExt:

If List1.List(k) = "" Then
k = 3
Index = 0
Items = 0
j = 0
End If

Gracias me salvaste la idea de actualizacion para mi soft

Serapis

CitarIf List1.List(k) = "" Then
k = 3
Index = 0
Items = 0
j = 0
End If
Bien, pero dos detalles...
- Te vale así, solo si la cantidad en lista es múltiplo de 'items'...
- No compares una cadena con una vacía... es más eficiente comparar si su tamaño es 0:
Código ( vb) [Seleccionar]

If len(list1.list(k)=0 then  ' esto es más eficiente...

RiasChan

Hola. perdon que colgue. Lo puse como dijiste pero comparado con el mio va igual, asi que regla basica 1 de la informatica "anda, no lo toques por que se rompe" jaja. O sae anda igual con numeros no multiplos que con multplos, lo ire viendo sobre la marcha. Esas matrices solamente traen el código, codigo que hace referencia a todo un recordset y en base a eso muestra info, incluso fotos.

Saludos y gracias, eso era sólo para una interfaz visual, que me esta enloquesiendo por las modificaciones, pero creo que quedará lindo.

Serapis

Olvidé decirte que, en CommonControls 6.0 (creo recordar), hay un control especializado llamado 'DataList', donde puedes rellenar ciertas propiedades del control para enlazarlo a una base de datos y que en función de lo que estés haciendo podría ahorrarte código y complicaciones innecesarias... Igualmente contiene un control 'DataCombo'... También te convendría explorar el CommonControls 5.0, que creo recordar que incluye algún otro control más...