Ver Mensaje Individual
  #27  
Antiguo 28-05-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Reputación: 27
Delphius Va camino a la fama
Bueno, con respecto a buscar los martinez y mostrarlos te he propuesto una solución. ¿Porqué no la traduces a código? Sería un buen ejercicio para ti.

Con respecto al tema de porque borra el contenido del TListBox es simplemente porque al principio de todo invocas al método Clear.

No debes llamar al método Clear. Sino que debes realizar el paso inverso al algoritmo que te he pasado:
Analizemos la situación:
Antes ibamos saltando por los items de 4 en 4 y volcando la información. De este modo de cumplía lo siguiente.
Si buscamos por el apellido,
El DNI siempre está en la posición i - 2.
El Nombre siempre está en la posición i - 1
El Apellido siempre está en la posición i
La Ciudad siempre está en la posición i + 1

Por tanto, lo que hacíamos era agregar estos datos en el StringGrid del siguiente modo:
Celda[1,j] = La info de i - 2
Celda[2,j] = la info de i - 1
Celda[3,j] = la info de i
Celda[4,j] = la info de i + 1

A la inversa tenemos:

La info de i - 2 = Celda[1,y]
La info de i - 1 = Celda[2,y]
La info de i = Celda[3,y]
La info de i + 1 = Celda[4,y]

¿Se entiende? No debes hacer Clear, sino sustituir un dado de una celda por el de la posición en un índice:
Código Delphi [-]
ListBox1.Items[i] := StringGrid1.Cells[x,y];

¿Porque y? y no i?
El problema es que cuando agregamos desde el ListBox hacia el StringGrid perdemos referencia a la posición i-esima del campo Apellido de dicha persona. Lo más fácil es, que al agregar la información al StringGrid guardemos dicha posición para asi poder hacer el paso inverso. Tal vez, algo como esto:

Indice - DNI - Nombre - Apellido - Ciudad
De modo que en [1,j] tenemos la posición i-ésima del campo Apellido de los datos de la persona j-esima en el StringGrid.
En [2,j] su DNI.
En [3,j] su Nombre.
Y así sucesivamente.

¿Que significa ese j?
Pues la fila. De modo que si j es 1, nos referimos la persona que ocupa la fila 1 en el StringGrid. Ojo: no confundir a ese j con la posición i en el ListBox.
Cuando j vale 2, nos estamos refiriendo a la persona que ocupa la fila 2.

Por ejemplo, si en [1,1] tenemos el valor 6 quiere decir que en el ListBox, la información del apellido para dicha perona está en 6. Hacemos que i sea 6.
Por tanto:
1. El DNI está en i - 2. Es decir, 6 - 2 = 4. Item[4] = Celda[2,1].
2. El Nombre está en i - 1. Es decir, 6 - 1 = 5. Item[5] = Celda[3,1]
3. El Apellido está en i. Es decir, 6. Item[6] = Celda[4,1]
4. La Ciudad está en i + 1. Es decir, 6 + 1 = 7. Item[7] = Celda[5,1]

Cuando en [1,2] tenemos el valor 14, entonces:
DNI: 14 - 2 = 12. Item[12] = Celda[2,2]
Nombre: 14 - 1 = 13. Item[13] = Celda[3,2]
Apellido: 14. Item[14] = Celda[4,2]
Ciudad: 14 + 1 = 15. Item[15] = Celda[5,2]

¿Se entiende? Tendrás que modificar un poco tus códigos pero se consigue tener referencia a que persona estramos cambiando la información.

kbaby, te he dicho que esto se trata de lógica. No pienses en código... deja que el código salga del análisis de la situación y de un planteo del problema.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita